【问题标题】:Pygame.key.get_pressed - how to add interval?Pygame.key.get_pressed - 如何添加间隔?
【发布时间】:2017-04-19 18:59:06
【问题描述】:

我制作了一个简单的网格和一个作为“播放器”工作的简单精灵。但是当我使用方向键移动时,角色移动得太快了,如下图所示:

我的问题是:如何在每次按键事件后设置延迟或间隔以防止出现此问题?

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

【问题讨论】:

    标签: python python-2.7 pygame delay key-events


    【解决方案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 在这里可能很有用,以避免大量预先添加键)键及其上次单击时间可能值得使用.

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2019-07-01
      • 2020-08-22
      • 2015-12-08
      • 2012-10-14
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多