/** * \brief Creates an arrow. * \param hero The hero. */ Arrow::Arrow(const Hero& hero): MapEntity("", 0, hero.get_layer(), 0, 0, 0, 0), hero(hero) { // initialize the entity int direction = hero.get_animation_direction(); create_sprite("entities/arrow", true); get_sprite().set_current_direction(direction); set_drawn_in_y_order(true); if (direction % 2 == 0) { // Horizontal. set_size(16, 8); set_origin(8, 4); } else { // Vertical. set_size(8, 16); set_origin(4, 8); } set_xy(hero.get_center_point()); set_optimization_distance(0); // Make the arrow continue outside the screen until disappear_date. std::string path = " "; path[0] = '0' + (direction * 2); Movement* movement = new PathMovement(path, 192, true, false, false); set_movement(movement); disappear_date = System::now() + 10000; stop_now = false; entity_reached = NULL; }
/** * \brief Creates an arrow. * \param hero The hero. */ Arrow::Arrow(const Hero& hero): Entity("", 0, hero.get_layer(), Point(0, 0), Size(0, 0)), hero(hero) { // initialize the entity int direction = hero.get_animation_direction(); create_sprite("entities/arrow", true); get_sprite().set_current_direction(direction); set_drawn_in_y_order(true); if (direction % 2 == 0) { // Horizontal. set_size(16, 8); set_origin(8, 4); } else { // Vertical. set_size(8, 16); set_origin(4, 8); } set_xy(hero.get_center_point()); notify_position_changed(); std::string path = " "; path[0] = '0' + (direction * 2); set_movement(std::make_shared<PathMovement>( path, 192, true, false, false )); disappear_date = System::now() + 10000; stop_now = false; entity_reached = nullptr; }
/** * \brief Creates a boomerang. * \param hero the hero * \param max_distance maximum distance of the movement in pixels * \param speed speed of the movement in pixels per second * \param angle the angle of the boomerang trajectory in radians * \param sprite_name animation set id representing the boomerang */ Boomerang::Boomerang( Hero& hero, int max_distance, int speed, double angle, const std::string& sprite_name): MapEntity("", 0, hero.get_layer(), 0, 0, 0, 0), hero(hero), has_to_go_back(false), going_back(false), speed(speed) { // initialize the entity create_sprite(sprite_name); set_size(16, 16); set_origin(8, 8); int hero_x = hero.get_top_left_x(); int hero_y = hero.get_top_left_y(); switch (hero.get_animation_direction()) { case 0: set_xy(hero_x + 24, hero_y + 8); break; case 1: set_xy(hero_x + 8, hero_y - 8); break; case 2: set_xy(hero_x - 8, hero_y + 8); break; case 3: set_xy(hero_x + 8, hero_y + 24); break; } initial_coords.set_xy(get_xy()); StraightMovement* movement = new StraightMovement(false, false); movement->set_speed(speed); movement->set_angle(angle); movement->set_max_distance(max_distance); set_movement(movement); next_sound_date = System::now(); }
/** * \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 Entity& original_entity, const std::string& animation_set_id, const std::string& destruction_sound_id, int damage_on_enemies, uint32_t explosion_date ): Entity("", 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 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; }
/** * \brief Creates an arrow. * \param hero the hero */ Arrow::Arrow(Hero& hero): hero(hero) { // initialize the entity int direction = hero.get_animation_direction(); set_layer(hero.get_layer()); create_sprite("entities/arrow", true); get_sprite().set_current_direction(direction); set_bounding_box_from_sprite(); set_xy(hero.get_center_point()); set_optimization_distance(0); // Make the arrow continue outside the screen until disappear_date. std::string path = " "; path[0] = '0' + (direction * 2); Movement *movement = new PathMovement(path, 192, true, false, false); set_movement(movement); disappear_date = System::now() + 10000; stop_now = false; entity_reached = NULL; }
/** * @brief Creates a hookshot. * @param hero the hero */ Hookshot::Hookshot(Hero &hero): next_sound_date(System::now()), has_to_go_back(false), going_back(false), entity_reached(NULL), link_sprite("entities/hookshot") { // initialize the entity int direction = hero.get_animation_direction(); set_layer(hero.get_layer()); create_sprite("entities/hookshot", true); get_sprite().set_current_direction(direction); link_sprite.set_current_animation("link"); set_size(16, 16); set_origin(8, 13); set_xy(hero.get_xy()); std::string path = " "; path[0] = '0' + (direction * 2); Movement *movement = new PathMovement(path, 192, true, false, false); set_movement(movement); }
/** * \brief Creates a hookshot. * \param hero the hero */ Hookshot::Hookshot(const Hero& hero): MapEntity("", 0, hero.get_layer(), 0, 0, 0, 0), next_sound_date(System::now()), has_to_go_back(false), going_back(false), entity_reached(nullptr), link_sprite(std::make_shared<Sprite>("entities/hookshot")) { // initialize the entity int direction = hero.get_animation_direction(); create_sprite("entities/hookshot", true); get_sprite().set_current_direction(direction); link_sprite->set_current_animation("link"); set_size(16, 16); set_origin(8, 13); set_drawn_in_y_order(true); set_xy(hero.get_xy()); std::string path = " "; path[0] = '0' + (direction * 2); set_movement(std::make_shared<PathMovement>(path, 192, true, false, false)); }