'pygame.event.get()'的更快版本。为什么会错过活动,为什么活动会延迟?

Faster version of 'pygame.event.get()'. Why are events being missed and why are the events delayed?

提问人:S_Zizzle 提问时间:9/25/2019 最后编辑:Rabbid76S_Zizzle 更新时间:1/15/2021 访问量:1257

问:

我正在 pygame 中制作一个 Asteroidz 克隆,并有两个循环,一个用于检查退出请求,游戏是否应该通过按空格键开始,然后在游戏中进一步尝试限制玩家按住空格键并连续射击。我的函数的相关代码,每个循环运行一次,如下所示;for event in pygame.event.get()check_input

def check_input(self):
    for event in pygame.event.get(): #NOT CHECKING THIS FAST ENOUGH, WHOLE PROCESS IS TOO SLOW
        if (event.type == pygame.KEYUP) and (event.key == pygame.K_SPACE):
            print ('boop')
            self.shootThrottle = 0

    if self.shootThrottle == 0:
        self.shootThrottle += 1
        bullets.add(Bullet(self.shape[0][0],self.shape[0][1], self.angle))

    key = pygame.key.get_pressed()

    if key[pygame.K_LEFT]:
        self.angle -= 7
        self.rotate(-7)
    elif key[pygame.K_RIGHT]:
        self.angle += 7
        self.rotate(7)

    if self.angle > 360:
        self.angle -= 360
    elif self.angle < 0:
        self.angle += 360

    if key[pygame.K_UP]:
        self.accelerate()
    elif key[pygame.K_DOWN]:
        self.decelerate()

我正在尝试阻止子弹被击中,直到空格键被松开。这个系统可以工作,但由于速度太慢,它不能正常工作。shootThrottlefor event in pygame.event.get()

非常感谢任何帮助!

python-3.x 循环 pygame

评论


答:

6赞 Rabbid76 9/25/2019 #1

[...]并在循环中有两个 for 事件 [..]”pygame.event.get()

这就是问题所在。pygame.event.get() 获取所有消息并将它们从队列中删除。请参阅文档:

这将获取所有消息并将其从队列中删除。[...]

如果在多个事件循环中调用,则只有一个循环接收事件,但绝不是所有循环都接收所有事件。因此,某些事件似乎被遗漏了。pygame.event.get()

每帧获取一次事件,并在多个循环中使用它们,或者将列表或事件传递给处理它们的函数和方法:

def handle_events(events):
    for event in events:
        # [...]

while run:

    event_list = pygame.event.get()

    # [...]

    # 1st event loop
    for event in event_list:
        # [...]

    # [...]

    # 2nd event loop
    for event in event_list:
        # [...]

    # [...]

    # function which handles events
    handle_events(event_list)