X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=lib%2Fspecial%2Fsprite.cpp;h=d713d5fd2a3643cbe5fa5d218d7b45faf7bf23b3;hb=d1358d551f2415de1495c9f55916787721f42f82;hp=ac50b837ec1cb428f60f8b84e8d5c4611287a3f5;hpb=c04a2c8359536c96c5d7a65207e96c3c089a7812;p=supertux.git diff --git a/lib/special/sprite.cpp b/lib/special/sprite.cpp index ac50b837e..d713d5fd2 100644 --- a/lib/special/sprite.cpp +++ b/lib/special/sprite.cpp @@ -55,7 +55,10 @@ Sprite::~Sprite() { for(std::vector::iterator i_sur = i_act->second->surfaces.begin(); i_sur != i_act->second->surfaces.end(); ++i_sur) - delete *i_sur; + { + if(!i_act->second->mirror) + delete *i_sur; + } delete i_act->second; } } @@ -75,17 +78,7 @@ Sprite::parse_action(LispReader& lispreader) lispreader.read_int("z-order", action->z_order); lispreader.read_float("fps", action->fps); - std::vector images; - if(!lispreader.read_string_vector("images", images)) - Termination::abort("Sprite contains no images: ", action->name.c_str()); - - for(std::vector::size_type i = 0; i < images.size(); i++) - { - action->surfaces.push_back( - new Surface(datadir + "/images/" + images[i], true)); - } - - // TODO: add a top filter entry + /* TODO: add a top filter entry */ std::vector mask_color; lispreader.read_int_vector("apply-mask", mask_color); if(mask_color.size() == 4) @@ -97,6 +90,33 @@ Sprite::parse_action(LispReader& lispreader) } } + action->mirror = false; + std::string mirror_action; + lispreader.read_string("mirror-action", mirror_action); + if(!mirror_action.empty()) + { + action->mirror = true; + Action* act_tmp = get_action(mirror_action); + if(act_tmp == NULL) + std::cerr << "Warning: Could not mirror action. Action not found\n" + "Mirror actions must be defined after the real one!\n"; + else + action->surfaces = act_tmp->surfaces; + } + + // Load images + if(!action->mirror) + { + std::vector images; + if(!lispreader.read_string_vector("images", images)) + Termination::abort("Sprite contains no images: ", action->name); + + for(std::vector::size_type i = 0; i < images.size(); i++) + { + action->surfaces.push_back( + new Surface(datadir + "/images/" + images[i], true)); + } + } actions[action->name] = action; } @@ -133,6 +153,18 @@ if(i == actions.end()) action = i->second; } +Sprite::Action* +Sprite::get_action(std::string act) +{ +Actions::iterator i = actions.find(act); +if(i == actions.end()) + { + std::cerr << "Warning: Action '" << act << "' not found on Sprite '" << name << "'\n"; + return NULL; + } +return i->second; +} + void Sprite::start_animation(int loops) {