2011-05-27 24 views
2

我正在試圖在弧中拋出一個球,無論是向左還是向右。如何在弧線中擲球?

這裏是我的代碼:

var gravity = 2; 
this.velocity.y += gravity; 
       _angle = 5; 
       var theta:Number; 
       switch(_direction) { 
        case "left": 
         theta = _angle * Math.PI/180; 
         this.velocity.x = Math.cos(theta) - Math.sin(theta); 
        break; 

        case "right": 
         theta = _angle * Math.PI/180; 
         this.velocity.x = Math.cos(theta) - Math.sin(theta) 
        break; 
       } 

       this.x += this.velocity.x; 
       this.y += this.velocity.y; 

它並不真正的樣子球「飛弧」的說法,似乎更多的是對角線的?

+1

您需要添加一個重力常量,該重力常數將應用於您的速度值。此外,您只需在球最初投擲時設定一個角度。 – 2011-05-27 17:44:22

+0

嗨,我更新了我的代碼以反映這些建議,但它似乎仍然是直線移動(而不是曲線)? – redconservatory 2011-05-27 17:50:31

+0

另外,有沒有辦法讓它左「左」和右右「右」? – redconservatory 2011-05-27 17:50:49

回答

3

當你扔有兩個組件。

  1. 由於重力的魔力引起的垂直加速度。這將是唉。

  2. 水平分量:沒有空氣摩擦,這是一個恆定的速度。

比方說,你扔球,並在離開你的手它有一個速度v0 =(v0x,v0y),並在位置p0。那麼v0x將始終保持不變。

球的在時刻t的速度將是V(T)=(V0X,v0y + T * AY)

對於動畫的每個蜱,添加的DeltaT * V(t)的當前位置的球,你應該被設置。

每次球反彈,你應該反映其速度矢量它反彈的表面上和。減去其總能量(鄭伊健+ Epot的一定百分比,雖然Epot將爲0,如果它是在地面上和gound是零電位),以獲得對數反彈。

如果您還想要空氣摩擦,只需減去總能量的某個小的百分比與每個動畫節拍。

這裏有一些代碼,不在ActionScript中,但我希望可讀。 (在構造函數中的參數都是的Vector2D;克隆()隱式地使用,但你能猜出它做什麼):

class Vector2d: 
    def __init__ (x, y): 
     self.x = x 
     self.y = y 

    def add (other): 
     self.x += other.x 
     self.y += other.y 

    def mulScalar (scalar): 
     self.x *= scalar 
     self.y *= scalar 

    def mulVector (vector) # NOT the cross product 
     self.x *= vector.x 
     self.y *= vector.y 

class BouncingBall: 
    AGRAV = ? #gravitational acceleration (mg) 
    DELTAT = ? #time between ticks 
    ELASTICITY = ? Elasticity of ball/floor 

    def __init__ (self, pos, v): 
     self.pos = pos 
     self.v = v 

    def tick (self): 
     deltapos = self.v.clone() 
     deltapos.mulScalar (DELTAT) 
     self.pos.add (deltapos) 
     if self.pos.y <= 0: #bounce 
      self.pos.y = 0 #adjust ball to ground, you need to choose DELTAT small enough so nobody notices 
      self.v.mulVector (1, -1) #mirror on floor 
      self.v.mulScalar (ELASTICITY) 
     self.v.add (0, AGRAV * DELTAT) 
+0

也許你想要v0y - t * ay,除非ay已經爲負 – BlackBear 2011-05-27 17:49:41

+0

取決於他的軸指向哪裏。如果它位於y = 0的頂部,y = 100的底部,則建議增加正向加速度。最好讓加速度矢量指向指定的方向,總和將始終起作用。 – Hyperboreus 2011-05-27 17:52:58

+0

我認爲你的意思是說「2.水平分量:沒有空氣摩擦,這是一個常數」加速度的水平分量爲零,速度的水平分量是恆定的。 – phoog 2011-05-27 17:53:17

0

的公式爲(V =速度,t =時間流逝,X0,Y0 =座標啓動點):

x = x0 + Vt * cos(angle) 
y = y0 + Vt * sin(angle) - (g * t^2)/2 
          ------------- 
           ^
       this is gravity effect, without this 
        the trajectory would be a line 

你不需要左,右區分,對於一個方向V是肯定的,對於其他V是負的。

+0

我發現使用向量方程可以快速累積舍入誤差。分量向量方法效果更好。 – phoog 2011-05-27 17:56:36

0

有兩件事情:(免責聲明:我不熟悉的動作在所有,但我已經做了幾場比賽需要投擲弧)

首先,COS和罪惡都具有-1和1之間的邊界。通常x以像素爲單位繪製,所以將x改爲0.5並不會顯着改變。另外,由於x應該是一個整數,它甚至不會顯示。其次,計算這種類型物理所需的計算能力可能不是必要的 - 也許這是如果你正在做一個精確的物理模擬。

另外考慮Hyperboreus的第二個評論:水平通常是恆定的。因此,假設這是side-scroller-esque,你需要改變y分量而不是x。