X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.cpp;h=1c8d0bf80b17c9087c8229b245bdd488d0e3c6e8;hb=0f0e6a3689e5d810ec55b68ff455210b1081a021;hp=28dc1fa552d67032cdd9be0a271ce9128e43aa26;hpb=60908c905544776c376421b8d3e12eeb936c068f;p=supertux.git diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 28dc1fa55..1c8d0bf80 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -23,8 +23,9 @@ #include #include -#include "sprite.h" -#include "video/drawing_context.h" +#include "sprite.hpp" +#include "video/drawing_context.hpp" +#include "msg.hpp" Sprite::Sprite(SpriteData& newdata) : data(newdata), frame(0), animation_loops(-1) @@ -48,16 +49,14 @@ Sprite::~Sprite() } void -Sprite::set_action(std::string name, int loops) +Sprite::set_action(const std::string& name, int loops) { if(action && action->name == name) return; SpriteData::Action* newaction = data.get_action(name); if(!newaction) { -#ifdef DEBUG - std::cerr << "Action '" << name << "' not found.\n"; -#endif + msg_debug("Action '" << name << "' not found."); return; } @@ -67,7 +66,7 @@ Sprite::set_action(std::string name, int loops) } bool -Sprite::check_animation() +Sprite::animation_done() { return animation_loops == 0; } @@ -75,7 +74,7 @@ Sprite::check_animation() void Sprite::update() { - if(animation_loops == 0) + if(animation_done()) return; Uint32 ticks = SDL_GetTicks(); @@ -85,58 +84,63 @@ Sprite::update() frame += frame_inc; if(frame >= get_frames()) { - frame = fmodf(frame+get_frames(), get_frames()); - + frame = fmodf(frame, get_frames()); + animation_loops--; - if(animation_loops == 0) - frame = 0; + if(animation_done()) + frame = get_frames()-1; } } void -Sprite::draw(DrawingContext& context, const Vector& pos, int layer, - Uint32 drawing_effect) +Sprite::draw(DrawingContext& context, const Vector& pos, int layer) { assert(action != 0); update(); if((int)frame >= get_frames() || (int)frame < 0) - std::cerr << "Warning: frame out of range: " << (int)frame + msg_warning("frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() - << "/" << get_action_name() << std::endl; + << "/" << get_action_name()); else context.draw_surface(action->surfaces[(int)frame], pos - Vector(action->x_offset, action->y_offset), - layer + action->z_order, drawing_effect); + layer + action->z_order); } void Sprite::draw_part(DrawingContext& context, const Vector& source, - const Vector& size, const Vector& pos, int layer, Uint32 drawing_effect) + const Vector& size, const Vector& pos, int layer) { assert(action != 0); update(); if((int)frame >= get_frames() || (int)frame < 0) - std::cerr << "Warning: frame out of range: " << (int)frame + msg_warning("frame out of range: " << (int)frame << "/" << get_frames() << " at sprite: " << get_name() - << "/" << get_action_name() << std::endl; + << "/" << get_action_name()); else context.draw_surface_part(action->surfaces[(int)frame], source, size, pos - Vector(action->x_offset, action->y_offset), - layer + action->z_order, drawing_effect); + layer + action->z_order); } int Sprite::get_width() const { - return action->surfaces[get_frame()]->w; + return (int) action->surfaces[get_frame()]->get_width(); } int Sprite::get_height() const { - return action->surfaces[get_frame()]->h; + return (int) action->surfaces[get_frame()]->get_height(); +} + +void +Sprite::set_fps(float new_fps) +{ + action->fps = new_fps; }