X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftile_manager.cpp;h=1cd8602077ec7ea0070fbb438aea6c9b5d3cefc4;hb=8385faa306eca6d96ab11ed7dae293d85e9c4e4f;hp=f9ad0c2355a073f2da2fa0fee23462766465f7b2;hpb=c79b901309bf5e0544fef1e92d264f51402f4370;p=supertux.git diff --git a/src/tile_manager.cpp b/src/tile_manager.cpp index f9ad0c235..1cd860207 100644 --- a/src/tile_manager.cpp +++ b/src/tile_manager.cpp @@ -18,16 +18,18 @@ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA // 02111-1307, USA. +#include + #include -#include "screen/drawing_context.h" -#include "setup.h" -#include "globals.h" -#include "lispreader.h" +#include "video/drawing_context.h" +#include "app/setup.h" +#include "app/globals.h" +#include "utils/lispreader.h" #include "tile.h" #include "tile_manager.h" +#include "scene.h" TileManager* TileManager::instance_ = 0; -std::set* TileManager::tilegroups_ = 0; TileManager::TileManager() { @@ -37,11 +39,8 @@ TileManager::TileManager() TileManager::~TileManager() { - for(std::vector::iterator i = tiles.begin(); i != tiles.end(); ++i) { - delete *i; - } - - delete tilegroups_; + for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) + delete *i; } void TileManager::load_tileset(std::string filename) @@ -50,107 +49,68 @@ void TileManager::load_tileset(std::string filename) return; // free old tiles - for(std::vector::iterator i = tiles.begin(); i != tiles.end(); ++i) { + for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) delete *i; - } tiles.clear(); lisp_object_t* root_obj = lisp_read_from_file(filename); if (!root_obj) - st_abort("Couldn't load file", filename); - - if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-tiles") == 0) - { - lisp_object_t* cur = lisp_cdr(root_obj); - int tileset_id = 0; - - while(!lisp_nil_p(cur)) - { - lisp_object_t* element = lisp_car(cur); - - if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0) - { - LispReader reader(lisp_cdr(element)); - - Tile* tile = new Tile; - int tile_id = tile->read(reader); - if(tile_id < 0) { - std::cerr - << "Warning: parse error when reading a tile, skipping.\n"; - continue; - } - - tile_id += tileset_id; - - if(tile_id >= int(tiles.size())) - tiles.resize(tile_id+1); - tiles[tile_id] = tile; - } - else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0) - { - LispReader reader(lisp_cdr(element)); - std::string filename; - reader.read_string("file", filename); - filename = datadir + "/images/tilesets/" + filename; - load_tileset(filename); - } - else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0) - { - TileGroup new_; - LispReader reader(lisp_cdr(element)); - reader.read_string("name", new_.name); - reader.read_int_vector("tiles", new_.tiles); - if(!tilegroups_) - tilegroups_ = new std::set; - tilegroups_->insert(new_).first; - } - else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0) - { - LispReader reader(lisp_cdr(element)); - reader.read_int("id", tileset_id); - tileset_id *= 1000; - } - else - { - std::cerr << "Unknown symbol: " << - lisp_symbol(lisp_car(element)) << "\n"; - } - - cur = lisp_cdr(cur); - } - } - else - { - assert(0); - } + Termination::abort("Couldn't load file", filename); - lisp_free(root_obj); - current_tileset = filename; -} + if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-tiles") != 0) + assert(false); -void -TileManager::draw_tile(DrawingContext& context, unsigned int c, - const Vector& pos, int layer) -{ - if(c == 0) - return; + lisp_object_t* cur = lisp_cdr(root_obj); + int tileset_id = 0; - Tile& tile = get(c); + while(!lisp_nil_p(cur)) { + lisp_object_t* element = lisp_car(cur); - if(!tile.images.size()) - return; + if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0) + { + LispReader reader(lisp_cdr(element)); - if(tile.images.size() > 1) - { - size_t frame - = ((global_frame_counter*25) / tile.anim_speed) % tile.images.size(); - context.draw_surface(tile.images[frame], pos, layer); - } - else if (tile.images.size() == 1) - { - context.draw_surface(tile.images[0], pos, layer); + Tile* tile = new Tile; + tile->read(reader); + + while(tile->id >= tiles.size()) { + tiles.push_back(0); + } + tiles[tile->id] = tile; + } + else if (strcmp(lisp_symbol(lisp_car(element)), "tileset") == 0) + { + LispReader reader(lisp_cdr(element)); + std::string filename; + reader.read_string("file", filename); + filename = datadir + "/images/tilesets/" + filename; + load_tileset(filename); + } + else if (strcmp(lisp_symbol(lisp_car(element)), "tilegroup") == 0) + { + TileGroup new_; + LispReader reader(lisp_cdr(element)); + reader.read_string("name", new_.name); + reader.read_int_vector("tiles", new_.tiles); + tilegroups.insert(new_).first; + } + else if (strcmp(lisp_symbol(lisp_car(element)), "properties") == 0) + { + LispReader reader(lisp_cdr(element)); + reader.read_int("id", tileset_id); + tileset_id *= 1000; + } + else + { + std::cerr << "Unknown symbol: " << + lisp_symbol(lisp_car(element)) << "\n"; + } + + cur = lisp_cdr(cur); } + + lisp_free(root_obj); + current_tileset = filename; } -/* EOF */