Crowd/zombie部落冲突
Crowd/zombie horde collision
所以我正在尝试重新制作大约一年前在 love2D 中制作的 flash 游戏。我已经到了基本完成的地步,所以我决定去修复一些东西。
第一件事是我在旋转物体上使用普通的 AABB 碰撞检测,有时子弹会直接穿过僵尸(我使用 roblox 中的 2D 碰撞教程解决了这个问题,请看图。)
接下来我想让僵尸在碰撞时 "push away" 彼此分开,而不是合并成彼此。
我用于旋转 2D 碰撞的教程还展示了如何在碰撞时使物体远离彼此。
每个僵尸都存储在 table 中,然后我循环遍历 table 来处理它们(比如绘制它们、更新等。僵尸是通过另一个 [=29] 创建的=])
但由于它们在同一个 table 中,我不太确定如何确保它们相互碰撞。
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
我试过了,但是不行。
我该如何解决这个问题?
我会像 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
变量根据它们的接近程度动态变化,以提供更平滑的感觉。
另外我不知道你是如何处理僵尸的移动的,但希望这仍然对你有所帮助!
所以我正在尝试重新制作大约一年前在 love2D 中制作的 flash 游戏。我已经到了基本完成的地步,所以我决定去修复一些东西。
第一件事是我在旋转物体上使用普通的 AABB 碰撞检测,有时子弹会直接穿过僵尸(我使用 roblox 中的 2D 碰撞教程解决了这个问题,请看图。)
接下来我想让僵尸在碰撞时 "push away" 彼此分开,而不是合并成彼此。
我用于旋转 2D 碰撞的教程还展示了如何在碰撞时使物体远离彼此。
每个僵尸都存储在 table 中,然后我循环遍历 table 来处理它们(比如绘制它们、更新等。僵尸是通过另一个 [=29] 创建的=])
但由于它们在同一个 table 中,我不太确定如何确保它们相互碰撞。
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
我试过了,但是不行。
我该如何解决这个问题?
我会像 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
变量根据它们的接近程度动态变化,以提供更平滑的感觉。
另外我不知道你是如何处理僵尸的移动的,但希望这仍然对你有所帮助!