【问题标题】:Collision and OOP in lualua中的碰撞和OOP
【发布时间】:2017-06-09 20:20:05
【问题描述】:

所以我使用基本的 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,因为它总是将其设置回正常重力,如果这有任何意义的话。

我该如何解决这个问题?

【问题讨论】:

    标签: oop lua love2d


    【解决方案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
    

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

    编辑

    考虑方向并将重力逻辑移入自己的方法中。

    【讨论】:

    • 但我是在播放器级别处理它(如果您的意思是在 player.lua 文件中)? love.update 位于一个完全不同的文件中,即 main.lua 文件。
    • 对不起,我的评论不是很清楚!我的意思是这不应该在每个单独的碰撞中处理。我将更新我的解决方案,因为我没有注意到碰撞方向很重要。
    • 太棒了!我重新更新了代码,将重力逻辑提取到自己的方法中,这是更好的面向对象设计。
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多