微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pygame:遇到多个 event.get() 调用的问题

如何解决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.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():
        #[...]

解决方法

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

因此,一些事件在主循环中获得,而其他事件在类中获得,并且您不知道特定事件从哪里获得 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() 第一帧(类将要求一个不存在的列表)。

,

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

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

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

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

class Singlebullet(object):

    def __init__(self):
        # [...]
    
    def shoot(self,event_list):
        if current_bullet_type == 'single':
            # [...]

            for e in event_list:
                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:
    #[...]

    event_list = pygame.event.get()
    for event in event_list:
        #[...]

    s1.shoot(event_list)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。