2017-04-19 12 views
0

私はシンプルなグリッドと単純なスプライトを作っています。これは "プレーヤー"として機能します。Pygame.key.get_pressed - インターバルを追加する方法は?

enter image description here

と、私の質問は:私は移動するには、矢印キーを使用するときには下図に示すように、文字があまりにも速く移動し、私はこれを防ぐために、各キープレスイベントの後に遅延や間隔を設定するにはどうすればよい問題?

player.py

#!/usr/bin/python 
import os, sys, pygame, random 
from os import path 
from pt import WIDTH,HEIGHT 
from pygame.locals import * 

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

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.width = 64 
     self.height = 64 
     self.image = pygame.image.load(path.join(img_dir, "player.png")).convert_alpha() 
     self.image = pygame.transform.scale(self.image,(self.width, self.height)) 
     self.rect = self.image.get_rect() 
     self.speed = 64 
    # self.rect.x = 
    # self.rect.y = 

    def update(self): 
     keys = pygame.key.get_pressed() 

     if keys[pygame.K_LEFT] and self.rect.x > 0: 
      self.rect.x -= self.speed 
     elif keys[pygame.K_RIGHT] and self.rect.x < (WIDTH-self.width): 
      self.rect.x += self.speed 
     elif keys[pygame.K_UP] and self.rect.y > 0: 
      self.rect.y -= self.speed 
     elif keys[pygame.K_DOWN] and self.rect.y < (HEIGHT-self.height): 
      self.rect.y += self.speed 

答えて

1

最も簡単な方法は、あなたが最初のイベントを処理した時間を記録し、新しい時間は、少なくともいくつかの間隔になるまで再びイベントの処理を抑制することです最初のインスタンスよりも大きい。これにより

# In your setup set the initial time and interval 
lastTime = 0 
interval = 500 # 500 ms 
# [...] 
while True:  # Main event loop 
    keys = pygame.key.get_pressed() 
    if keys[pygame.K_LEFT] and (getCurrentMillis() > lastTime + interval): 
     lastTime = getCurrentMillis() # Save the new most-recent time 
     print "Handled a keypress!" 

、プログラムがキーの使用を追跡し、ある程度の時間が経過した後にのみ、再びそれを考慮:

いくつかのコードは、これを明確にすることがあります。

上記のコードは逐語的に機能しません。利用できるさまざまな時間ソースを検討し、最適なものを選ぶ必要があります。

また、キーの多くの先行追加を避けるために辞書(ここではデフォルトの辞書が便利かもしれない)と最後にクリックされた時間は価値があるかもしれないを使用して。

関連する問題