当我尝试将精灵添加到屏幕时,PyGame滞后

问题描述

我正在尝试在PyGame中进行外星人入侵,当我type Tuple<T> = readonly T[] type TuplePick<T,K extends Tuple<keyof T>> = Pick<T,K[number]> // like Pick,but we pass a tuple of the keys type IfEqualThen<T,U,R> = T extends U ? (U extends T ? R : never) : never // 'R' if T and U are mutually assignable type AssertAllKeys<P,T extends Tuple<keyof P>> = IfEqualThen<P,TuplePick<P,T>,T> function assertKeys <P> () { return function <T extends Tuple<keyof P>> (value: AssertAllKeys<P,T>): T { return value } } interface Props { id: string; name: string; age: number; }; const keys1 = assertKeys<Props>()(['id','name'] as const) // Error,argument not assignable to never const keys2 = assertKeys<Props>()(['id','name','age'] as const) // Works 宇宙飞船和子弹时,一切工作都顺利进行,但是当我尝试从Sprite组中吸引外星人时,游戏突然停滞了。我已经尝试过使用blit函数,但是即使使用它仍然滞后。 主要:

convert()

外星人文件 这是存储外星人的外星人阶级。我已经将图像转换为 .bmp 文件,并且我也尝试使用 import sys import pygame from settings import Settings from ship import Ship from bullet import Bullet from alien import Alien class AlienInvasion: """Overall class to manage game assests and behavior""" def __init__(self): """Initialize the game and create resources""" pygame.init() self.settings = Settings() self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height)) pygame.display.set_caption("Alien Invasion") self.ship = Ship(self) self.bullets = pygame.sprite.Group() self.aliens = pygame.sprite.Group() def run_game(self): """Start the main loop for the game""" while True: clock.tick(60) self._check_events() self.ship.update() self._update_bullets() self._create_fleet() self._update_aliens() self._update_screen() def _check_events(self): #watch for keyboard and mouse events for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: self._check_keydown_events(event) elif event.type == pygame.KEYUP: self._check_keyup_events(event) def _check_keydown_events(self,event): """Respond to keypress""" if event.key == pygame.K_RIGHT: self.ship.moving_right = True elif event.key == pygame.K_LEFT: self.ship.moving_left = True elif event.key == pygame.K_UP: self.ship.moving_up = True elif event.key == pygame.K_DOWN: self.ship.moving_down = True elif event.key == pygame.K_q: sys.exit() elif event.key == pygame.K_SPACE: self._fire_bullet() self.ship.firing = True def _check_keyup_events(self,event): if event.key == pygame.K_RIGHT: self.ship.moving_right = False elif event.key == pygame.K_LEFT: self.ship.moving_left = False def _fire_bullet(self): if len(self.bullets) < self.settings.bullets_allowed: new_bullet = Bullet(self) self.bullets.add(new_bullet) def _update_bullets(self): self.bullets.update() #delete bullets for bullet in self.bullets.copy(): if bullet.rect.bottom <= 0: self.bullets.remove(bullet) def _update_aliens(self): """Update position of aliens""" self.aliens.update() def _create_fleet(self): alien = Alien(self) alien_width,alien_height = alien.rect.size available_space_x = self.settings.screen_width - (2 * alien_width) number_aliens_x = available_space_x // (2 * alien_width) #determine number of rows that fit on the screen ship_height = self.ship.rect.height available_space_y = self.settings.screen_height - (3*alien_height) - ship_height number_aliens_y = available_space_y // (2* alien_height) for row_number in range(number_aliens_y): for alien_number in range(number_aliens_x): self._create_alien(alien_number,row_number) def _create_alien(self,alien_number,row_number): """Create alien and place it in a row""" alien = Alien(self) alien_width,alien_height = alien.rect.size alien.x = alien_width + 2 * alien_width * alien_number alien.rect.y = alien_height + 2 * alien_width * row_number alien.rect.x = alien.x self.aliens.add(alien) def _update_screen(self): self.screen.fill(self.settings.bg_color) self.ship.blitme() for bullet in self.bullets.sprites(): bullet.draw_bullet() self._create_fleet() self.aliens.draw(self.screen) pygame.display.flip() if __name__ == '__main__': ai = AlienInvasion() ai.run_game( 函数,但是它仍然滞后。

convert()

解决方法

给我们的问题是,您无法在每帧中创建舰队。因此,新的外星人会在每帧中都添加到 Group 中,并且您绘制的外星人远远超出了必要。更糟糕的是,'images/alien.bmp'被加载到类Alien的构造函数中,因此必须在每一帧中加载多个图像:

class AlienInvasion:
   # [...]

   def _update_screen(self):
       # [...]

       self._create_fleet() # <----
       self.aliens.draw(self.screen) 

我建议在构造第一个外星人时将图像一次加载到类变量中:
(请参见Class and Instance Variables

class Alien(Sprite):
    
    alienimage = None

    """class that represents a single alien in a fleet"""
    def __init__(self,ai_game):
        # [...]

        #load alien image
        if self.alienimage == None:
            self.alienimage = pygame.image.load('images/alien.bmp').convert()
        self.image = self.alienimage

        # [...]

在主应用程序循环之前创建车队:

class AlienInvasion:
    # [...]
    
    def run_game(self):
        
        self._create_fleet() # <---- ADD

        """Start the main loop for the game"""
        while True:
            clock.tick(60)
            self._check_events()
            self.ship.update()
            self._update_bullets()
            # self._create_fleet() <---- DELETE
            self._update_aliens()
            self._update_screen()

    # [...]

    def _update_screen(self):
       # [...]

       # self._create_fleet() <---- DELETE
       self.aliens.draw(self.screen)