2017-04-23 14 views
-1

파이 게임 (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

후하시기 바랍니다 [여전히 오류가 발생 최소한의 예를 우리는 단지 붙여 넣기하고 실행을 복사 할 수 (:

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()입니다 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()의 두 함수를 하나로 병합합니다. 왜 둘 다 가질 수 있는지 이해할 수 없습니다.

위의 코드는 dx와 dy를 다루는 코드입니다. 함수가있는 클래스가 있으므로,이 함수를 호출하기 전에 설정할 수있는 self.dx self.dy에 직접 액세스 할 수 있으면 dx, dy를이 함수에 전달할 수 있습니다.

그것을 이런 식으로 일을하지 왜 :

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 절이 필요할 것입니다). 'elf keys [pygame.K_w] :'키를 [pygame.K_w] :'로 변경하면 질문에서 언급 한 잘못된 행동이 설명되지 않습니다. – skrx

+0

또한 답을하기 전에 질문자가 최소한의 완전하고 입증 가능한 예를 제공 할 때까지 기다리십시오. 넌 그냥 추측이야. 문제의 코드가 의미 있고 정확한 답을 줄만큼 충분하지 않습니다. – skrx