Exemple #1
0
 def update(self):
     """Update all particle emitters, remove dead objects and execute attacks."""
     for attacks in self.world.attacks.itervalues():
         for attack in attacks:
             dead_particles = attack.update()
             for projectile in dead_particles:
                 ev_die = events.EntityDies(projectile.entity_ID)
                 self.event_manager.post(ev_die)
     #Check for collision
     self.check_projectile_collision()
     self.remove_dead_entities()
     if self.reset_the_world:
         self.event_manager.paused = True
         self.world.reset_the_world()
         self.reset_the_world = False
         self.event_manager.paused = False
Exemple #2
0
 def check_projectile_collision(self):
     """Checks for collision between projectiles and other objects."""
     player_ID = self.world.player
     for attacks_ID in self.world.attacks:
         for attack in self.world.attacks[attacks_ID]:
             for projectile in attack.particles:
                 #First update projectiles grafic position
                 self.world.appearance[
                     projectile.entity_ID].rect.center = projectile.position
                 projectile_rect = self.world.appearance[
                     projectile.entity_ID].rect
                 for collider_ID in self.world.collider:
                     if not collider_ID in self.world.to_remove:
                         #Check overlapping
                         if self.world.collider[collider_ID].colliderect(
                                 projectile_rect):
                             # Damage calculation only if collider wasn't already pierced
                             if not collider_ID in projectile.pierced_objects:
                                 #Enemy hits player
                                 if collider_ID == player_ID and attacks_ID in self.world.ai:
                                     if self.world.hp[self.world.players[
                                             player_ID].hp_ID].points > 0:
                                         players_health = self.world.hp[
                                             self.world.players[player_ID].
                                             hp_ID]
                                         #Decrease HP
                                         players_health.points -= attack.damage
                                         update_ui_ev = events.UpdatePlayersHpUI(
                                             player_ID)
                                         self.event_manager.post(
                                             update_ui_ev)
                                         #Send stun event
                                         stun_ev = events.EntityStunned(
                                             player_ID, attack.stun)
                                         self.event_manager.post(stun_ev)
                                     else:
                                         #No more Hp left. Player dies!
                                         ev_die = events.EntityDies(
                                             collider_ID)
                                         self.event_manager.post(ev_die)
                                     '''
                                     projectile.life = -1
                                     ev_die = events.EntityDies(projectile.entity_ID)
                                     self.event_manager.post(ev_die)
                                     '''
                                 #Player hits enemy
                                 elif collider_ID in self.world.ai and attacks_ID == player_ID:
                                     if self.world.hp[
                                             collider_ID].points > 0:
                                         enemys_health = self.world.hp[
                                             collider_ID]
                                         #Decrease HP
                                         enemys_health.points -= attack.damage
                                         #Send stun event
                                         stun_ev = events.EntityStunned(
                                             collider_ID, attack.stun)
                                         self.event_manager.post(stun_ev)
                                     else:
                                         #Remove all projectiles of enemy
                                         for attack in self.world.attacks[
                                                 collider_ID]:
                                             for projectile in attack.particles:
                                                 projectile.life = -1
                                                 ev_die = events.EntityDies(
                                                     projectile.entity_ID)
                                                 self.event_manager.post(
                                                     ev_die)
                                         #Enemy dies
                                         ev_die = events.EntityDies(
                                             collider_ID)
                                         self.event_manager.post(ev_die)
                             if not collider_ID == attacks_ID:
                                 if (projectile.piercing
                                     ):  # Remember pierced object
                                     projectile.pierced_objects.append(
                                         collider_ID)
                                 else:  # Remove projectile from the game
                                     projectile.life = -1
                                     ev_die = events.EntityDies(
                                         projectile.entity_ID)
                                     self.event_manager.post(ev_die)
                 #Collision between walls
                 hit_items = self.world.tree.hit(projectile_rect)
                 if hit_items:
                     if not projectile.piercing:  # Remove projectile from the game
                         projectile.life = -1
                         ev_die = events.EntityDies(projectile.entity_ID)
                         self.event_manager.post(ev_die)
Exemple #3
0
    def notify(self, event):
        """Notify, when event occurs. 

        :param event: occured event
        :type event: events.Event
        """
        #
        if isinstance(event, events.TickEvent):
            self.timer = self.timer - 1
            if self.timer < 1:
                for entity_ID, ai in self.world.ai.iteritems():
                    self.check_to_deactivate(entity_ID)
                #Needed for sound
                if self.world.inactive_enemy_count == len(self.world.ai) - 2:
                    ev = events.NoEnemysNear()
                    self.event_manager.post(ev)
                self.timer = 150

        #Update first enemy AI
        for entity_ID, ai in self.world.ai.iteritems():
            if self.world.active_entity(entity_ID):
                ai.current_action(event)

        if isinstance(event, events.CollisionOccured):
            if hasattr(event.collidee, 'entity_ID'):
                entity_ID = event.collidee.entity_ID
                if event.collidee.entity_ID in self.world.collectibles:
                    if self.world.active_entity(entity_ID):
                        collect = self.world.collectibles[entity_ID]
                        collect.handle_collision_event(event.collider_ID)
                        if isinstance(collect, collectible.Portal):
                            ev_portal_enter = events.PortalEntered(entity_ID)
                            self.event_manager.post(ev_portal_enter)
                        else:
                            ev_collected = events.CollectedItem(entity_ID)
                            self.event_manager.post(ev_collected)
            if hasattr(event.collidee, 'tags'):
                tags = event.collidee.tags
                if tags and event.collider_ID == self.world.player:
                    if "deadly" in tags:
                        #Player dies!
                        self.world.hp[self.world.players[
                            self.world.player].hp_ID].points = 0
                        ev_die = events.EntityDies(self.world.player)
                        self.event_manager.post(ev_die)
        if hasattr(event, 'entity_ID'):
            entity_ID = event.entity_ID
            if self.world.active_entity(entity_ID):
                if entity_ID in self.world.velocity:
                    vel_x = self.world.velocity[entity_ID].max_x
                    if isinstance(event, events.EntityMovesLeftRequest):
                        self.world.velocity[entity_ID].x = -vel_x
                    if isinstance(event, events.EntityMovesRightRequest):
                        self.world.velocity[entity_ID].x = vel_x
                    if isinstance(event, events.EntityStopMovingLeftRequest):
                        if self.world.velocity[entity_ID].x < 0:
                            self.world.velocity[entity_ID].x = 0
                    if isinstance(event, events.EntityStopMovingRightRequest):
                        if self.world.velocity[entity_ID].x > 0:
                            self.world.velocity[entity_ID].x = 0
                    vel_y = self.world.velocity[entity_ID].max_y
                    if isinstance(event, events.EntityJumpRequest):
                        if self.world.velocity[entity_ID].y == 0:
                            self.world.velocity[entity_ID].y = -vel_y
            else:
                if entity_ID in self.world.velocity:
                    #Inactive entities stop movement
                    self.world.velocity[entity_ID].x = 0
                    self.world.velocity[entity_ID].y = 0
            if isinstance(event, events.EntityDies):
                self.world.deactivate_entity(entity_ID)
            if isinstance(event, events.EntityStunned):
                self.world.deactivate_entity(entity_ID)
            if isinstance(event, events.ActivateEntity):
                if entity_ID in self.world.inactive_entities:
                    self.world.inactive_entities.remove(entity_ID)
                    if entity_ID in self.world.ai:
                        self.world.inactive_enemy_count -= 1