2017-04-19 267 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!" 

这样,程序跟踪使用的关键,一旦一定量的时间已经过去了再次只考虑它。

上述代码不会逐字运行:您需要考虑可用的不同时间源并选择最适合您的时间源。

你还应该考虑它是如何跟踪许多不同的最后使用时间的:一个字典(一个defaultdict在这里可能会有用,以避免大量的键的前置添加)和他们最后点击的时间可能是值得的使用。