2014-01-06 4 views
1

Я хочу, чтобы мой персонаж двигался вверх/влево/вниз/вправо, когда я нажимаю w/a/s/d. То, что я думаю, что должно происходить в том, что, например, когда я нажимаю D:Почему персонаж моего персонажа не будет двигаться?

  1. main() будет «видеть», что это событие происходит

  2. видеть, что я нажал клавишу вниз

  3. пойти player1.move()

  4. видеть, что ключ был d

  5. перейти к Character.move_right(self)

  6. обновление x_pos и x_vel

  7. вернуться к main()

  8. пойти player1.display()

  9. нарисовать прямоугольник везде, где обновленный x_pos и x_vel являются

  10. обновить экран

  11. "тик часы"

Это, очевидно, не происходит, хотя. Где я неправильно истолковываю то, что происходит?

import sys 
import pygame 


class Character(object): 
    def __init__(self, surface, x_vel, y_vel, x_pos, y_pos): 
     self.surface = surface 
     self.x_vel = x_vel 
     self.y_vel = y_vel 
     self.x_pos = x_pos 
     self.y_pos = y_pos 
     self.size = (5, 20) 

    def move_right(self): 
     self.x_vel += 5 
     self.x_pos += self.x_vel 

    def move_left(self): 
     self.x_vel -= 5 
     self.x_pos += self.x_vel 

    def move_up(self): 
     self.y_vel -= 5 
     self.y_pos += self.y_vel 

    def move_down(self): 
     self.y_vel += 5 
     self.y_pos += self.y_vel 

    def move(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_w: 
        Character.move_up(self) 
       elif event.key == pygame.K_a: 
        Character.move_left(self) 
       elif event.key == pygame.K_s: 
        Character.move_down(self) 
       elif event.key == pygame.K_d: 
        Character.move_right(self) 
     self.character = pygame.Rect((self.x_pos, self.y_pos), self.size) 

    def display(self): 
     pygame.draw.rect(self.surface, (255, 255, 255), self.character) 

pygame.init() 

screen = pygame.display.set_mode((640, 480)) 
screen_rect = screen.get_rect() 

clock = pygame.time.Clock() 

fps = 30 


def main(): 
    while True: 
     for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        sys.exit() 
       else: 
        player1 = Character(screen, 0, 0, 200, 200) 
        player1.move() 

     player1.display() 

     pygame.display.update(screen_rect) 
     clock.tick(fps) 

if __name__ == "__main__": 
    main() 
+0

Проблема, кажется, то, что события потребляются 'for' петли в' main ', поэтому в цикле 'for' в' move' не осталось событий. –

+3

Вы знаете, что для каждого события, отличного от QUIT, вы создаете новый символ и назначаете его игроку1. – Hyperboreus

ответ

5

Обобщая возможные ошибки:

Как @tobias_k отметил ваши события уже израсходованы. Это может быть исправлено, как этот

def move(self, event): 
    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_w: 
      .... 

def main(): 
    player1 = Character(screen, 0, 0, 200, 200) 
    while True: 
     for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        sys.exit() 
       else: 
        player1.move(event) 

Во-вторых, перемещения создания персонажа из основного цикла

def main(): 
    player1 = Character(screen, 0, 0, 200, 200) 
    while True: 
+0

Я бы изменил 'player1.move (event)' на 'player1.handle_event (event)' Поскольку, если он добавляет пространство для съемки чего-то, это больше не будет принадлежать методу перемещения. –

Смежные вопросы