Pygame.key.get_pressed - 如何添加间隔?
Pygame.key.get_pressed - how to add interval?
我制作了一个简单的网格和一个简单的 sprite,其工作方式为 "player"。但是当我使用方向键移动时,角色移动太快如下图所示:
我的问题是:如何在每次按键事件后设置延迟或间隔以防止出现此问题?
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
最简单的做法是记录您处理第一个事件的时间,然后再次抑制对该事件的处理,直到新时间至少比第一个事件大一些时间间隔。
一些代码可能会使这个更清楚:
# 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!"
有了这个,程序会跟踪密钥的使用情况,并且只会在经过一段时间后再次考虑它。
以上代码不会一字不差:您需要考虑可用的不同时间源并选择最适合您的。
您还应该考虑如何跟踪许多不同的上次使用时间:键的字典(默认字典在这里可能很有用,可以避免大量预先添加键)及其上次单击时间可能是值得使用
我制作了一个简单的网格和一个简单的 sprite,其工作方式为 "player"。但是当我使用方向键移动时,角色移动太快如下图所示:
我的问题是:如何在每次按键事件后设置延迟或间隔以防止出现此问题?
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
最简单的做法是记录您处理第一个事件的时间,然后再次抑制对该事件的处理,直到新时间至少比第一个事件大一些时间间隔。
一些代码可能会使这个更清楚:
# 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!"
有了这个,程序会跟踪密钥的使用情况,并且只会在经过一段时间后再次考虑它。
以上代码不会一字不差:您需要考虑可用的不同时间源并选择最适合您的。
您还应该考虑如何跟踪许多不同的上次使用时间:键的字典(默认字典在这里可能很有用,可以避免大量预先添加键)及其上次单击时间可能是值得使用