【问题标题】:Crowd/zombie horde collision人群/僵尸部落碰撞
【发布时间】:2017-03-20 00:09:43
【问题描述】:

所以我正在尝试重新制作大约一年前制作的 Flash 游戏,但使用的是 love2D。我已经到了基本完成的地步,所以我决定去修复一些东西。

第一件事是我在旋转的物体上使用了普通的 AABB 碰撞检测,有时子弹会直接穿过僵尸(我使用 roblox 中的 2D 碰撞教程解决了这个问题,看图。)

接下来我想让僵尸在碰撞时“推开”而不是相互融合。

我用于旋转 2D 碰撞的教程还展示了如何在物体碰撞时将它们移开。

每个僵尸都存储在一个表中,然后我循环遍历这些表来处理它们(比如绘制、更新等。僵尸是通过另一个类创建的)

但由于它们在同一张桌子上,我不确定如何确保它们相互碰撞。

for izom,zom in ipairs(main.zombies) do
    zom:update(dt)
    doesCollide,mtv = collide(zom,zom)
    if collide(zom,zom) then
        zom.Position = zom.Position + Vector2.new(mtv.x, mtv.y);;
    end
end

我试过了,但是没用。

我该如何解决这个问题?

【问题讨论】:

  • good ol' 嵌套有什么问题? for i=2,#main.zombies do for j=1,i-1 do stuff with zombie[i] and zombie[j] end end

标签: lua collision-detection love2d


【解决方案1】:

我会像 Dimitry 所说的那样使用嵌套的 for 循环。

就推开而言,我会检查两个僵尸中心点之间的距离是否小于僵尸的全宽,如果是的话,推开。

看起来像这样

    local pushBack=50 --How hard they should push away from eachother

    --Loop through the zombies table twice
    for ia,zombiea in ipairs(main.zombies) do
      for ib,zombieb in ipairs(main.zombies) do

         --Get the distance between the two zombies
         local dx = zombiea.x - zombieb.x
         local dy = zombiea.y - zombieb.y
         distance = math.sqrt ( dx * dx + dy * dy )

         --If the zombies are touching
         if distance<zombiea.width then
            local angle=math.atan2((zombieb.y-zombiea.y),(zombieb.x-zombiea.x))

            --Push zombie A
            zombiea.x=zombiea.x+math.cos(angle)*pushBack*dt
            zombiea.y=zombiea.y+math.sin(angle)*pushBack*dt

            --Push zombie B
            zombiea.x=zombiea.x+math.cos(angle)*pushBack*dt
            zombiea.y=zombiea.y+math.sin(angle)*pushBack*dt

         end
      end
    end

您可能需要在最终距离计算中添加+ math.pi 以获得正确的方向。

distance = math.sqrt ( dx * dx + dy * dy ) + math.pi

此外,您可能希望 pushBack 变量根据它们的接近程度动态变化,以提供更平滑的感觉。

另外我不知道你是如何处理僵尸的移动的,但希望这仍然会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多