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)

将 math.ceil 用于 x 值,将 math.floor 用于 y 似乎很奇怪。这可能就是您遇到一些奇怪事件的原因。我会推荐这个可以帮助你的小调试技巧:

-- 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 回答