2013-01-20 65 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