2017-04-23 31 views
-1

我正在用pygame製作自上而下的益智遊戲,而且我的運動一直很奇怪。會發生什麼情況是,當我按下一個水平移動的按鍵並且一個按鍵立即垂直移動時,只有當它接觸水平表面時,角色纔會移動。這裏是我的運動和碰撞代碼:Pygame - 運動不一致

def move(self, dx, dy): 
    self.dx = dx 
    self.dy = dy 
    if self.dx != 0: 
     self.move_single_axis(self.dx, 0) 
    if self.dy != 0: 
     self.move_single_axis(0, self.dy) 

def move_single_axis(self, dx, dy): 
    self.dx = dx 
    self.dy = dy 
    self.rect.x += self.dx 
    self.rect.y += self.dy 
    for wall in walls: 
     if self.rect.colliderect(wall.rect): 
      if self.dx > 0: 
       self.rect.right = wall.rect.left 
      if self.dx < 0: 
       self.rect.left = wall.rect.right 
      if self.dy > 0: 
       self.rect.bottom = wall.rect.top 
      if self.dy < 0: 
       self.rect.top = wall.rect.bottom 

def checkMovement(self): 
    if self.paused == False: 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_d]: 
      self.move(5, 0) 
     elif keys[pygame.K_a]: 
      self.move(-5, 0) 
     elif keys[pygame.K_w]: 
      self.move(0, -5) 
     elif keys[pygame.K_s]: 
      self.move(0, 5) 

謝謝!

+0

請發表[仍可產生的誤差最小的例子,我們可以直接複製粘貼和運行( http://stackoverflow.com/help/mcve)。 – skrx

+0

問題是,我的程序非常非常大。 – Will6316

+0

如果你不提供mcve,你不可能得到幫助。沒有一個好例子,找到錯誤可能很困難,甚至是不可能的。從頭開始,只需添加一個簡單的while +事件循環,牆壁和玩家類以及移動代碼。 – skrx

回答

1

我可以看到以下問題:

def checkMovement(self): 
    if self.paused == False: 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_d]: 
      self.move(5, 0) 
     elif keys[pygame.K_a]: 
      self.move(-5, 0) 
     if keys[pygame.K_w]: # !!! CHANGE !!! 
      self.move(0, -5) 
     elif keys[pygame.K_s]: 
      self.move(0, 5) 

這能解決問題了嗎?

我也將兩個函數move_single_axis()和move()合併成一個。我不明白爲什麼兩者都有意義。

奇怪的是在你的代碼中你如何處理DX和DY。你有一個類,你的函數在那裏,那麼當你直接訪問self.dx self.dy時,你可以在調用這個函數之前設置哪個值,那麼當你將dx,dy傳遞給這些函數時,又該怎麼辦?

爲什麼不能做這種方式:

def checkMovement(self): 
    if self.paused == False: 
     keys = pygame.key.get_pressed() 
     if keys[pygame.K_d]: 
      self.dx = 5 
     elif keys[pygame.K_a]: 
      self.dx = -5 
     if keys[pygame.K_w]: 
      self.dy = -5 
     elif keys[pygame.K_s]: 
      self.dy = 5 
     move() 

其中move()是:

def move(self): 
    self.rect.x += self.dx 
    self.rect.y += self.dy 
    for wall in walls: 
     if self.rect.colliderect(wall.rect): 
      if self.dx > 0: 
       self.rect.right = wall.rect.left 
      if self.dx < 0: 
       self.rect.left = wall.rect.right 
      if self.dy > 0: 
       self.rect.bottom = wall.rect.top 
      if self.dy < 0: 
       self.rect.top = wall.rect.bottom 
+0

這個答案有各種各樣的問題。這些方法不應該被合併,否則當玩家觸摸牆壁並向兩個方向移動時會產生不正確的行爲。您首先必須水平移動他並檢查碰撞,然後垂直並再次檢查碰撞,否則您不知道球員碰撞的哪一邊。接下來的問題是,一旦你按下按鈕,玩家會繼續移動(需要兩個'else'子句)。改變'elif鍵[pygame.K_w]:'如果鍵[pygame.K_w]:'不能解釋問題中提到的錯誤行爲。 – skrx

+0

此外,請等到提問者在回答之前提供最小化,完整且可驗證的示例。你只是在猜測。問題中的代碼不夠完整,無法給出有意義的正確答案。 – skrx