box2d - 计算某种“分组”在一起的对象

时间:2013-10-25 19:10:10

标签: lua box2d corona game-physics

在基于物理的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阶段,我可以将其从组中删除。

但这会产生一些(我认为相当沉重的)计算,因为当较大的群体被一个球分成几个较小的群体时会离开它......

有没有更好的解决方案来执行此操作?喜欢 - 得到一个“链式”对象列表,或者至少得到每个物理对象的碰撞器列表?

1 个答案:

答案 0 :(得分:1)

不幸的是,当两个球分开时,我认为你不能避免某种图形遍历检查,以确定该分离是否导致该组成为两组,或者该组是否保持完整,因为其他部分仍然存在接触。

关于获取链接对象列表,原始Box2D(C ++)有一个函数b2Body :: GetContactList(),它为您提供当前联系的所有其他实体的列表。您可以将其用于图遍历检查,而不是自己跟踪连接信息。我不知道Corona是否会为你曝光...

如果您能够使用它,请记住它会为您提供所有联系人的身体,因此您需要再次检查颜色是否在您遍历时匹配。您还应该检查IsTouching()对于联系人是否为真,因为在Box2D中,联系人的存在只意味着两个灯具的AABB重叠。

如果该功能不可用,我猜您需要使用开始/结束联系事件自行维护连接图。

我在这里假设某种类型的match-x或PuyoPuyo类型的游戏,在这种情况下我怀疑所涉及的球的数量会导致处理太重。如果你有数百个球,是的,那可能会变慢。