X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsprite%2Fsprite_manager.cpp;h=6c6628efbadecdf8ea502e12c0453c69b3bf282c;hb=a3ead1c7463ea1ff0e29ca8fa967688a4c1641e2;hp=4a11b25bc4f8bf0c5af7062ebfe3365400c3b466;hpb=c0093d25093395cb62fc2526ab42be65a9f015b8;p=supertux.git diff --git a/src/sprite/sprite_manager.cpp b/src/sprite/sprite_manager.cpp index 4a11b25bc..6c6628efb 100644 --- a/src/sprite/sprite_manager.cpp +++ b/src/sprite/sprite_manager.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux -// Copyright (C) 2004 Ingo Ruhnke +// Copyright (C) 2006 Matthias Braun // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,24 +12,22 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#include +// along with this program. If not, see . + +#include "sprite/sprite_manager.hpp" + +#include "lisp/parser.hpp" +#include "sprite/sprite.hpp" +#include "util/file_system.hpp" +#include "util/reader.hpp" -#include #include #include -#include "sprite_manager.h" -#include "sprite_data.h" -#include "sprite.h" -#include "lisp/lisp.h" -#include "lisp/parser.h" -#include "lisp/list_iterator.h" -SpriteManager::SpriteManager(const std::string& filename) +SpriteManager::SpriteManager() : + sprites() { - load_resfile(filename); } SpriteManager::~SpriteManager() @@ -41,52 +37,64 @@ SpriteManager::~SpriteManager() } } -void -SpriteManager::load_resfile(const std::string& filename) +SpritePtr +SpriteManager::create(const std::string& name) { - lisp::Parser parser; - try { - std::auto_ptr root (parser.parse(filename)); + Sprites::iterator i = sprites.find(name); + SpriteData* data; + if(i == sprites.end()) { + // 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 SpritePtr(new Sprite(*data)); +} - const lisp::Lisp* resources = root->get_lisp("supertux-resources"); - if(!resources) - throw std::runtime_error("file is not a supertux-resources files"); +SpriteData* +SpriteManager::load(const std::string& filename) +{ + lisp::Parser parser; + const lisp::Lisp* root; - lisp::ListIterator iter(resources); - while(iter.next()) { - if(iter.item() == "sprite") { - SpriteData* spritedata = new SpriteData(iter.lisp()); + try { + if(filename.size() >= 7 && filename.compare(filename.size() - 7, 7, ".sprite") == 0) { + // Sprite file + root = parser.parse(filename); + } else { + // Load image file directly + std::stringstream lisptext; + lisptext << "(supertux-sprite (action " + << "(name \"default\") " + << "(images \"" << FileSystem::basename(filename) << "\")))"; - Sprites::iterator i = sprites.find(spritedata->get_name()); - if (i == sprites.end()) { - sprites[spritedata->get_name()] = spritedata; - } else { - delete i->second; - i->second = spritedata; - std::cout << "Warning: dulpicate entry: '" << spritedata->get_name() - << "' in spritefile." << std::endl; - } - } else { - std::cout << "SpriteManager: Unknown tag '" << iter.item() - << "' in spritefile.\n"; - } + root = parser.parse(lisptext, "SpriteManager::load"); } - } catch(std::exception& e) { - std::stringstream msg; - msg << "Couldn't load file '" << filename << "': " << e.what() << "\n"; + } catch(const std::exception& e) { + std::ostringstream msg; + msg << "Parse error when trying to load sprite '" << filename + << "': " << e.what() << "\n"; throw std::runtime_error(msg.str()); } -} -Sprite* -SpriteManager::create(const std::string& name) -{ - Sprites::iterator i = sprites.find(name); - if(i == sprites.end()) { - std::stringstream msg; - msg << "Sprite '" << name << "' not found."; + 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::unique_ptr data ( + new SpriteData(*sprite, FileSystem::dirname(filename)) ); + sprites[filename] = data.release(); + + return sprites[filename]; } +/* EOF */