一段时间后,重复按键事件挂起/停止触发

时间:2015-02-14 13:03:43

标签: pygame

考虑以下计划:

import pygame, sys
from pygame.locals import *

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

class Player(object):

    def __init__(self, world):
        self.x = 100
        self.y = 100
        self.size = 30
        self.world = world

    def draw(self, windowSurface):
        pos = (self.x, self.y, self.size, self.size)
        pygame.draw.rect(windowSurface, WHITE, pos)

    def moveUp(self):
        self.y -= 1
    def moveDown(self):
        self.y += 1
    def moveLeft(self):
        self.x -= 1
    def moveRight(self):
        self.x += 1

class OpenIsaac(object):

    def __init__(self):
        pygame.init()
        self.windowSurface = pygame.display.set_mode((500, 400), 0, 32)
        pygame.display.set_caption('OpenIsaac')
        pygame.key.set_repeat(1, 2)
        self.player = Player(self)
        self.objects = [self.player]

    def mainLoopStep(self):
        self.windowSurface.fill(BLACK)
        for object_ in self.objects:
            object_.draw(self.windowSurface)
        pygame.display.update()

    def doQuit(self):
        pygame.quit()
        sys.exit()

    def handleQuit(self, event):
        if event.type != QUIT:
            return
        self.doQuit()

    def handleKeyboard(self, event):
        if event.type != KEYDOWN:
            return
        if pygame.key.get_pressed()[K_ESCAPE]:
            self.doQuit()
        if pygame.key.get_pressed()[K_LEFT]:
            self.player.moveLeft()
        if pygame.key.get_pressed()[K_RIGHT]:
            self.player.moveRight()
        if pygame.key.get_pressed()[K_DOWN]:
            self.player.moveDown()
        if pygame.key.get_pressed()[K_UP]:
            self.player.moveUp()

    def run(self):
        while True:
            for event in pygame.event.get():
                self.handleQuit(event)
                self.handleKeyboard(event)
            self.mainLoopStep()
            pygame.event.pump()

if __name__ == '__main__':
    OpenIsaac().run()

当我按下一个或两个键一段时间移动角色时,角色会在某个时刻停止移动。我需要松开钥匙并再次按下以恢复运动。什么可能导致这种情况?

1 个答案:

答案 0 :(得分:0)

这是因为当Pygame收到一键按下时,它会根据代码移动精灵一次并且只移动一次。您需要找到一种方法让程序识别出按键被按下,并让程序保持精灵移动。一种方法是使用pygame.key.set_repeat。它看起来与此相似:

delay = 100
interval = 50
pygame.key.set_repeat(delay, interval)

delay是游戏在重复键之前“等待”的毫秒数。 interval是每个键事件之间的毫秒数。例如,我将delay设置为100.游戏将在重复键事件之前等待100毫秒。将interval设置为50将使每个键事件相隔50毫秒。

Python 2.x

将这三行放在while循环之前。这些行不应属于函数或函数。按住键将重复相应的事件,例如继续移动,跳跃等。

Python 3.x

我是新手,所以你可能必须通过Youtube或Pygame Docs找到它。遗憾!

delay设置为1将终止key.set_repeat。将其设置为100更高将没有任何效果,用户将不会注意到它。您的interval值也是如此。我希望它现在能帮到你!