群众/僵尸群撞击

所以我正在试图用love2D重新制作我大约一年前制作的Flash游戏。我已经到了基本完成的阶段,因此我决定去修复一些东西。

第一件事是我在旋转的对象上使用了普通的AABB碰撞检测,有时子弹会穿过僵尸(我使用了Roblox中关于2D碰撞的教程修复了这个bug,很好奇,对吧?)

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

我使用的旋转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

我尝试了这个,但是它不起作用。

我该怎么办?

点赞
用户8322279
用户8322279

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

在推开僵尸方面,我会检查两个僵尸中心点之间的距离是否小于一个僵尸的整个宽度,如果是,则推开。

代码如下:

    local pushBack=50 -- 表示僵尸被推开的力度

    -- 遍历僵尸表两次
    for ia,zombiea in ipairs(main.zombies) do
      for ib,zombieb in ipairs(main.zombies) do

         -- 获取两个僵尸之间的距离
         local dx = zombiea.x - zombieb.x
         local dy = zombiea.y - zombieb.y
         local distance = math.sqrt(dx * dx + dy * dy)

         -- 判断两个僵尸是否相互接触
         if distance < zombiea.width then
            local angle=math.atan2((zombieb.y-zombiea.y),(zombieb.x-zombiea.x))

            -- 推开僵尸A
            zombiea.x = zombiea.x + math.cos(angle) * pushBack * dt
            zombiea.y = zombiea.y + math.sin(angle) * pushBack * dt

            -- 推开僵尸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 变量动态改变,这样它会显得更加平滑。

_同时_,我不知道你如何处理僵尸的移动,但希望这将对你有所帮助!

2017-07-18 00:51:34