2012-03-31 48 views
1

閱讀了很多關於球物理學的知識後,請觀看一些示例和嘗試使用位圖製作彈球的幾天,我需要幫助。我使用簡單(易於使用)和快速性能物理AS3引擎的位圖http://coreyoneil.com/portfolio/index.php?project=5,但仍然無法解決以下問題:如果球移動太快而對象路徑太小,則不會有碰撞檢測(代碼只能完美工作與更大的物體或如果球移動較慢)。我不善於物理和數學。下面是功能代碼,這使得物理的球上的各幀速率(但也許它能夠更好地將其更改爲的setTimeout):Flash AS3 - 球物理學(快速移動和路徑上的小物體)

function showFrame(e:Event) // onEnterFrame 
    { 
     var collisions:Array = collisionlist.checkCollisions(); 
     if(collisions.length) // if collision 
     { 
      var collision:Object = collisions[0]; // get collision information 
      var angle:Number = collision.angle; // get collision angle 
      var overlap:int = collision.overlapping.length; // get collision overlap 
      var sin:Number = Math.sin(angle); 
      var cos:Number = Math.cos(angle); 
      var vx0:Number = vx * cos + vy * sin; 
      var vy0:Number = vy * cos - vx * sin; 
      vx0 = ((mass - immovable) * vx0)/(mass + immovable); // var immovable:Number=10000; var mass:Number=immovable*2; 
      vx = vx0 * cos - vy0 * sin; 
      vy = vy0 * cos + vx0 * sin; 
      vx -= cos * overlap/radius; // radius=Math.round(ball.width/2); 
      vy -= sin * overlap/radius; 
      vx += speed; // var speed:Number=0; 
     }   
     vy += gravity; // var gravity:Number=0.75; 
     vy *= friction; // var friction:Number=0.981; 
     vx *= friction; 
     ball.x += vx; 
     ball.y += vy; 
     //setTimeout(showFrame, 20); 
    } 

回答

0

您可以使用子步驟。

它很簡單,但工作很好,基本上你可以根據你想要的步數來劃分你的速度,然後有一個for循環來測試這些增量的衝突。

這是一個很好的例子/教程:http://www.samclifton.com/tutorials.php?tut=2

+0

非常有用。我應該把質量變成價值1,導致球有時會卡住(現在它反彈得更多)。我需要更好地測試它,但是現在的代碼現在可以在任何移動時與1個像素對象發生碰撞。我將發佈當前代碼更改與信貸。 – speedy 2012-04-01 07:18:07

+0

太棒了,唯一要記住的是,在爲一個遊戲世界(5至20個以上的對象)做這些之後,它可能需要一點點的表現。因此,如果您有10個碰撞對象,並且您需要5個步驟,則每幀將進行50次碰撞測試。 – 2012-04-02 01:23:58

0

耶這樣的問題可能是,你的計算允許它超越的地步當你提高速度時它會發生碰撞。所以你可以做的是增加幀率或者像你說的那樣用一個計時器在後臺執行這個邏輯並且允許幀率保持不變,然後降低你的速度或者重力或者你需要做的任何事情來讓它在合理的速度並且不允許部件跳過彼此。