2014-01-06 74 views
2

我正在實施一個簡單的基於磁貼的遊戲,其中包含基於時間的移動。基於時間的移動和碰撞檢測問題

我的代碼,負責運動和碰撞檢測是

private function onEnterFrame(event:Event):void 
{ 
    if (waiting && game.movingBreakers <= 0) 
     endLevel(); 

    var interval:int = getTimer() - oldTime; 
    oldTime += interval; 
    var totalBreakers:uint = breakers.length; 

    if (totalBreakers) 
    { 
     for each (var breaker:Breaker in breakers) 
     { 
      if (!breaker.moving) 
       continue; 

      switch (breaker.direction) 
      { 
       case TOP: 
        breaker.y -= SPEED * interval; 
       break; 

       case BOTTOM: 
        breaker.y += SPEED * interval; 
       break; 

       case LEFT: 
        breaker.x -= SPEED * interval; 
       break; 

       case RIGHT: 
        breaker.x += SPEED * interval; 
       break; 
      } 

      checkCollisions(breaker); 
     } 
    } 
} 

我最近面臨的是,對於一些無關緊要的原因,與遊戲,有我的電腦上了沉重的CPU負載問題。結果,遊戲畫面在晚些時候被更新,但是精靈(破壞者)基於時間在他們的移動中處於正確的位置。然而,由於最後兩幀之間的時間差異較大,精靈在另一個位置移動,所以一些碰撞失敗了。因此,我的問題是某人在基於時間的運動中如何解決碰撞檢測問題?

回答

1

在delta時間進行移動時,有幾種很好的解決方案。

1)最常見的方法之一是做「固定的時間步驟」。這基本上是一個實現,它會在受影響的對象上強制您的update()(或在此例中爲movement())僅在「時間步長」過後才運行。假設你有一個變量常量FIXED_STEP:int = 10,這個值代表10ms。如果您的增量時間(interval)已經過了10ms或更長時間,您可以發出update(),但是很多次(經過時間/ FIXED_STEP)和任何剩餘時間會被添加到下一個經過時間值。

一個例子就是說你的增量時間是45ms,所以你將運行update() 4次,並在你的下一個增量時間加5。

這將允許您的碰撞仍然被檢測到。這裏是一個C#的解釋,我想解釋它很好也:Fixed Time Step C# XNA

2)你可以做的另一種方法是計算你移動的距離幀之間的對象,然後細分的距離,營造動感的步驟。即 - 你的對象(一個40x40矩形)在A點將移動到B點,在X軸上的距離是200px,你移動你的對象200/object.width(這是40)= 5,所以你會打電話給你movement() 5次,並移動40px的對象寬度。這將覆蓋移動區域,並且可以在任何移動更新中檢測到碰撞。

還有其他的方法可以做到這一點,但可能不會因爲性能的原因。光線投射和在物體的給定路徑上找到交點是非常準確的,但性能密集,需要一點挖掘來學習和實施。

我也讀過一些從update()之前的原點創建一個新的對象,然後用它來做檢測。即 - 點(0,0)處的對象A在下一幀之後移動到(200,0),您將創建一個從(0,0)到(200 + object.width,0 + object.height)的區域並運​​行改爲對該對象進行碰撞測試。

無論如何,我希望這有助於,祝你好運!

0

您應該爲AS3使用CollisionTestKit庫。