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