0

シンプルなプラットフォーム ゲームを作成しようとしていますが、明らかにタイルの衝突が必要で​​す。私がこれまでに持っているコードの問題は、最初にキャラクターを動かしてから、何かと衝突しているかどうかを確認することですが、最初に x 軸の衝突を確認するかどうかによっては、間違ったタイミングで衝突すると考えることがあります。またはy軸が最初です。私はこれについて間違った方法で進んでいますか?ここにいくつかのコードがあります。

function checkCollision(val, axis, oldPos)
    if axis == "x" and char.tX then
        local tileX = math.ceil(val/absoluteTileSize)
        local tileY = math.floor(oldPos/absoluteTileSize)

        local tl, tr, bl ,br = getTouchingTiles(tileX, tileY)
        local isOnFlatSurface = math.abs(oldPos/absoluteTileSize-tileY) <= .00001--might not be a good i

        if isOnFlatSurface then
            if tr.canCollide then
                char.tX = nil
                char.x = tileX * absoluteTileSize - absoluteTileSize
            end
        else
            if br.canCollide then
                char.tX = nil
                char.x = tileX * absoluteTileSize - absoluteTileSize
            end
        end
    elseif axis == "y" then
        local tileX = math.ceil(oldPos/absoluteTileSize)
        local tileY = math.floor(val/absoluteTileSize)

        local tl, tr, bl ,br = getTouchingTiles(tileX, tileY)

        if bl.canCollide or br.canCollide then
            char.tY = nil
            char.y = tileY * absoluteTileSize --// - absoluteTileSize
            --/////////////idk why i don't need to subtract that but it works
        elseif not char.tY then--start falling if walk off something
            char.tY = love.timer.getTime()
            char.yi = char.y
            char.vyi = 0
        end
    end
end
4

1 に答える 1

0

ローカル tileX = math.ceil(val/absoluteTileSize)
ローカル tileY = math.floor(oldPos/absoluteTileSize)

x の値に math.ceil を使用し、y の値に math.floor を使用するのは奇妙に思えます。これが、奇妙な出来事が発生する理由かもしれません。あなたに役立つかもしれないこの小さなデバッグトリックをお勧めします:

-- Since you are using LÖVE, this is what you would use:
love.graphics.setColor( 255, 0, 0, 255 )
love.graphics.rectangle( 'line', ( tileX - 1 ) * absoluteTileSize, ( tileY - 1 ) * absoluteTileSize, absoluteTileSize, absoluteTileSize )
-- assuming absoluteTileSize represents the width/height of the tiles?

これは描画関数の最後にあり、プレイヤーが現在内部にいる「タイル」に赤いボックスを描画します。

于 2014-06-02T02:00:51.777 に答える