lua 中的碰撞和 OOP
Collision and OOP in lua
所以我使用基本的 OOP 在 love2D 中制作了一个基本的碰撞系统。
function love.update(dt)
player:update(dt)
for _, rect in pairs(randomRectangles) do
local collides,mtv,side = collider:collidesMTV(player,rect)
if collides then
print(side)
player:collide(collides,mtv,side)
end
end
end
mtv 是碰撞时移动零件的最小平移,边是它碰撞的那一侧。
问题是,我希望能够在 player:collide 函数中做到这一点,如下所示:
function player:collide(colliding,mtv,side)
if colliding==true and side=="top" or colliding==true and side == "bottom" then
self.Position=self.Position-mtv
end
if colliding==true and side=="left" or colliding==true and side == "right" then
self.Position=self.Position-mtv
self.Gravity=-0.1
end
if not colliding and self.Gravity ~= -0.95 then
self.Gravity=-0.95
end
end
我可以做到,当它没有碰撞时,它会将重力设置回正常状态,但是如果我在里面添加一个 elseif/else 语句,当它没有碰撞时,它也会在碰撞时这样做一个方块,因为屏幕上还有 30 个其他方块,并且不会将重力设置为 -0.1,因为它总是将其设置回正常重力,如果这有意义的话。
我该如何解决?
也许只是在 collide
方法之外提取碰撞行为?这是一个想法:
function player:collide(colliding,mtv,side)
if colliding==true and side=="top" or colliding==true and side == "bottom" then
self.Position=self.Position-mtv
end
if colliding==true and side=="left" or colliding==true and side == "right" then
self.Position=self.Position-mtv
self.hasSideCollision = true
end
end
function player:computeGravity()
if player.hasSideCollision then
self.Gravity = -0.1
else
self.Gravity = -0.95
end
end
function love.update(dt)
player:update(dt)
player.hasSideCollision = false
for _, rect in pairs(randomRectangles) do
local collides,mtv,side = collider:collidesMTV(player,rect)
if collides then
print(side)
player:collide(collides,mtv,side)
end
end
player:computeGravity()
end
处理重力应该在玩家级别处理,而不是单独的碰撞级别。
编辑
考虑了方向并将重力逻辑移动到它自己的方法中。
所以我使用基本的 OOP 在 love2D 中制作了一个基本的碰撞系统。
function love.update(dt)
player:update(dt)
for _, rect in pairs(randomRectangles) do
local collides,mtv,side = collider:collidesMTV(player,rect)
if collides then
print(side)
player:collide(collides,mtv,side)
end
end
end
mtv 是碰撞时移动零件的最小平移,边是它碰撞的那一侧。
问题是,我希望能够在 player:collide 函数中做到这一点,如下所示:
function player:collide(colliding,mtv,side)
if colliding==true and side=="top" or colliding==true and side == "bottom" then
self.Position=self.Position-mtv
end
if colliding==true and side=="left" or colliding==true and side == "right" then
self.Position=self.Position-mtv
self.Gravity=-0.1
end
if not colliding and self.Gravity ~= -0.95 then
self.Gravity=-0.95
end
end
我可以做到,当它没有碰撞时,它会将重力设置回正常状态,但是如果我在里面添加一个 elseif/else 语句,当它没有碰撞时,它也会在碰撞时这样做一个方块,因为屏幕上还有 30 个其他方块,并且不会将重力设置为 -0.1,因为它总是将其设置回正常重力,如果这有意义的话。
我该如何解决?
也许只是在 collide
方法之外提取碰撞行为?这是一个想法:
function player:collide(colliding,mtv,side)
if colliding==true and side=="top" or colliding==true and side == "bottom" then
self.Position=self.Position-mtv
end
if colliding==true and side=="left" or colliding==true and side == "right" then
self.Position=self.Position-mtv
self.hasSideCollision = true
end
end
function player:computeGravity()
if player.hasSideCollision then
self.Gravity = -0.1
else
self.Gravity = -0.95
end
end
function love.update(dt)
player:update(dt)
player.hasSideCollision = false
for _, rect in pairs(randomRectangles) do
local collides,mtv,side = collider:collidesMTV(player,rect)
if collides then
print(side)
player:collide(collides,mtv,side)
end
end
player:computeGravity()
end
处理重力应该在玩家级别处理,而不是单独的碰撞级别。
编辑
考虑了方向并将重力逻辑移动到它自己的方法中。