2013-02-20 48 views
0

我正在嘗試將2D物理運用到小行星類型的遊戲中。我在窗口邊界設置了碰撞邊界。然而,當我將我的船體精靈碰撞到一個邊界(並且爲x或y軸反轉適當的速度)時,我在移動時偶爾會出現一個小故障。船會暫時跳起來,但如果我將移動鍵保持足夠長的時間,它通常會自行修復。關於運動的2D雪碧物理

問題是這個毛刺是顯而易見的。

相關代碼段:

#update velocity 
def velocity(self, speed): 
    self.vx += math.sin(math.radians(self.angle)) * speed 
    self.vy += math.cos(math.radians(self.angle)) * speed 

    magnitude = math.sqrt(self.vx*self.vx + self.vy*self.vy) 
    if magnitude > self.maxvel: 
     self.vx *= 4/magnitude 
     self.vy *= 4/magnitude 
    if self.speed >= self.maxvel: 
     self.speed = self.maxvel 
    if self.speed <= -self.maxvel: 
     self.speed = -self.maxvel 

我的移動代碼:

if (key[K_UP]): 
    newShip.speed += 1 
    newShip.moving = 1 

if (key[K_DOWN]): 
    newShip.speed -= 1 
    newShip.moving = 1 

if (key[K_LEFT]): 
    newShip.angle += 4 

if (key[K_RIGHT]): 
    newShip.angle -= 4 

我完整的代碼是在這裏:http://pastebin.com/19rHq97R要運行只有2個要求,你真的可以用任何東西我猜圖像。

我認爲這個問題與檢測碰撞時x或y速度的逆轉有關,但我不能確定確切的問題。任何見解都會被讚賞。

編輯:我做了一些更多的調查。我不知道突然跳躍是因爲我沒有任何類型的加速編程。我的終端日誌中摘錄了http://pastebin.com/vFy9tjyN節選。我打印出我的程序中的相關變量。

+0

您是否使用固定時間步?否則,時間步跳可能會導致不穩定。意思是如果它穿透邊界,它可以移動800個單位,而下一個框架只移動600個。在已經進入後,使它碰撞。所以交換會導致它停留並反彈。 – ninMonkey 2013-02-20 23:49:04

+0

@monkey我甚至沒有考慮到時間步驟。我並不完全相信它與碰撞本身有關,因爲船可能發生碰撞,行駛一段時間,然後當施加「推力」時,問題仍然存在。 – KNova 2013-02-21 01:27:20

+0

可能不相關,但cos是x,正弦是y。 – ninMonkey 2013-02-22 01:49:56

回答

0

試試這個:

DirDict = { "left" : (-speed, 0) , "right" :    (speed, 0), "up" : (0, -speed), "left" : (0,    speed) } 

If w: 
    Direction = DirDict["left"] 

//etcetera 

我認爲這將是一個更穩定的;它一直爲我工作。

+0

藉口格式,在我的手機上回答 – 2014-09-09 00:59:26