2016-02-23 37 views
2

当我运行该程序时,Player类的更新部分不起作用。它显示图片,但是当按下按键时,我无法将它向右或向左移动。它保持不动。我错过了什么?当按下按键时Pygame图像不移动

import pygame 
import random 
import os 

pygame.init() 
pygame.mixer.init() 

display_width = 460 
display_height = 600 
FPS = 30 

#colors 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

game_display = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption("Test") 
clock = pygame.time.Clock() 

img_dir = os.path.join(os.path.dirname(__file__), 'img') 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.transform.scale(player_img, (40,60)) 
     self.image.set_colorkey(black) 
     self.rect = self.image.get_rect() 
     self.rect.centerx = display_width/2 
     self.rect.bottom = display_height - 10 
     self.speedx = 0 

    def update(self): 
     self.speedx = 0 
     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_a or event.key == pygame.K_LEFT: 
        self.speedx = -7 
       if event.key == pygame.K_d or event.key == pygame.K_RIGHT: 
        self.speedx = 7 
        self.rect.x += self.speedx 



#image loading 
player_img = pygame.image.load(os.path.join(img_dir, "malirozi.png")).convert() 

all_sprites = pygame.sprite.Group() 
player = Player() 
all_sprites.add(player) 

#game loop 
running = True 
while running: 
    #Events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
    #Logic 
    all_sprites.update() 

    #Draw/render 
    game_display.fill(black) 
    all_sprites.draw(game_display) 
    #after drawing everything, flip the display 
    pygame.display.flip() 
    clock.tick(FPS) 

pygame.quit() 
quit() 
+1

我猜你的事件处理逻辑是不正确的。通常情况下,您应该只有一个调用'pygame.event.get()'的“顶级”循环,然后将事件传递给关心它们的对象。现在,我猜你的箭头按键被循环所吞噬,寻找'pygame.QUIT'。另外,也许你在'update()'函数后面的内容是检查并查看当前按下的键,而不是寻找关键的向上/向下事件。 –

回答

0

你的问题是你的事件处理是在两个不同的地方,pygame一次只能运行一个事件处理程序。我从你的代码中假设你只希望你的家伙每次按下一次就移动7个像素。如果你想让他继续前进,就需要增加更多的

import pygame 
import random 
import os 

pygame.init() 
pygame.mixer.init() 

display_width = 460 
display_height = 600 
FPS = 30 

#colors 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

game_display = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption("Test") 
clock = pygame.time.Clock() 

img_dir = os.path.join(os.path.dirname(__file__), 'img') 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.transform.scale(player_img, (40,60)) 
     self.image.set_colorkey(black) 
     self.rect = self.image.get_rect() 
     self.rect.centerx = display_width/2 
     self.rect.bottom = display_height - 10 
     self.speedx = 0 


#image loading 
player_img = pygame.image.load("guy.png").convert() 

all_sprites = pygame.sprite.Group() 
player = Player() 
all_sprites.add(player) 

#game loop 
running = True 
while running: 
    #Events 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_a or event.key == pygame.K_LEFT: 
       player.speedx = -7 
      if event.key == pygame.K_d or event.key == pygame.K_RIGHT: 
       player.speedx = 7 
     player.rect.x += player.speedx 
    #Logic 
    all_sprites.update() 
    player.rect.centerx += player.speedx 
    print(player.speedx) 

    #Draw/render 
    game_display.fill(black) 
    all_sprites.draw(game_display) 
    #after drawing everything, flip the display 
    pygame.display.flip() 
    clock.tick(FPS) 

pygame.quit() 
quit() 
1

pygame.event.get调用消耗队列中的所有事件。 这意味着它应该做的INA一个地方 - 当你在主博伊德做 for event in pygame.event.get(): ,只是吼叫while循环,你吞下,可能你update方法内读取所有 ​​事件。

对此的补救措施是确保您只需在代码的一个点上拨打pygame.event.get即可。例如,您可以将未处理的事件附加到列表中,并将该列表作为参数传递给更新方法 - 在那里您检查这些事件,而不是再次调用pygame.event.get

此外,请注意行self.rect.x += self.speedx应该在if声明之外。

... 
class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     ... 
     self.events = [] 
    def update(self): 
     self.speedx = 0 
     for event in self.events: 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_a or event.key == pygame.K_LEFT: 
        self.speedx = -7 
       if event.key == pygame.K_d or event.key == pygame.K_RIGHT: 
        self.speedx = 7 
     self.rect.x += self.speedx 
... 
while running: 
    #Events 
    events = [] 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     else: 
      events.append(event) 
    player.events = events 
    #Logic 
    all_sprites.update() 
... 
pygame.quit() 
quit() 
+0

谢谢,发现这个最有用 –

+1

然后请考虑接受答案。 – jsbueno