在基于物理的CoronaSDK游戏中,我有很多颜色的球。他们都互相碰撞。但是我对那些按颜色组合在一起的球感兴趣。
因此,每个球都有一个“颜色”属性:例如ball.color = "red"
。
在碰撞监听器中,我检查球是否与具有相同颜色的球相撞:
local function ballCollision ( self, event )
local otherBall = event.other
if ( otherBall.color == self.color ) then
-- do some stuff here
if ( event.phase == "began" ) then
-- add the ball to the group
else
-- remove the ball from the group
end
end
end
ball.collision = ballCollision
ball:addEventListener ( "collision" )
现在,我正在考虑创建一个全局的,模块范围的“群组”表,在那里我可以保留一个分组球的表。对于碰撞的每个began
阶段,我可以添加一个碰撞到另一个碰撞者所属的组的球。
对于每个ended
阶段,我可以将其从组中删除。
但这会产生一些(我认为相当沉重的)计算,因为当较大的群体被一个球分成几个较小的群体时会离开它......
有没有更好的解决方案来执行此操作?喜欢 - 得到一个“链式”对象列表,或者至少得到每个物理对象的碰撞器列表?
答案 0 :(得分:1)
不幸的是,当两个球分开时,我认为你不能避免某种图形遍历检查,以确定该分离是否导致该组成为两组,或者该组是否保持完整,因为其他部分仍然存在接触。
关于获取链接对象列表,原始Box2D(C ++)有一个函数b2Body :: GetContactList(),它为您提供当前联系的所有其他实体的列表。您可以将其用于图遍历检查,而不是自己跟踪连接信息。我不知道Corona是否会为你曝光...
如果您能够使用它,请记住它会为您提供所有联系人的身体,因此您需要再次检查颜色是否在您遍历时匹配。您还应该检查IsTouching()对于联系人是否为真,因为在Box2D中,联系人的存在只意味着两个灯具的AABB重叠。
如果该功能不可用,我猜您需要使用开始/结束联系事件自行维护连接图。
我在这里假设某种类型的match-x或PuyoPuyo类型的游戏,在这种情况下我怀疑所涉及的球的数量会导致处理太重。如果你有数百个球,是的,那可能会变慢。