如何做基于瓦片的碰撞

时间:2014-03-29 16:45:03

标签: lua collision love2d tiling

我正在尝试制作一个简单的平台游戏,显然我需要瓦片碰撞。我到目前为止的代码问题是它首先移动角色,然后检查它是否与某些东西发生碰撞,但有时它认为它在错误的时间碰撞,这取决于我是否先检查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

1 个答案:

答案 0 :(得分:0)

  

local tileX = math.ceil(val / absoluteTileSize)
  local 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?

这将在您的绘图功能结束时进行,并在您的播放器当前所在的“平铺”中绘制一个红色框。