X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Fmoving_sprite.cpp;h=0c746a5bd52345503ae218beb86693a325656e23;hb=5745d9670262c91e6cd35363fd0d2ec169e7c8a4;hp=3b3e7d73bc5484a886a262ffb23488ce20b1087f;hpb=7eedaa580901ec970795fe66d6e7fa56349fb0a0;p=supertux.git diff --git a/src/object/moving_sprite.cpp b/src/object/moving_sprite.cpp index 3b3e7d73b..0c746a5bd 100644 --- a/src/object/moving_sprite.cpp +++ b/src/object/moving_sprite.cpp @@ -16,9 +16,10 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - #include +#include + #include "moving_sprite.hpp" #include "video/drawing_context.hpp" #include "sprite/sprite_manager.hpp" @@ -47,7 +48,9 @@ MovingSprite::MovingSprite(const lisp::Lisp& reader, const Vector& pos, int laye : layer(layer) { bbox.set_pos(pos); - if (!reader.get("sprite", sprite_name)) throw std::runtime_error("no sprite name set"); + if (!reader.get("sprite", sprite_name)) + throw std::runtime_error("no sprite name set"); + sprite = sprite_manager->create(sprite_name); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); set_group(collision_group); @@ -56,8 +59,11 @@ MovingSprite::MovingSprite(const lisp::Lisp& reader, const Vector& pos, int laye MovingSprite::MovingSprite(const lisp::Lisp& reader, const std::string& sprite_name, int layer, CollisionGroup collision_group) : sprite_name(sprite_name), layer(layer) { - if (!reader.get("x", bbox.p1.x)) throw std::runtime_error("no x position set"); - if (!reader.get("y", bbox.p1.y)) throw std::runtime_error("no y position set"); + if (!reader.get("x", bbox.p1.x)) + throw std::runtime_error("no x position set"); + if (!reader.get("y", bbox.p1.y)) + throw std::runtime_error("no y position set"); + sprite = sprite_manager->create(sprite_name); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); set_group(collision_group); @@ -66,9 +72,13 @@ MovingSprite::MovingSprite(const lisp::Lisp& reader, const std::string& sprite_n MovingSprite::MovingSprite(const lisp::Lisp& reader, int layer, CollisionGroup collision_group) : layer(layer) { - if (!reader.get("x", bbox.p1.x)) throw std::runtime_error("no x position set"); - if (!reader.get("y", bbox.p1.y)) throw std::runtime_error("no y position set"); - if (!reader.get("sprite", sprite_name)) throw std::runtime_error("no sprite name set"); + if (!reader.get("x", bbox.p1.x)) + throw std::runtime_error("no x position set"); + if (!reader.get("y", bbox.p1.y)) + throw std::runtime_error("no y position set"); + if (!reader.get("sprite", sprite_name)) + throw std::runtime_error("no sprite name set"); + sprite = sprite_manager->create(sprite_name); bbox.set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); set_group(collision_group); @@ -80,10 +90,11 @@ MovingSprite::MovingSprite(const MovingSprite& other) sprite = new Sprite(*other.sprite); } -MovingSprite& +MovingSprite& MovingSprite::operator=(const MovingSprite& other) { - if (this == &other) return *this; + if (this == &other) + return *this; delete sprite; sprite = new Sprite(*other.sprite); @@ -104,9 +115,34 @@ MovingSprite::draw(DrawingContext& context) sprite->draw(context, get_pos(), layer); } -void +void MovingSprite::update(float ) { } +void +MovingSprite::set_action(const std::string& action, int loops) +{ + sprite->set_action(action, loops); + set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); +} + +void +MovingSprite::set_action_centered(const std::string& action, int loops) +{ + Vector old_size = bbox.get_size(); + sprite->set_action(action, loops); + set_size(sprite->get_current_hitbox_width(), sprite->get_current_hitbox_height()); + set_pos(get_pos() - (bbox.get_size() - old_size) / 2); +} +void +MovingSprite::set_action(const std::string& action, int loops, AnchorPoint anchorPoint) +{ + Rect old_bbox = bbox; + sprite->set_action(action, loops); + float w = sprite->get_current_hitbox_width(); + float h = sprite->get_current_hitbox_height(); + set_size(w, h); + set_pos(get_anchor_pos(old_bbox, w, h, anchorPoint)); +}