2010-01-04 85 views
0

我正在創建乒乓球比賽。而且我想創建基於對槳的影響來控制球的方向的能力。如果球在vy = 4時下降, vx = 4;根據速度在碰撞基礎上更改球的方向

並且槳在vx = -5處向左移動;我希望球根據槳的移動速度稍微改變路線。它可能會降低碰撞時的球速vx,因此當它向上移動時會使球更加直線移動(靠近Y軸)。但在我進行瘋狂的試驗和錯誤旅程之前,我想知道是否有人知道答案或可能有任何消息來源。

我認爲可能這樣做的解決方案可能是測量槳的速度。我的問題是槳是由鼠標控制,並沒有一定的速度。我想弄清楚我如何測量我的鼠標在X軸上行進的速度。

我可能會創建一個計時器,每隔幾秒觸發一次以確定鼠標的位置和位置。圖中的差異,這將是速度

如果任何人有任何答案,那將是偉大的。謝謝

回答

1

測量槳葉速度的最簡單方法是在前一幀中保持槳葉位置的高速緩存,因此通過使x-xPrev具有該幀的槳葉運動的增量,或者相對速度。

從這個速度,你可以將它作爲一個修飾符(可能縮小)添加到球的反射向量的x速度。

現在這聽起來像一個簡單的遊戲,幀率不應該是一個問題。但是,如果你想跟蹤速度,可以通過訪問前一幀的總時間來進行簡單的物理計算。允許時間一致的行爲,獨立於模擬的幀率。

+0

如果出現這種情況太顛簸,你可以記錄的X值幾個以前幀和平均/過濾它們以提供更平滑的效果。 – CookieOfFortune 2010-01-04 18:14:31

+0

我將不得不考慮這一點。是的,我想我會設置一個計時器,將發射一個事件這麼多x毫秒來記錄距離。我很好奇知道那裏是否有任何吸引人的公式。如果沒有,我可能會用我的鼠標的速度,只是減去球的vx。 – numerical25 2010-01-04 18:17:39

+0

爲了擴大CookieOfFortune的說法,數字濾波器可能是平滑它的最簡單方法。這裏有一個簡單的低通濾波器:v = f * input +(1-f)* v。f在0和1之間.f的值越大,濾波越少。 – 2010-01-04 19:29:35

0

K,我想出解決方案。儘管如此,仍然需要處理我的碰撞檢測。不是最偉大的。我的球有時會卡在槳中。我正在使用Flash對象命中測試。但無論如何。這是我用來讓它達到我想要的程度的代碼。似乎它支持它有時會走向的方向,有時它不會。

它的作品,但問題是我敲我的速度在負面,所以有時方向是關閉的。因爲球的移動方向取決於-1或1.如果我敲我的速度在負面。它可能會導致一個數字與它所假設的相反。

下面是槳類

public var cspeed:Number; 
     private var timer:Timer; 
     public var vx:Number = 0; 
     public var vy:Number = 0; 
     private var prevx:Number = 0; 
     private var prevy:Number = 0; 

     public function Paddle():void 
     { 
      timer = new Timer(60); 
      timer.start(); 
      timer.addEventListener(TimerEvent.TIMER,checkSpeed); 
     } 


     private function checkSpeed(e:TimerEvent):void 
     { 
      if(prevx == 0) 
      { 
       prevx = x; 
      } 
      else 
      { 
       cspeed = x - prevx; 
       prevx = 0; 
      } 
     } 

我檢查我的球類中的碰撞。因爲它是一切的一擊。下面是代碼

以下是我的球類。在檢查牆類中檢查它是否碰到牆壁或槳。我把槳的參考傳遞給了球類。

private function checkWalls():void 
     { 

      if(y > sRef.stageHeight || y < 0) 
      { 
       yDir = yDir * -1; 
      } 
      else if (x > sRef.stageWidth || x < 0) 
      { 
       xDir = xDir * -1; 
      } 
      //trace(dist); 
      /*var dx:Number = paddle.x - x; 
      var dy:Number = paddle.y - y; 
      var dist:Number = Math.sqrt(dx * dx + dy * dy);*/ 


      if(hitTestObject(paddle)) 
      { 
       xspeed = (paddle.cspeed/100) + xspeed; 
       yDir = yDir * -1; 
      } 
      //trace(paddle.cspeed); 
     } 

     private function moveBall():void 
     { 

      x += xspeed * xDir; 
      y += yspeed * yDir; 
     } 

我仍然需要閃爍ALOT。但如果我工作。我想我可以讓它做我想做的事。

+0

一個簡單的解決方案是,當檢測到一個命中時,在改變你需要的屬性(速度,方向等等)後,恢復到以前的位置(當它還沒有擊中時),然後移動球。 – Cay 2010-01-04 19:13:27

+0

我有點明白你在說什麼。你可以把它放在psuedo? – numerical25 2010-01-04 21:17:28

0

我能夠解決這個問題。我在互聯網上發現要做到以下幾點,物理看起來更好。球還是被卡住,不時槳內

改變從

xspeed = xspeed + (paddle.cspeed/10); 

以下到

xspeed = xspeed + (paddle.cspeed * .4);