Exemplo n.º 1
0
 def start_boosting(self):
     """
     Engages the ships boosters.
     """
     if not self._boosting and not settings.DISABLE_BOOSTING:
         self._boosting = True
         play_sound("thrust", -1)
Exemplo n.º 2
0
 def shoot(self, bullets):
     """
     Shoots a bullet in the current direction if possible.
     """
     if len(bullets) < Player.MAX_ONSCREEN_BULLETS and \
             self._remaining_reload_time == 0 and \
             not settings.DISABLE_SHOOTING:
         bullets.append(Bullet(self.x, self.y, self.rotation))
         self.num_bullets_fired += 1
         self._remaining_reload_time = Player.RELOAD_TIME
         play_sound("fire")
Exemplo n.º 3
0
 def check_for_collisions(self, asteroids):
     """
     Returns whether the player ship has collided with
     any asteroids, destroying the player ship if so.
     """
     if self.destroyed or settings.DEBUG_MODE:
         return False
     for asteroid in asteroids:
         if has_collided(self, asteroid):
             self.destroyed = True
             stop_sound("thrust")
             play_sound("bangSmall")
             return True
     return False
Exemplo n.º 4
0
 def split(self, asteroids):
     """
     Splits the asteroid into two smaller asteroids if possible.
     Just destroys the asteroid if its at the minimum size.
     """
     self.destroyed = True
     if self._size > 1:
         asteroids.append(
             Asteroid(
                 self._size - 1, self.x, self.y,
                 random.uniform(self.speed,
                                Asteroid.SIZE_TO_MAX_SPEED[self._size - 1]),
                 (self.angle - random.uniform(0, math.pi / 4)) %
                 (2 * math.pi)))
         asteroids.append(
             Asteroid(
                 self._size - 1, self.x, self.y,
                 random.uniform(self.speed,
                                Asteroid.SIZE_TO_MAX_SPEED[self._size - 1]),
                 (self.angle + random.uniform(0, math.pi / 4)) %
                 (2 * math.pi)))
     play_sound(Asteroid.SIZE_TO_BANG_SOUND[self._size])
Exemplo n.º 5
0
    def _load_level(self):
        """
        Loads the initial game components for the level.
        """
        self._state = App.RUNNING

        # Use predetermined RNG seed if specified
        if settings.USE_PREDETERMINED_SEED:
            self._prev_rng_state = random.getstate()
            random.seed(settings.PREDETERMINED_SEED)

        # Load initial game components
        self.player = self._spawn_player()
        self.bullets = []
        self.asteroids = []
        for i in range(4):
            Asteroid.spawn(self.asteroids, self.player, False)
        Asteroid.spawn(self.asteroids, self.player, True)

        # Initialize performance trackers
        self.score = 0
        self.asteroids_hit = 0
        self.run_time = 0

        # Load initial time tracker state
        self._last_spawn_time = 0
        self._spawn_period = settings.INITIAL_SPAWN_PERIOD

        # Reset sounds and start the BGM
        stop_all_sounds()
        play_sound("bgm", -1)

        # Reset the screen, if necessary
        if self._use_screen:
            self.screen.fill(BLACK)
            pygame.display.flip()
Exemplo n.º 6
0
    def _handle_event(self, event):
        """
        Interprets and handles an asynchronous event.
        """
        # Stop running when the close button or 'Q' is pressed
        if event.type == pygame.QUIT or \
                event.type == pygame.KEYDOWN and event.key == pygame.K_q:
            self._running = False

        # Check if user clicked or pressed enter to begin
        elif self._state == App.SPLASH:
            if (event.type == pygame.MOUSEBUTTONDOWN) or \
                    (event.type == pygame.KEYDOWN and
                    event.key == pygame.K_RETURN):
                self._load_level()

        elif self._state == App.RUNNING or self._state == App.GAME_OVER:

            # B: Toggle collision boundary display
            if event.type == pygame.KEYDOWN and event.key == pygame.K_b:
                settings.SHOW_COLLISION_BOUNDARY = settings.DEBUG_MODE or \
                        not settings.SHOW_COLLISION_BOUNDARY
            # C: Toggle score display
            if event.type == pygame.KEYDOWN and event.key == pygame.K_c:
                settings.SHOW_SCORE = not settings.SHOW_SCORE
            # D: Toggle debug (invincible) mode
            if event.type == pygame.KEYDOWN and event.key == pygame.K_d:
                settings.DEBUG_MODE = not settings.DEBUG_MODE
                settings.SHOW_COLLISION_BOUNDARY = settings.DEBUG_MODE
            # F: Toggle FPS display
            if event.type == pygame.KEYDOWN and event.key == pygame.K_f:
                settings.SHOW_FPS = not settings.SHOW_FPS
            # N: Spawn a new aimed asteroid
            if event.type == pygame.KEYDOWN and event.key == pygame.K_n:
                Asteroid.spawn(self.asteroids, self.player, True)
            # R: Resets the level
            if event.type == pygame.KEYDOWN and event.key == pygame.K_r:
                self._load_level()
            # S: Toggles sound effects
            if event.type == pygame.KEYDOWN and event.key == pygame.K_s:
                settings.PLAY_SFX = not settings.PLAY_SFX
                if settings.PLAY_SFX:
                    play_sound("bgm", -1)
                else:
                    stop_all_sounds()
            # X: Splits the first asteroid on the asteroid list
            if event.type == pygame.KEYDOWN and event.key == pygame.K_x:
                if len(self.asteroids) > 0:
                    self.asteroids[0].split(self.asteroids)

            # Running state only controls
            if self._state == App.RUNNING:

                # Handle human player controls
                if settings.PLAYER_MODE == settings.HUMAN:
                    if event.type == pygame.KEYDOWN:
                        if event.key == pygame.K_UP:
                            self.player.start_boosting()
                        if event.key == pygame.K_LEFT:
                            self.player.start_spinning(False)
                        if event.key == pygame.K_RIGHT:
                            self.player.start_spinning(True)
                        if event.key == pygame.K_SPACE:
                            self.player.shoot(self.bullets)
                    elif event.type == pygame.KEYUP:
                        if event.key == pygame.K_UP:
                            self.player.stop_boosting()
                        if event.key == pygame.K_LEFT:
                            self.player.stop_spinning()
                        if event.key == pygame.K_RIGHT:
                            self.player.stop_spinning()

                # Handle AI spectator controls
                elif settings.PLAYER_MODE == settings.AI:
                    self._handle_ai_spectator_controls(event)

        # Don't listen to events in other app states
        else:
            return