def init(self): self.sprites = pygame.sprite.Group() self.mobs = pygame.sprite.Group() self.bullets = pygame.sprite.Group() self.power_ups = pygame.sprite.Group() for i in range(config.NB_MOBS): new_mob = Mob() new_mob.add(self.mobs, self.sprites) self.player = Player() self.sprites.add(self.player) self.score = 0 self.gameover = False
def update(self): self.background.update() self.sprites.update() # list of mobs collided with player ; mobs are deleted mob_hits_with_player = pygame.sprite.spritecollide( self.player, self.mobs, True, pygame.sprite.collide_circle) for mob_hit in mob_hits_with_player: self.sound_handler.play("player_hit") self.player.shield -= mob_hit.radius * 2 expl = Explosion(self.explosion_anim, mob_hit.rect.center, 'sm') self.sprites.add(expl) new_mob = Mob() new_mob.add(self.mobs, self.sprites) if self.player.shield < 0: self.sound_handler.play("player_death") self.death_explosion = Explosion(self.explosion_anim, self.player.rect.center, 'player') self.sprites.add(self.death_explosion) self.player.hide() self.player.lives -= 1 self.player.shield = self.player.initial_shield # check if player died if self.player.lives == 0 and not self.death_explosion.alive(): self.gameover = True log.info("Game Over!") log.info("Score: " + str(self.score)) # list of mobs collided with the bullets ; both are deleted mob_hits_with_bullets = pygame.sprite.groupcollide( self.mobs, self.bullets, True, True) for mob_hit in mob_hits_with_bullets: self.sound_handler.play("explosion") points_gained = 60 - mob_hit.radius self.score += points_gained log.info("Hit Radius: " + str(mob_hit.radius)) self.score_textes.append( Float_Text(str(points_gained), 60, mob_hit.rect.midtop[0], mob_hit.rect.midtop[1] - 10)) expl = Explosion(self.explosion_anim, mob_hit.rect.center, 'lg') self.sprites.add(expl) new_mob = Mob() # respawn a new mob new_mob.add(self.mobs, self.sprites) if random.random() > self.power_up_rate: # 90% power = Power_Up(mob_hit.rect.center) power.add(self.sprites, self.power_ups) # list of power_ups collided with player ; power_ups are deleted power_up_hits_with_player = pygame.sprite.spritecollide( self.player, self.power_ups, True) for pu_hit in power_up_hits_with_player: level = pu_hit.level if pu_hit.type == 'shield': self.sound_handler.play("shield") bonus = 1 if level == 'bronze' else 3 if level == 'silver' else 9 bonus *= self.player.initial_shield // random.randrange( 12, 30) # 20 / 40 / 60 % self.player.shield += bonus self.player.shield = self.player.initial_shield if self.player.shield > self.player.initial_shield else self.player.shield self.shield_bonus_textes.append( Float_Text(str(bonus), 60, pu_hit.rect.midtop[0], pu_hit.rect.midtop[1] - 10)) elif pu_hit.type == 'bolt': self.sound_handler.play("bolt") self.player.shoot_bonus_counter += 3 * ( 1 if level == 'bronze' else 2 if level == 'silver' else 4) # moving floating text about points got from destroying mobs self.score_textes = list( filter(lambda x: x.lifetime > 0, self.score_textes)) for s in self.score_textes: s.update(2, 2) # moving floating text about shield bonuses self.shield_bonus_textes = list( filter(lambda x: x.lifetime > 0, self.shield_bonus_textes)) for s in self.shield_bonus_textes: s.update(1, 1)