コード例 #1
0
    def check_collision(self):
        """Check and deal with collision between Player and anything else."""

        # Check collision with enemies
        # Check rect collision first
        if not self.shield_active:  # Disable collision when shield is on
            enemies_hit = pygame.sprite.spritecollide(self, ml.enemy_group,
                                                      False)
            if enemies_hit:
                # Change mask to hitbox mask before checking collision
                self.mask = self.hitbox_mask
                for enemy in enemies_hit:
                    if not enemy.invincible:
                        # Check mask collision
                        enemy.update_mask()  # proper mask for rotating enemies
                        if pygame.sprite.collide_mask(self, enemy):
                            self.damage(enemy.get_damage())
                # Change mask back to normal
                self.mask = self.mask_original

        # Check collision with enemy bullets
        enemy_bullets_hit = pygame.sprite.spritecollide(
            self, ml.enemy_bullet_group, False)
        if enemy_bullets_hit:
            for enemy_bullet in enemy_bullets_hit:
                # Hitbox collision
                if self.hitbox.colliderect(enemy_bullet.get_mask_rect()):
                    self.damage(enemy_bullet.get_damage())
                    enemy_bullet.kill()

        # Check collision with powerups
        powerups_hit = pygame.sprite.spritecollide(self, ml.powerup_group,
                                                   False)
        if powerups_hit:
            for powerup in powerups_hit:
                # Mask collision
                if pygame.sprite.collide_mask(self, powerup):
                    if isinstance(powerup, powerups.HomingShots):
                        self.homing_shots_active = True
                        self.homing_shots_activation_time = ml.time()
                        self.image = self.homing_image
                        self.toggle_time = ml.time()
                        powerup.kill()
                    elif isinstance(powerup, powerups.Shield):
                        if not self.shield_active:
                            self.shield = powerups.ShieldEffect()
                        else:
                            self.shield.reset_duration()
                        powerup.kill()
                    elif isinstance(powerup, powerups.Bomb):
                        for enemy in ml.enemy_group.sprites():
                            enemy.damage(ml.get_upgrade_values('Bomb Damage'))
                        powerup.kill()
                    elif isinstance(powerup, powerups.Heal):
                        if self.health < ml.get_upgrade_values('Max Health'):
                            self.damage(-self.heal_amount)
                        if self.health > ml.get_upgrade_values('Max Health'):
                            self.health = ml.get_upgrade_values('Max Health')
                        powerup.kill()
                    elif isinstance(powerup, powerups.Bonus):
                        ml.change_score(500)
                        powerup.kill()
コード例 #2
0
def run_game():
    """Runs the game."""
    global game_running

    # Create groups
    player_group = pygame.sprite.GroupSingle()
    player_bullet_group = pygame.sprite.Group()
    enemy_group = pygame.sprite.Group()
    enemy_bullet_group = pygame.sprite.Group()
    powerup_group = pygame.sprite.Group()
    powerup_effect_group = pygame.sprite.Group()
    boss_part_group = pygame.sprite.OrderedUpdates()

    # Set up MyLibrary data
    ml.set_sprite_groups(player_group, player_bullet_group, enemy_group,
                         enemy_bullet_group, powerup_group,
                         powerup_effect_group, boss_part_group)
    ml.reset_upgrades()
    ml.set_score(0)

    # Display the main menu
    main_menu()

    # Spawn player sprite
    player.Player()

    game_start_time = ml.time()
    boss_spawn_delay = 5
    current_boss = 0
    final_boss_dead = None
    boss_list = [bosses.StarBurst, bosses.Doppelganger, bosses.Ring]
    game_running = True

    while True:  # Main game loop

        # frame timer
        start = time.time()

        # Deal with all in-game events
        check_for_events()

        # Check if player is alive
        # TODO temporary for presentation
        if ml.player.health <= 0:
            ml.player.damage(-999)
            ml.change_score(-2500)
            # return

        # Clear window
        window.fill(BLACK)

        # Spawn powerups
        powerups.PowerUp.spawn_random(
            (random.randint(30,
                            window.get_width() - 30), -50))

        # Spawn bosses
        if ml.time() - game_start_time > boss_spawn_delay:
            if not enemy_group.sprites() and not final_boss_dead:
                try:
                    boss_list[current_boss]()
                except IndexError:
                    final_boss_dead = ml.time()
                current_boss += 1
        if final_boss_dead and ml.time() - final_boss_dead > 5:
            return

        # Update all Sprites
        player_group.update(player_move_up, player_move_left, player_move_down,
                            player_move_right, mouse_movement_active,
                            shift_pressed)
        player_bullet_group.update()
        powerup_effect_group.update()
        enemy_group.update()
        boss_part_group.update()
        powerup_group.update()
        enemy_bullet_group.update()

        # Draw all Sprites (in order of increasing priority)
        player_bullet_group.draw(window)
        powerup_group.draw(window)
        enemy_group.draw(window)
        boss_part_group.draw(window)
        player_group.draw(window)
        powerup_effect_group.draw(window)
        enemy_bullet_group.draw(window)
        ml.draw_interface(window)

        if shift_pressed:
            draw_hitbox()
        draw_cursor()

        pygame.display.update()
        if frame_timer:
            print(time.time() - start)
        ml.tick()