PythonCrashCourse外来入侵船动

问题描述

我的代码问题是船的运动很奇怪。有时,当我按向左或向右箭头键时,它的移动方向不正确。或者,船根本不动。在这个项目中,我具有模块Alien.py,alien_invasion.py,bullet.py,button.py,gamefunctions.py,game_stats.py,scoreboard.py,settings.py和ship.py。但是,我只会提供最相关的内容

ship.py:

    import pygame
    class Ship():
         def __init__(self,screen,ai_settings):
              self.screen = screen
              self.ai_settings = ai_settings
              self.image = pygame.image.load('images/spaceship.png')
              self.rect = self.image.get_rect()
              self.screen_rect = screen.get_rect()
              self.rect.centerx = self.screen_rect.centerx
              self.rect.bottom = self.screen_rect.bottom
              self.center = float(self.rect.centerx)
              self.moving_right = False
              self.moving_left = False

          def update(self):
              if self.moving_right and self.rect.right < self.screen_rect.right:
                  self.center += self.ai_settings.ship_speed_factor
              if self.moving_left and self.rect.left > 0:
                  self.center -= self.ai_settings.ship_speed_factor
                  self.rect.centerx = self.center

          def blitme(self):
               self.screen.blit(self.image,self.rect)

          def center_ship(self):
              self.center = self.screen_rect.centerx 

game_functions.py:

    import sys
    import pygame
    from bullet import Bullet
    from alien import Alien
    from time import sleep
         def check_keydown_events(event,ai_settings,ship,bullets):
              if event.key == pygame.K_RIGHT:
                   ship.moving_right = True
              elif event.key == pygame.K_LEFT:
                   ship.moving_left = True
              elif event.key == pygame.K_SPACE:
                   fire_bullet(ai_settings,bullets)
              
         def check_keyup_events(event,ship):
               if event.key == pygame.K_RIGHT:
                    ship.moving_right = False
               elif event.key == pygame.K_LEFT:
                    ship.moving_left = False

          def check_events(ai_settings,stats,play_button,aliens,bullets):
               for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                         sys.exit()
                    elif event.type == pygame.KEYDOWN:
                         check_keydown_events(event,bullets)
                    elif event.type == pygame.KEYUP:
                         check_keyup_events(event,ship)

alien_invasion.py:

    import sys
    import pygame
    import game_functions as gf
    from settings import Settings
    from ship import Ship
    from pygame.sprite import Group

    def run_game():
         pygame.init()
         ai_settings = Settings()
         screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
         screen = pygame.display.set_mode((1200,650))
         pygame.display.set_caption("Alien Invasion")
         while True:
             gf.check_events(ai_settings,bullets)
             if stats.game_active:
                  ship.update()
                  gf.update_bullets(ai_settings,sb,bullets)
                  gf.update_aliens(ai_settings,bullets)
             gf.update_screen(ai_settings,bullets,play_button)
             for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                       sys.exit()
             screen.fill(ai_settings.bg_color)
             ship.blitme()
             screen.fill(bg_color)

      run_game()

解决方法

问题是由多次调用 pygame.event.get() 引起的。

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

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

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

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

def check_events(event_list,ai_settings,screen,stats,play_button,ship,aliens,bullets):
    
    for event in event_list:

        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            check_keydown_events(event,bullets)
        elif event.type == pygame.KEYUP:
            check_keyup_events(event,ship)
def run_game():
    # [...]

    while True:
    
        event_list = pygame.event.get()

        gf.check_events(event_list,bullets)
         
        # [...]
             
        for event in event_list :
            if event.type == pygame.QUIT:
                sys.exit()
       
        # [...]