/** * \brief Creates a carried item (i.e. an item carried by the hero). * \param hero the hero who is lifting the item to be created * \param original_entity the entity that will be replaced by this carried item * (its coordinates, size and origin will be copied) * \param animation_set_id name of the animation set for the sprite to create * \param destruction_sound_id Name of the sound to play when this item is destroyed * (or an empty string). * \param damage_on_enemies damage received by an enemy if the item is thrown on him * (possibly 0) * \param explosion_date date of the explosion if the item should explode, * or 0 if the item does not explode */ CarriedItem::CarriedItem( Hero& hero, const MapEntity& original_entity, const std::string& animation_set_id, const std::string& destruction_sound_id, int damage_on_enemies, uint32_t explosion_date ): MapEntity("", 0, hero.get_layer(), Point(0, 0), Size(0, 0)), hero(hero), is_lifting(true), is_throwing(false), is_breaking(false), break_one_layer_above(false), destruction_sound_id(destruction_sound_id), damage_on_enemies(damage_on_enemies), shadow_sprite(nullptr), throwing_direction(0), next_down_date(0), item_height(0), y_increment(0), explosion_date(explosion_date) { // align correctly the item with the hero int direction = hero.get_animation_direction(); if (direction % 2 == 0) { set_xy(original_entity.get_x(), hero.get_y()); } else { set_xy(hero.get_x(), original_entity.get_y()); } set_origin(original_entity.get_origin()); set_size(original_entity.get_size()); set_drawn_in_y_order(true); // create the lift movement and the sprite std::shared_ptr<PixelMovement> movement = std::make_shared<PixelMovement>( lifting_trajectories[direction], 100, false, true ); create_sprite(animation_set_id); get_sprite().set_current_animation("stopped"); set_movement(movement); // create the shadow (not visible yet) shadow_sprite = std::make_shared<Sprite>("entities/shadow"); shadow_sprite->set_current_animation("big"); }
/** * \brief Checks whether a sprite collides with this detector. * * If there is a collision, the notify_collision(MapEntity&, Sprite&, Sprite&) method is called. * * \param entity the entity to check * \param sprite the sprite of that entity */ void Detector::check_collision(MapEntity& entity, Sprite& sprite) { if (has_collision_mode(COLLISION_SPRITE) && &entity != this && (has_layer_independent_collisions() || get_layer() == entity.get_layer())) { // we check the collision between the specified entity's sprite and all sprites of the current entity std::vector<Sprite*>::const_iterator it; for (it = get_sprites().begin(); it != get_sprites().end(); it++) { Sprite& this_sprite = *(*it); if (this_sprite.test_collision(sprite, get_x(), get_y(), entity.get_x(), entity.get_y())) { notify_collision(entity, sprite, this_sprite); } } } }
/** * @brief Creates a carried item (i.e. an item carried by the hero). * @param hero the hero who is lifting the item to be created * @param original_entity the entity that will be replaced by this carried item * (its coordinates, size and origin will be copied) * @param animation_set_id name of the animation set for the sprite to create * @param destruction_sound_id name of the sound to play when this item is destroyed * (or an empty string) * @param damage_on_enemies damage received by an enemy if the item is thrown on him * (possibly 0) * @param explosion_date date of the explosion if the item should explode, * or 0 if the item does not explode */ CarriedItem::CarriedItem(Hero& hero, MapEntity& original_entity, const std::string& animation_set_id, const std::string& destruction_sound_id, int damage_on_enemies, uint32_t explosion_date): MapEntity(), hero(hero), is_lifting(true), is_throwing(false), is_breaking(false), break_on_intermediate_layer(false) { // put the item on the hero's layer set_layer(hero.get_layer()); // align correctly the item with the hero int direction = hero.get_animation_direction(); if (direction % 2 == 0) { set_xy(original_entity.get_x(), hero.get_y()); } else { set_xy(hero.get_x(), original_entity.get_y()); } set_origin(original_entity.get_origin()); set_size(original_entity.get_size()); // create the lift movement and the sprite PixelMovement *movement = new PixelMovement(lifting_trajectories[direction], 100, false, true); create_sprite(animation_set_id); get_sprite().set_current_animation("stopped"); set_movement(movement); // create the breaking sound this->destruction_sound_id = destruction_sound_id; // create the shadow (not visible yet) this->shadow_sprite = new Sprite("entities/shadow"); this->shadow_sprite->set_current_animation("big"); // damage on enemies this->damage_on_enemies = damage_on_enemies; // explosion this->explosion_date = explosion_date; }
int MapEntity::get_distance(MapEntity& other) { return (int) Geometry::get_distance(get_x(), get_y(), other.get_x(), other.get_y()); }
/** * \brief Tests whether an entity's collides with this entity. * * This custom collision test is used for destructible items that change the ground drawn under the hero. * * \param entity an entity * \return true if the entity's collides with this entity */ bool Destructible::test_collision_custom(MapEntity& entity) { return overlaps(entity.get_x(), entity.get_y() - 2); }
/** * @brief Returns whether an entity collides with this detector with respect to a custom rule. * @param entity the entity * @return true if the entity's collides with this detector with respect to the custom rule */ bool DynamicTile::test_collision_custom(MapEntity &entity) { // we must test the same coordinates as non-dynamic tiles (see Hero::get_ground_point()) return overlaps(entity.get_x(), entity.get_y() - 2); }