X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite.cpp;h=d27ae05b7a17190775bc971da7db9a2db1ae1c69;hb=09cabd98fefc508488b696552107f11336f80493;hp=cc9482195fcefe6d5adfb29fa94d25c033eadeaa;hpb=07bd6d0ebe6c773f36d973b01871e5380ffa6026;p=supertux.git diff --git a/lib/special/sprite.cpp b/lib/special/sprite.cpp index cc9482195..d27ae05b7 100644 --- a/lib/special/sprite.cpp +++ b/lib/special/sprite.cpp @@ -39,6 +39,8 @@ Sprite::Sprite(lisp_object_t* cur) name = lisp_string(data); else if(token == "action") parse_action(reader); + else + std::cerr << "Warning: Unknown sprite field: " << token << std::endl; } if(name.empty()) @@ -68,8 +70,8 @@ Sprite::parse_action(LispReader& lispreader) if(!lispreader.read_string("name", action->name)) if(!actions.empty()) Termination::abort("Error: If there are more than one action, they need names!", ""); - lispreader.read_int("x-hotspot", action->x_hotspot); - lispreader.read_int("y-hotspot", action->y_hotspot); + lispreader.read_int("x-offset", action->x_offset); + lispreader.read_int("y-offset", action->y_offset); lispreader.read_float("fps", action->fps); std::vector images; @@ -88,8 +90,8 @@ Sprite::parse_action(LispReader& lispreader) void Sprite::init_defaults(Action* act) { - act->x_hotspot = 0; - act->y_hotspot = 0; + act->x_offset = 0; + act->y_offset = 0; act->fps = 10; start_animation(-1); @@ -98,15 +100,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 +126,8 @@ Sprite::reset() { frame = 0; last_tick = SDL_GetTicks(); -animation_reversed = true; +animation_reversed = false; +next_action.clear(); } bool @@ -124,9 +137,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 +154,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 +184,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; @@ -189,7 +215,7 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer, << "/" << get_action_name() << std::endl; else context.draw_surface(action->surfaces[(int)frame], - pos - Vector(action->x_hotspot, action->y_hotspot), layer, drawing_effect); + pos - Vector(action->x_offset, action->y_offset), layer, drawing_effect); } #if 0 @@ -200,7 +226,7 @@ Sprite::draw_part(float sx, float sy, float x, float y, float w, float h) unsigned int frame = get_current_frame(); if (frame < surfaces.size()) - surfaces[frame]->draw_part(sx, sy, x - x_hotspot, y - y_hotspot, w, h); + surfaces[frame]->draw_part(sx, sy, x - x_offset, y - y_offset, w, h); } #endif