class GameScene(Scene): def __init__(self): super(GameScene, self).__init__() self.id = 2 self.sceneName = "game" self.spawnFactor = 0 self.speedFactor = 0 self.resetEnemy = False def initialize(self): print(f"Initializing the '{self.sceneName}' level...") # Loading resources (images, audio, etc.) before beginning scene Player.image = load_image("player.gif") Player.shootSound = load_sound("laser.ogg") Laser.image = load_image("laser.gif") Enemy.image = load_image("spider.gif") self.background = load_image("background2.gif").convert() # Initialize sprite group self.lasers = pygame.sprite.Group() self.aliens = pygame.sprite.Group() self.all = pygame.sprite.RenderUpdates() # Assign groups to sprites Laser.containers = self.lasers, self.all Enemy.containers = self.aliens, self.all Player.containers = self.all Score.containers = self.all Lives.containers = self.all self.player = Player() self.score = Score() self.lives = Lives(self.player.lives) self.all.add(self.score) self.all.add(self.lives) self.generate_enemies() def handle_events(self, event): keystate = pygame.key.get_pressed() # Player using LEFT & RIGHT ARROWS to move direction = keystate[pygame.K_RIGHT] - keystate[pygame.K_LEFT] self.player.set_direction(direction) # Player presses SPACE to shoot self.player.firing = keystate[pygame.K_SPACE] def render(self, screen): screen.blit(self.background, (0, 0)) self.all.clear(screen, self.background) self.all.update() self.all.draw(screen) def update(self): if self.player.alive(): self.player.move() # Prevent overfiring/spamming lasers over max limit if not self.player.reloading and self.player.firing and len( self.lasers) < const.MAX_SHOT: Laser(self.player.gunpos()) Player.shootSound.play() self.player.reloading = self.player.firing else: # Player has died (lost all lives) self.go_to_gameover() # Enemy (group) direction change check for e1 in self.aliens: # An enemy reaches the edge of the screen, # then change all enemy's direction if e1.changeDirection: for e2 in self.aliens: e2.go_down() break #===------------------- # Collision detection for alien in pygame.sprite.spritecollide(self.player, self.aliens, 1): self.resetEnemy = True self.player.died() self.lives.set_lives(self.player.lives) if self.player.lives <= 0: self.player.kill() break for alien in pygame.sprite.groupcollide(self.lasers, self.aliens, 1, 1).keys(): self.score.increment() #===------------------- # Reset position of enemies if self.resetEnemy: self.resetEnemy = False for e in self.aliens: e.reset_position() if len(self.aliens) == 0: if self.speedFactor < const.MAX_SPEED_FACTOR: self.speedFactor += 1 self.generate_enemies() pygame.display.update() def generate_enemies(self): rows = random.randrange(2, 5) cols = random.randrange(5, 11) speed = random.randrange(const.MIN_E_SPEED + self.speedFactor, const.MAX_E_SPEED + self.speedFactor) facing = random.choice((-1, 1)) count = 0 offset_x = offset_y = 16 x_pos = y_pos = 0 for row in range(rows): for col in range(cols): count = count + 1 e = Enemy(count, speed, facing) e.set_position(x_pos, y_pos) x_pos = 32 + x_pos + offset_x x_pos = 0 y_pos = 32 + y_pos + offset_y def go_to_gameover(self): ApplicationManager().load_scene(GameOverScene(self.score.get_score()))