2013-01-20 37 views
0

我目前正在使用PyGame模块与Python进行游戏。我有两个班,一个游戏班和一个汽车班。游戏类有一个游戏循环方法,我通过不同的方法循环,​​其中一个是汽车类中的事件方法。当我运行该程序时,一切正常加载。但是,当我尝试移动对象时,键盘输入处理缓慢,并且当我将移动键发送给垃圾邮件时,某些输入根本无法识别。为什么我的游戏循环如此缓慢以处理输入?

我是如何构造游戏循环的根本错误?

游戏循环的方法去如下:

def game_loop(self):                  

    running = True 
    self.test_car = car() 

    while running: 

     pygame.display.set_caption("Project G") 
     self.event_handler() 
     self.screen.blit(self.background, (0,0)) 
     self.test_car.event_handler() 
     self.test_car.update() 
     pygame.display.flip() 

这是汽车类:

class car(game): 

    def __init__(self): 

     super(car, self).__init__() 
     self.init_x_pos = 100 
     self.init_y_pos = 100 
     self.x_speed = 0 
     self.y_speed = 0 
     self.load_img = load() 
     self.car_img = pygame.image.load(self.load_img.car_img) 

    def event_handler(self): 

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

      if event.type == KEYDOWN: 
       if event.key == K_DOWN: 
        self.y_speed += 1 
        print "DOWN" 
       elif event.key == K_UP: 
        self.y_speed -= 1 
        print "UP" 
       elif event.key == K_RIGHT: 
        self.x_speed += 1 
        print "RIGHT" 
       elif event.key == K_LEFT: 
        self.x_speed -= 1 
        print "LEFT" 

    def update(self): 

     self.screen.blit(self.car_img, (self.init_x_pos + self.x_speed, self.init_y_pos + self.y_speed))    
+0

可能相关:http://stackoverflow.com/questions/6348952/handling-keyboard-events-in-python – paddy

+0

@paddy:不。这个问题涉及pygame,它有一个访问键盘的标准方式。另一个问题涉及在终端中按下按键。 – icktoofay

回答

1

你或许应该只能有一个循环中调用pygame.event.get();取决于按键时代码的哪一部分正在执行,事件可以被路由到一个或另一个。如果某个人放弃了某些事件,而另一个人不放弃,那么无论何时第一个人获得该事件,它都将被忽略,而当第二个人获得该事件时,它会被正常处理。

+0

我已解决我的问题。我只是从游戏类中注释掉了event_handler方法。不过,我想问一问,你会如何建议我在游戏的不同状态下处理事件?例如,菜单中的事件处理,播放期间的事件处理等等。游戏循环中的简单if-elif结构是否足够?例如,如果state ==“menu”:运行相应的事件循环。 – reuwacm

+1

你应该看看状态机。他们帮助你做到这一点比实施巨大的if-else语句更容易。 – cemper93

+0

@Raymond:cemper93对状态机的建议很好。你可能也想看看其他一些游戏如何做。例如,虽然它使用Pyglet而不是pygame,但[spacegame](http://hg.codeflow.org/spacegame/file/tip)似乎以相当理智的方式处理状态。 – icktoofay