X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite_manager.cpp;h=e6ab67f90a34027529e8d0587436510e65459612;hb=0f0e6a3689e5d810ec55b68ff455210b1081a021;hp=212c64ce161dfba0fd22dedfaf1291db573263a4;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/sprite/sprite_manager.cpp b/src/sprite/sprite_manager.cpp index 212c64ce1..e6ab67f90 100644 --- a/src/sprite/sprite_manager.cpp +++ b/src/sprite/sprite_manager.cpp @@ -28,10 +28,18 @@ #include "lisp/lisp.hpp" #include "lisp/parser.hpp" #include "lisp/list_iterator.hpp" +#include "file_system.hpp" +#include "msg.hpp" SpriteManager::SpriteManager(const std::string& filename) { +#ifdef DEBUG + Uint32 ticks = SDL_GetTicks(); +#endif load_resfile(filename); +#ifdef DEBUG + msg_debug("Loaded sprites in " << (SDL_GetTicks() - ticks) / 1000.0f << " seconds"); +#endif } SpriteManager::~SpriteManager() @@ -55,7 +63,7 @@ SpriteManager::load_resfile(const std::string& filename) lisp::ListIterator iter(resources); while(iter.next()) { if(iter.item() == "sprite") { - SpriteData* spritedata = new SpriteData(iter.lisp()); + SpriteData* spritedata = new SpriteData(iter.lisp(), "images/"); Sprites::iterator i = sprites.find(spritedata->get_name()); if (i == sprites.end()) { @@ -63,12 +71,12 @@ SpriteManager::load_resfile(const std::string& filename) } else { delete i->second; i->second = spritedata; - std::cout << "Warning: dulpicate entry: '" << spritedata->get_name() - << "' in spritefile." << std::endl; + msg_warning("dulpicate entry: '" << spritedata->get_name() + << "' in spritefile."); } } else { - std::cout << "SpriteManager: Unknown tag '" << iter.item() - << "' in spritefile.\n"; + msg_warning("Unknown tag '" << iter.item() + << "' in spritefile."); } } } catch(std::exception& e) { @@ -82,11 +90,39 @@ Sprite* SpriteManager::create(const std::string& name) { Sprites::iterator i = sprites.find(name); + SpriteData* data; if(i == sprites.end()) { - std::stringstream msg; - msg << "Sprite '" << name << "' not found."; + // try loading the spritefile + data = load(name); + if(data == NULL) { + std::stringstream msg; + msg << "Sprite '" << name << "' not found."; + throw std::runtime_error(msg.str()); + } + } else { + data = i->second; + } + + return new Sprite(*data); +} + +SpriteData* +SpriteManager::load(const std::string& filename) +{ + lisp::Parser parser; + std::auto_ptr root (parser.parse(filename)); + + const lisp::Lisp* sprite = root->get_lisp("supertux-sprite"); + if(!sprite) { + std::ostringstream msg; + msg << "'" << filename << "' is not a supertux-sprite file"; throw std::runtime_error(msg.str()); } - return new Sprite(*i->second); + + std::auto_ptr data ( + new SpriteData(sprite, FileSystem::dirname(filename)) ); + sprites[filename] = data.release(); + + return sprites[filename]; }