2011-08-26 96 views
0

这是我现在使用的代码:快速碰撞检测算法

For Local i : Int = 0 To Entity.Entities.Count() - 1 
     For Local j : Int = 0 To Entity.Entities.Count() - 1 
      If j = i Or Not Entity(Entity.Entities.ValueAtIndex(i)).IsPhyicsEnabled Or Not Entity(Entity.Entities.ValueAtIndex(j)).IsPhyicsEnabled 
       Continue 
      EndIf 

      Local a : Entity = Entity(Entity.Entities.ValueAtIndex(i)); 
      Local b : Entity = Entity(Entity.Entities.ValueAtIndex(j)); 

      Local dist : Float = Sqr(((a.Position.X - b.Position.X)^2) + ((a.Position.Y - b.Position.Y)^2)) 

      If dist < Min(a.Radius, b.Radius) 
       a.Collide(b) 
      EndIf 
     Next 
    Next 

的麻烦,这就是循环。检查完成的方式太多了。有什么办法可以减少这种情况吗?

回答

1

试试这个:

For Local i : Int = 0 To Entity.Entities.Count() - 1 
    If Not Entity(Entity.Entities.ValueAtIndex(i)).IsPhyicsEnabled 
     Continue 
    EndIf 

    Local a : Entity = Entity(Entity.Entities.ValueAtIndex(i)); 
    Local aRadiusSquared = a.Radius^2 

    For Local j : Int = (i+1) To Entity.Entities.Count() - 1 
     If Not Entity(Entity.Entities.ValueAtIndex(j)).IsPhyicsEnabled 
      Continue 
     EndIf 

     Local b : Entity = Entity(Entity.Entities.ValueAtIndex(j)); 

     Local distSquared : Float = ((a.Position.X - b.Position.X)^2) + ((a.Position.Y - b.Position.Y)^2) 

     If distSquared < Min(aRadiusSquared, b.Radius^2) 
      a.Collide(b) 
     EndIf 
    Next 
Next 
0

强烈推荐“游戏物理引擎开发:如何使一个强大的商业级物理引擎为您的游戏”(长标题,但准确)。该网站和GitHub网页完全维护,AFAICT。说实话,这个代码比这本书好很多,至少就我所知。