2014-01-13 3 views
0

Привет, я только начал с Pygame, хотя я немного использовал ActionScript. Я все еще новичок в кодировании в целом. Я пытаюсь заставить персонажа двигаться. Моя проблема в том, что когда я запускаю программу, она сразу перестает отвечать, поэтому я даже не знаю, в чем проблема. Вот мой код.Pygame: Почему мой код движения не работает?

import pygame, sys 
from pygame.locals import* 

pygame.init() 
DISPLAYSURF = pygame.display.set_mode((780, 500), 0, 32) 

FPS = 30 
fpsClock = pygame.time.Clock() 

sprite = pygame.image.load('CharacterFront.png') 
spritex = 50 
spritey = 50 
charLeft = False 
charRight = False 
charUp = False 
charDown = False 

while True: 

DISPLAYSURF.blit(sprite,(spritex,spritey)) 

for event in pygame.event.get(): 
    if event.type==QUIT: 
     pygame.quit() 
     sys.exit() 

    if event.type == KEYDOWN: 
     if (event.key == K_LEFT): 
      charLeft = True 
     elif (event.key == K_d): 
      charRight = True 
     elif (event.key == K_w): 
      charUp = True 
     elif (event.key == K_s): 
      charDown = True 
    if event.type == KEYUP: 
     if (event.key == K_LEFT): 
      charLeft = False 
     elif (event.key == K_d): 
      charRight = False 
     elif (event.key == K_w): 
      charUp = False 
     elif (event.key == K_s): 
      charDown = False 

while charLeft == True: 
    spritex -= 10 
    sprite=pygame.image.load('CharacterLeft.png') 
while charRight == True: 
    spritex += 10 
    sprite=pygame.image.load('CharacterRight.png') 
while charUp == True: 
    spritey -= 10 
    sprite=pygame.image.load('CharacterBack.png') 
while charDown == True: 
    spritey += 10 
    sprite=pygame.image.load('CharacterFront.png') 


pygame.display.update() 
fpsClock.tick(FPS) 

Я уже пробовал много различных способов сделать это, но ближе всего я был вызван персонаж, чтобы вставить снова и снова, и я должен был спам направления на самом деле двигаться более чем на 10 пикселей. Любые ответы будут оценены.

+2

пожалуйста исправить отступы, ваш код не работает – TankorSmash

ответ

1

Кроме того, что сказал jonrsharpe, вы не должны загружать спрайт каждый раз, когда делается нажатие клавиши. Вместо этого загрузите все свои изображения раньше и просто нажмите их, когда это необходимо.

Так что ваш код будет выглядеть следующим образом:

sprite_back = pygame.image.load('CharacterBack.png') 
sprite_front = pygame.image.load('CharacterFront.png') 
sprite_right = pygame.image.load('CharacterRight.png') 
sprite_left = pygame.image.load('CharacterLeft.png') 

sprite = sprite_front 

while True: 

    DISPLAYSURF.blit(sprite,(spritex,spritey)) 

    if charLeft == True: 
     spritex -= 10 
    elif charRight == True: 
     spritex += 10 
    elif charUp == True: 
     spritey -= 10 
    elif charDown == True: 
     spritey += 10 

    for event in pygame.event.get(): 
     if event.type==QUIT: 
      pygame.quit() 
      sys.exit() 

     if event.type == KEYDOWN: 
      if (event.key == K_LEFT): 
       charLeft = True 
       sprite=sprite_left 
      elif (event.key == K_d): 
       charRight = True 
       sprite=sprite_right 
      elif (event.key == K_w): 
       charUp = True 
       sprite=sprite_back 
      elif (event.key == K_s): 
       charDown = True 
       sprite=sprite_front 
     if event.type == KEYUP: 
      if (event.key == K_LEFT): 
       charLeft = False 
      elif (event.key == K_d): 
       charRight = False 
      elif (event.key == K_w): 
       charUp = False 
      elif (event.key == K_s): 
       charDown = False 
3

Ваши while char.. петли никогда не заканчиваются. Вы уже зацикливаете (while True: наверху). Просто сделайте один шаг (например, spritey -= 10) и позвольте внешнему циклу продолжать работать.

Для получения информации о том, как сохранить перемещение вашего персонажа во время удерживания ключа, см. this question.

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