[英]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
處理重力應該在玩家級別上處理,而不是在單個碰撞級別上處理。
編輯
考慮了方向,並將重力邏輯移到了自己的方法中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.