0

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

但这提出了一些(我认为相当繁重)计算,因为当较大的群体被一个球分成几个较小的群体时......

有没有更好的解决方案来执行此操作?喜欢 - 获取“链接”对象的列表,或者至少获取每个物理对象的对撞机列表?

4

1 回答 1

1

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

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

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

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

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

于 2013-10-26T06:26:10.457 回答