Lua中的碰撞和OOP

所以我使用基础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是碰撞时移动部分所需的最小转换量,而side是碰撞时所在的边缘。

问题是,我希望能够在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,因为它总是将其设置回正常重力,如果这有任何意义,如何修复它?

点赞
用户20043
用户20043

也许可以将碰撞行为从 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 self.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

处理重力应该在玩家级别上进行处理,而不是单个碰撞。

2017-01-24 20:46:57