首先,我创建将生成并检查冲突的函数:
floors = {}
function makeFloor(x, y, w, h)
floor = {}
floor.x = x
floor.y = y
floor.w = w
floor.h = h
table.insert(floors, floor)
end
function checkCollision(x1,y1,w1,h1,x2,y2,w2,h2)
return x1 < x2+w2 and
x2 < x1+w1 and
y1 < y2+h2 and
y2 < y1+h1
end
然后我为要生成的每个平台(我知道的原始函数)调用makeFloor()函数,检查碰撞并绘制平台:
-- place platforms
makeFloor(750, 600, 300, 10)
makeFloor(20, 500, 700, 10)
--check collision
for i, f in ipairs(floors) do
if checkCollision(player.x,player.y,player.w,player.h,f.x,f.y,f.w,f.h) then
player.isGrounded = true
player.canJump = true
else player.isGrounded = false
player.canJump = false
end
end
end
function gameDraw()
for i, f in ipairs(floors) do
love.graphics.rectangle("fill", f.x, f.y, f.w, f.h)
end
end
冲突检查仅在最后一个平台上有效,有人可以解释一下我在这里看不到的逻辑吗?为什么它忽略第一个平台?它被覆盖吗?
答案 0 :(得分:0)
在冲突检查的.isGrounded
子句中为.canJump
和else
字段分配false时,您要擦除以前的冲突检查的结果。
不要在每次检查后分配false。而是在进入循环之前将这些字段初始化为false,并且仅在发现冲突时将true赋值。