X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite.cpp;h=20c11fb5b99d5de0549da0be7cb21e346e8ffcef;hb=198f758764fff064a47630b5d0f1e3d6aabe95a8;hp=00c624713a91667f88c329d5412e602b0c6ebcbf;hpb=0281069747a0a8b81b6d51f5e090353334a74c01;p=supertux.git diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 00c624713..20c11fb5b 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -32,21 +32,26 @@ #include "timer.hpp" Sprite::Sprite(SpriteData& newdata) - : data(newdata), frame(0), animation_loops(-1), angle(0.0f) + : data(newdata), + frame(0), + animation_loops(-1), + angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f) { action = data.get_action("normal"); if(!action) action = data.actions.begin()->second; - last_ticks = real_time; + last_ticks = game_time; } Sprite::Sprite(const Sprite& other) : data(other.data), frame(other.frame), animation_loops(other.animation_loops), angle(0.0f), + color(1.0f, 1.0f, 1.0f, 1.0f), action(other.action) { - last_ticks = real_time; + last_ticks = game_time; } Sprite::~Sprite() @@ -70,6 +75,28 @@ Sprite::set_action(const std::string& name, int loops) frame = 0; } +void +Sprite::set_action_continued(const std::string& name) +{ + if(action && action->name == name) + return; + + SpriteData::Action* newaction = data.get_action(name); + if(!newaction) { + log_debug << "Action '" << name << "' not found." << std::endl; + return; + } + + action = newaction; + if(frame >= get_frames()) { + frame = fmodf(frame, get_frames()); + + if (animation_loops > 0) animation_loops--; + if(animation_done()) + frame = get_frames()-1; + } +} + bool Sprite::animation_done() { @@ -82,14 +109,14 @@ Sprite::update() if(animation_done()) return; - float frame_inc = action->fps * (real_time - last_ticks); - last_ticks = real_time; + float frame_inc = action->fps * (game_time - last_ticks); + last_ticks = game_time; frame += frame_inc; if(frame >= get_frames()) { frame = fmodf(frame, get_frames()); - + animation_loops--; if(animation_done()) frame = get_frames()-1; @@ -108,6 +135,8 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer) context.draw_surface(action->surfaces[(int)frame], pos - Vector(action->x_offset, action->y_offset), angle, + color, + blend, layer + action->z_order); } @@ -119,7 +148,7 @@ Sprite::draw_part(DrawingContext& context, const Vector& source, update(); int frameidx = (int) frame; - + if(frameidx >= get_frames() || frameidx < 0) { #ifndef DEBUG // in optimized mode we get some small rounding errors in floating point @@ -128,7 +157,7 @@ Sprite::draw_part(DrawingContext& context, const Vector& source, #endif frameidx = get_frames() - 1; } - + context.draw_surface_part(action->surfaces[frameidx], source, size, pos - Vector(action->x_offset, action->y_offset), layer + action->z_order); @@ -194,4 +223,28 @@ Sprite::get_angle() const return angle; } +void +Sprite::set_color(const Color& c) +{ + color = c; +} + +Color +Sprite::get_color() const +{ + return color; +} + +void +Sprite::set_blend(const Blend& b) +{ + blend = b; +} + +Blend +Sprite::get_blend() const +{ + return blend; +} + /* EOF */