X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite.cpp;h=f37e5eebbf999266a762d988e4c488e66ea0f672;hb=332658f5f24460cc9533e9f42d67c5bb5ddd298d;hp=3f28031c9ed72160de062ea86b1fb45daca12be6;hpb=72b0d5692f64afdf2d097bf96637f5c55fe4413b;p=supertux.git diff --git a/lib/special/sprite.cpp b/lib/special/sprite.cpp index 3f28031c9..f37e5eebb 100644 --- a/lib/special/sprite.cpp +++ b/lib/special/sprite.cpp @@ -92,7 +92,7 @@ Sprite::init_defaults(Action* act) act->y_hotspot = 0; act->fps = 10; - act->animation_loops = 0; + animation_loops = -1; last_tick = 0; } @@ -106,7 +106,7 @@ action = i->second; void Sprite::start_animation(int loops) { -action->animation_loops = loops; +animation_loops = loops; reset(); } @@ -115,25 +115,66 @@ Sprite::reset() { frame = 0; last_tick = SDL_GetTicks(); +animation_reversed = false; } bool Sprite::check_animation() { -return action->animation_loops; +return animation_loops; +} + +void +Sprite::reverse_animation() +{ +animation_reversed = !animation_reversed; + +if(animation_reversed) + frame = get_frames()-1; +else + frame = 0; } void Sprite::update() { -frame += (action->fps/1000) * (SDL_GetTicks() - last_tick); +if(animation_loops == 0) + return; + +float frame_inc = (action->fps/1000.0) * (SDL_GetTicks() - last_tick); + +if(animation_reversed) + frame -= frame_inc; +else + frame += frame_inc; + last_tick = SDL_GetTicks(); -if((unsigned int)frame >= action->surfaces.size()) +if(animation_reversed) { - frame = 0; - if(action->animation_loops > 0) - action->animation_loops--; + float expedient = frame - 0; + if(expedient < 0) + { + frame = get_frames()-1; + if(animation_loops > 0) + animation_loops--; + + if(expedient > -get_frames()) + frame -= expedient; + } + } +else + { + float expedient = frame - action->surfaces.size(); + if(expedient >= 0) + { + frame = 0; + if(animation_loops > 0) + animation_loops--; + + if(expedient < get_frames()) + frame += expedient; + } } } @@ -143,8 +184,11 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer, { update(); - context.draw_surface(action->surfaces[(int)frame], - pos - Vector(action->x_hotspot, action->y_hotspot), layer, drawing_effect); + if((int)frame >= get_frames() || (int)frame < 0) + std::cerr << "Warning: frame higher than total frames or lower than 0!\n"; + else + context.draw_surface(action->surfaces[(int)frame], + pos - Vector(action->x_hotspot, action->y_hotspot), layer, drawing_effect); } #if 0 @@ -162,13 +206,13 @@ Sprite::draw_part(float sx, float sy, float x, float y, float w, float h) int Sprite::get_width() { - return action->surfaces[get_current_frame()]->w; + return action->surfaces[get_frame()]->w; } int Sprite::get_height() { - return action->surfaces[get_current_frame()]->h; + return action->surfaces[get_frame()]->h; } /* EOF */