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()
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()