Pygame.key.get_pressed - how to add interval?

我只是一个虾纸丫 提交于 2019-12-25 06:27:21

问题


I have made a simple grid and a simple sprite which works as "player". but when i use arrow keys to move, the character moves too fast as shown in the picture below:

and my question is: How do I set delay or Interval after each keypress event to prevent this problem?

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:


The simplest thing to do is record the time that you processed the first event, and then suppress handling of the event again until the new time is at least some interval greater than the first instance.

Some code may make this clearer:

# 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!"

With this, the program tracks the use of the key and only considers it again once some amount of time has passed.

The above code wont work verbatim: you need to consider the different time sources available to you and pick the one that suits you best.

You should also consider how it is you will track many different last used times: a dictionary (a defaultdict might be useful here to avoid lots of up-front adding of keys) of keys and their last clicked time might be worth using.



来源:https://stackoverflow.com/questions/43503995/pygame-key-get-pressed-how-to-add-interval

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!