TileManager::~TileManager()
{
- for(std::vector<Tile*>::iterator i = tiles.begin(); i != tiles.end(); ++i) {
- delete *i;
- }
+ for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i)
+ delete i->second;
delete tilegroups_;
}
return;
// free old tiles
- for(std::vector<Tile*>::iterator i = tiles.begin(); i != tiles.end(); ++i) {
- delete *i;
- }
+ for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i)
+ delete i->second;
tiles.clear();
lisp_object_t* root_obj = lisp_read_from_file(filename);
if (!root_obj)
- st_abort("Couldn't load file", filename);
+ Termination::abort("Couldn't load file", filename);
if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-tiles") == 0)
{
Tile* tile = new Tile;
int tile_id = tile->read(reader);
- if(tile_id < 0) {
+/* if(tile_id < 0) {
std::cerr
- << "Warning: parse error when reading a tile, skipping.\n";
+ << "Warning: parse error when reading a tile (id < 0), 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)
if(c == 0)
return;
- Tile& tile = get(c);
+ Tile* tile = get(c);
- if(!tile.images.size())
+ if(!tile->images.size())
return;
- if(tile.images.size() > 1)
+ 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);
+ = ((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);
}
- else if (tile.images.size() == 1)
+}
+
+Tile*
+TileManager::get(unsigned int id)
+{
+Tiles::iterator i = tiles.find(id);
+
+if(i == tiles.end())
{
- context.draw_surface(tile.images[0], pos, layer);
+ std::cerr << "Warning: Asked for a non-existing tile id. Ignoring.\n";
+ // Never return 0, but return the first tile instead so that
+ // user code doesn't have to check for NULL pointers all over
+ // the place
+ i = tiles.begin();
+ return i->second;
}
+return i->second;
}
/* EOF */