我正在尝试制作一个简单的平台游戏,显然我需要瓦片碰撞。我到目前为止的代码问题是它首先移动角色,然后检查它是否与某些东西发生碰撞,但有时它认为它在错误的时间碰撞,这取决于我是否先检查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
答案 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?
这将在您的绘图功能结束时进行,并在您的播放器当前所在的“平铺”中绘制一个红色框。