Example #1
0
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()))