2017-04-23 6 views
-1

パイガムでトップダウンのパズルゲームを作っています。動きが激しくなっています。何が起こるかは、水平に移動するキーと垂直に一度に移動するキーを押すと、文字が水平面に触れている場合にのみ移動します。ここに私の動きと衝突のコードがあります:パイガム - 動きが一貫していません

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を提供しないと助けを受けることはまずありません。良い例がなければ、エラーを見つけるのは難しいことも、不可能なこともあります。スクラッチから始まり、シンプルな+イベントループ、壁、プレーヤークラス、および移動コードを追加するだけです。 – 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()の2つの関数を1つにマージします。なぜ私は両方を持つことが理にかなっているのか分かりません。

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

この回答にはさまざまな問題があります。メソッドがマージされるべきではありません。そうでなければ、プレイヤーが壁に触れて2つの方向に移動するときに不正な動作をします。最初に彼を水平に動かして衝突をチェックし、次に垂直に衝突させて衝突を再度確認しなければなりません。そうしないと、プレーヤーが衝突した側がわからなくなります。次の問題は、一度ボタンを押すと、プレイヤーは移動し続けます(2つの 'else'節が必要です)。 'elf keys [pygame.K_w]:'を 'keys [pygame.K_w]:'に変更すると、質問に記載されている間違った動作が説明されません。 – skrx

+0

また、質問者が答える前に、質問者が最小限の、完全で妥当な例を提供するまで待ってください。あなたはちょうど推測している。問題のコードは、意味のある、正しい答えを出すのに十分ではありません。 – skrx

関連する問題