2012-12-02 95 views
1

我發現了一個解決方案,當您按住某個按鍵時,精靈會移動。問題在於它強制編寫難看的重複代碼。我發現的當前解決方案是:pygame - 按住按鈕

 for event in pygame.event.get(): 
      if event.type == KEYDOWN: 
       keystate = pygame.key.get_pressed() 
       while keystate[K_RIGHT]: 
        screen.fill((255,255,255)) 
        pygame.event.get() 

        for sprite in sprites: 
         rimage = sprite[1].getimage() 

         if sprite[2] is None: 
          x+=3 
          sprite[1].update(time) 
          screen.blit(rimage, (x,y)) 
          if sprite[1].isfinished() == True: 
           sprite[1].reset() 
          last_dir = "right" 
          if x >= screen_width - rimage.get_width(): 
           x = screen_width - rimage.get_width() 

        #update player sprite movement 
        #update player sprite animation 
        #update rest of game map 

        keystate = pygame.key.get_pressed() 
        time = pygame.time.get_ticks() 


        pygame.display.update() 

問題是,while keystate塊。必須對每個方向重複一次,並且遊戲世界需要在每個塊中更新。這是五個地方需要重複相同的代碼.... 4個方向加上,如果沒有按下一個鍵。我可以將它包裝在一個函數中,但我想知道是否有更好的方法來處理在pygame中按住按鈕。

回答

5

pygame中的常用方式是使用事件來更新方向,然後在事件之外寫入更新位置代碼,這樣你就不需要複製代碼。

clock = pygame.time.Clock() 

direction = (0,0) 

while True: # main loop 

    for event in pygame.event.get(): 

     if event.type == KEYDOWN: 
      if event.key == K_RIGHT: 
       direction = (3, 0) 
      elif event.key == K_LEFT: 
       direction = (-3, 0) 
      elif event.key == K_UP: 
       direction = (0, 3) 
      elif event.key == K_DOWN: 
       direction = (0, -3) 
      else: 
       print "Unrecognized key" 

     if event.type == KEYUP: 
      direction = (0, 0) 

    screen.fill((255,255,255)) 

    for sprite in sprites: 
     rimage = sprite[1].getimage() 

     if sprite[2] is None: 

      # Check if new position is inside the screen 
      new_pos = x + direction[0], y + direction[1] 
      if new_pos[0] + rimage.get_width() < screen_width: 
       x = new_pos[0] 
      if new_pos[1] + rimage.get_height() < screen_height: 
       y = new_pos[1] 

      # Draw the sprite 
      sprite[1].update(time) 
      screen.blit(rimage, (x,y)) 
      if sprite[1].isfinished() == True: 
       sprite[1].reset() 
       last_dir = direction 

    #update player sprite movement 
    #update player sprite animation 
    #update rest of game map 

    time = pygame.time.get_ticks() 

    pygame.display.update() 

    clock.tick(40) # Keep game running at 40 fps 

如果你願意,你可以實現與keystate一樣,在這種情況下,你不需要過程中的關鍵事件。

+1

您忘記了重置方向回到(0,0) –

+0

您是絕對正確的,已更新。 – pmoleri

+0

是的,但我認爲keystate是不同的,只是檢測到一個按鍵。我正在檢測按鈕被按下。這就是爲什麼在keystate時有一個循環:按住按鈕的同時記錄方向?我如何知道退出循環?循環是必要的嗎? –

1

Pygame的建議或暗示的程序劃分爲3個部分:

的事件處理,更新和繪圖。正如pmoleri已經說過的,你只需改變運動的方向即可。 在更新函數中,您應該傳入一個增量時間參數,以便根據傳遞的時間移動所有精靈。這是非常重要的,因爲其他技術不考慮處理器的可變速度。 DOS中的遊戲已經這樣做了,所以現在我們需要模擬器來人爲地減慢處理器速度。繪製部分只是繪製所有的精靈。

通過這種方式,您可以在遊戲中的這三個不同部分之間劃分清楚:玩家輸入,遊戲邏輯(移動,碰撞,動作等)和繪圖。

+0

如果你使用clock.tick(),你將不會遇到DOS問題。您可能遇到的問題是,如果程序運行速度慢,無法跟上您想要的FPS。無論哪種方式,德爾塔時間是一個很好的建議,所以你可以獨立地改變遊戲速度和FPS。遊戲邏輯/繪圖分離是另一個好建議,關於精靈的更多信息請參見:www.pygame.org/docs/ – pmoleri