X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite.cpp;h=6659c48cddc4ffcef1ce40f2beee0f09b50fcc10;hb=08b7ca0cfedba1e9fa904162fa79d3a00d2188f7;hp=cc9482195fcefe6d5adfb29fa94d25c033eadeaa;hpb=07bd6d0ebe6c773f36d973b01871e5380ffa6026;p=supertux.git diff --git a/lib/special/sprite.cpp b/lib/special/sprite.cpp index cc9482195..6659c48cd 100644 --- a/lib/special/sprite.cpp +++ b/lib/special/sprite.cpp @@ -98,15 +98,25 @@ Sprite::init_defaults(Action* act) void Sprite::set_action(std::string act) { +if(!next_action.empty() && animation_loops > 0) + { + next_action = act; + return; + } Actions::iterator i = actions.find(act); +if(i == actions.end()) + { + std::cerr << "Warning: Action '" << act << "' not found on Sprite '" << name << "'\n"; + return; + } action = i->second; } void Sprite::start_animation(int loops) { -animation_loops = loops; reset(); +animation_loops = loops; } void @@ -114,7 +124,8 @@ Sprite::reset() { frame = 0; last_tick = SDL_GetTicks(); -animation_reversed = true; +animation_reversed = false; +next_action.clear(); } bool @@ -124,9 +135,9 @@ return animation_loops; } void -Sprite::reverse_animation() +Sprite::reverse_animation(bool reverse) { -animation_reversed = !animation_reversed; +animation_reversed = reverse; if(animation_reversed) frame = get_frames()-1; @@ -141,22 +152,28 @@ if(animation_loops == 0) return; float frame_inc = (action->fps/1000.0) * (SDL_GetTicks() - last_tick); +last_tick = SDL_GetTicks(); if(animation_reversed) frame -= frame_inc; else frame += frame_inc; -last_tick = SDL_GetTicks(); - if(animation_reversed) { float excedent = frame - 0; - if(excedent < 0 || excedent >= get_frames()) + if((int)excedent < 0 || excedent >= get_frames()) { // last case can happen when not used reverse_animation() frame = get_frames() - 1; if(animation_loops > 0) + { animation_loops--; + if(animation_loops == 0 && !next_action.empty()) + { + set_action(next_action); + start_animation(-1); + } + } if(fabsf(excedent) < get_frames()) frame += excedent; @@ -165,11 +182,18 @@ if(animation_reversed) else { float excedent = frame - action->surfaces.size(); - if(excedent >= 0) + if((int)excedent >= 0) { frame = 0; if(animation_loops > 0) + { animation_loops--; + if(animation_loops == 0 && !next_action.empty()) + { + set_action(next_action); + start_animation(-1); + } + } if(excedent < get_frames()) frame += excedent;