首页 > 解决方案 > Pygame:多次调用 event.get() 时遇到问题

问题描述

我目前正在 Pygame 中制作飞机射击游戏。我已经创建了平面类,现在开始创建子弹类。但是,我遇到了一个我无法解决的问题:我真的需要在类内部和 while 循环(游戏的主 while 循环)中使用 pygame.event.get() 循环。因此,当我使用 2 个这样的循环时,游戏控件变得如此怪异和混乱,在我搜索这个问题后,我发现通常它必须只有 pygame.event.get() 上的一个循环。我不知道该怎么做,因为如果我将两个循环组合到位于 while 循环中的主要循环中,那么我将无法引用项目符号对象,因为它将在类之外。这是我的代码:

class Singlebullet(object):

    def __init__(self):
        self.img = pygame.image.load(r'C:\Users\me\Documents\MyGame\bullet.png')
        self.x = planeX + 71 
        self.y = planeY 
        self.state = 'ready'
        self.speed = 0
        self.firerate = 1000
    
    def shoot(self):
        if current_bullet_type == 'single':
            if self.state == 'ready':
                MyScrollingScreen.blit(self.img, (self.x, self.y))
            if self.state == 'fire':
                self.speed = -8
                self.y += bullet_speed
                MyScrollingScreen.blit(self.img, (self.x, self.y))
            if self.y < -20:
                self.state = 'ready'
            for e in pygame.event.get():
                if e.type == pygame.KEYDOWN or e.type == pygame.KEYUP:
                    if e.key == pygame.K_SPACE:
                        self.state = 'fire'
                        pygame.time.set_timer(pygame.USEREVENT+1, self.firerate)
                if e.type == pygame.USEREVENT+1:
                    self.state = 'ready'
s1 = Singlebullet()

while running:
    #[...]
    for event in pygame.event.get():
        #[...]

标签: pythonloopsooppygame

解决方案


pygame.event.get()从队列中移除事件(参见pygame 文档)。

所以,有些事件是在主循环中获取的,而其他事件是在类中获取的,并且您不知道特定事件是从哪里获取的 py pygame。所以你错过了一些事件。

为避免这种情况,请pygame.event.get()每帧调用一次,并对主循环和 使用相同的列表SingleBullet

class Singlebullet(object):
    
    def shoot(self):
        ...
        for e in events: # same events as in main loop

while running:
    events = pygame.event.get()
    for event in events:
        ...

[]如果您在调用后获得事件,请不要忘记将列表设置为第一帧Singlebullet.shoot()(该类将要求提供一个不存在的列表)。


推荐阅读