X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=9fe482fa03144ac63207556e014cb50889032d1a;hb=2236c2d6e68a9a3bbff4dd2953f868ee2aae8f6a;hp=72e9edbf9c67e8796d36107cc7aa946428ef79cd;hpb=07a60074d2369ec9f49754f15277f5242482df84;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 72e9edbf9..9fe482fa0 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -115,13 +115,12 @@ TileManager::TileManager() if (strcmp(lisp_symbol(lisp_car(element)), "tile") == 0) { int id = 0; - std::string filename = ""; Tile* tile = new Tile; tile->north = tile->east = tile->south = tile->west = true; tile->stop = true; tile->auto_walk = false; - + LispReader reader(lisp_cdr(element)); reader.read_int("id", id); @@ -148,7 +147,6 @@ TileManager::TileManager() reader.read_bool("stop", tile->stop); reader.read_bool("auto-walk", tile->auto_walk); - reader.read_string("image", filename); reader.read_string("one-way", temp); tile->one_way = BOTH_WAYS; @@ -164,9 +162,23 @@ TileManager::TileManager() tile->one_way = WEST_EAST_WAY; } - tile->sprite = new Surface( - datadir + "/images/worldmap/" + filename, - true); + std::vector filenames; + reader.read_string_vector("image", filenames); + + if(filenames.size() == 0) + std::cerr << "Warning: no image specified for tile " << id + << ".\nIgnoring...\n" << std::endl; + + for(int i = 0; i < filenames.size(); i++) + { + Surface* image = new Surface( + datadir + "/images/worldmap/" + filenames[i], true); + tile->images.push_back(image); + } + + tile->anim_speed = 25; + reader.read_int("anim-speed", tile->anim_speed); + if (id >= int(tiles.size())) tiles.resize(id+1); @@ -423,7 +435,31 @@ Tile::Tile() Tile::~Tile() { - delete sprite; + for(std::vector::iterator i = images.begin(); i != images.end(); i++) + delete *i; +} + + +void +Tile::draw(DrawingContext& context, Vector pos) +{ + // same code as from tile_manager.cpp draw_tile() + + if(!images.size()) + return; + + if(images.size() > 1) + { + size_t frame + = ((global_frame_counter*25) / anim_speed) % images.size(); + +std::cerr << "frame: " << frame << std::endl; + context.draw_surface(images[frame], pos, LAYER_TILES); + } + else if (images.size() == 1) + { + context.draw_surface(images[0], pos, LAYER_TILES); + } } //--------------------------------------------------------------------------- @@ -448,6 +484,11 @@ WorldMap::WorldMap() name = ""; music = "SALCON.MOD"; + + global_frame_counter = 0; + frame_timer.init(true); + + total_stats.reset(); } WorldMap::~WorldMap() @@ -461,6 +502,7 @@ WorldMap::~WorldMap() delete teleporterdot; } +// Don't forget to set map_filename before calling this void WorldMap::load_map() { @@ -810,6 +852,12 @@ std::cerr << "one way only\n"; void WorldMap::update(float delta) { + if(!frame_timer.check()) + { + frame_timer.start(25); + global_frame_counter++; + } + if (enter_level && !tux->is_moving()) { bool level_finished = true; @@ -1025,8 +1073,7 @@ WorldMap::draw(DrawingContext& context, const Vector& offset) for(int x = 0; x < width; ++x) { Tile* tile = at(Vector(x, y)); - context.draw_surface(tile->sprite, - Vector(x*32 + offset.x, y*32 + offset.y), LAYER_TILES); + tile->draw(context, Vector(x*32 + offset.x, y*32 + offset.y)); } for(SpecialTiles::iterator i = special_tiles.begin(); i != special_tiles.end(); ++i) @@ -1252,11 +1299,13 @@ WorldMap::loadgame(const std::string& filename) { std::cout << "loadgame: " << filename << std::endl; savegame_file = filename; - map_filename = "icyisland.stwm"; if (access(filename.c_str(), F_OK) != 0) { load_map(); + + player_status.reset(); + return; } @@ -1280,8 +1329,10 @@ WorldMap::loadgame(const std::string& filename) LispReader reader(cur); /* Get the Map filename and then load it before setting special_tile settings */ + std::string cur_map_filename = map_filename; reader.read_string("map", map_filename); - load_map(); + if(cur_map_filename != map_filename) + load_map(); reader.read_int("lives", player_status.lives); reader.read_int("distros", player_status.distros);