X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ftilemap.cpp;h=88def18534b3bcb9b8a34c4678a4c9d872122f57;hb=555d1b7bebb45326d82d934e07463209837309b0;hp=576cf48674c48b1ce63c52e0876ea142031c1b3f;hpb=5fbb18dfd418f0ffc99d757f676504b9ed1aea71;p=supertux.git diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index 576cf4867..88def1853 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -24,46 +24,47 @@ #include #include #include +#include #include "tilemap.hpp" #include "video/drawing_context.hpp" #include "level.hpp" #include "tile.hpp" #include "resources.hpp" -#include "tile_manager.hpp" #include "lisp/lisp.hpp" +#include "lisp/list_iterator.hpp" #include "lisp/writer.hpp" #include "object_factory.hpp" #include "main.hpp" #include "log.hpp" +#include "tile_set.hpp" +#include "tile_manager.hpp" #include "scripting/tilemap.hpp" #include "scripting/squirrel_util.hpp" -TileMap::TileMap() - : solid(false), speed_x(1), speed_y(1), width(0), height(0), z_pos(0), x_offset(0), y_offset(0), - drawing_effect(NO_EFFECT), alpha(1.0), current_alpha(1.0), remaining_fade_time(0), +TileMap::TileMap(const TileSet *new_tileset) + : tileset(new_tileset), solid(false), speed_x(1), speed_y(1), width(0), + height(0), z_pos(0), x_offset(0), y_offset(0), movement(Vector(0,0)), drawing_effect(NO_EFFECT), + alpha(1.0), current_alpha(1.0), remaining_fade_time(0), draw_target(DrawingContext::NORMAL) { - tilemanager = tile_manager; } -TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) - : solid(false), speed_x(1), speed_y(1), width(-1), height(-1), z_pos(0), - x_offset(0), y_offset(0), - drawing_effect(NO_EFFECT), alpha(1.0), current_alpha(1.0), - remaining_fade_time(0), +TileMap::TileMap(const lisp::Lisp& reader) + : solid(false), speed_x(1), speed_y(1), width(-1), + height(-1), z_pos(0), x_offset(0), y_offset(0), movement(Vector(0,0)), drawing_effect(NO_EFFECT), + alpha(1.0), current_alpha(1.0), remaining_fade_time(0), draw_target(DrawingContext::NORMAL) { - tilemanager = new_tile_manager; - if(tilemanager == 0) - tilemanager = tile_manager; - - reader.get("name", name); - reader.get("z-pos", z_pos); - reader.get("solid", solid); - reader.get("speed", speed_x); - reader.get("speed-y", speed_y); + tileset = current_tileset; + assert(tileset != NULL); + reader.get("name", name); + reader.get("z-pos", z_pos); + reader.get("solid", solid); + reader.get("speed", speed_x); + reader.get("speed-y", speed_y); + if(solid && ((speed_x != 1) || (speed_y != 1))) { log_warning << "Speed of solid tilemap is not 1. fixing" << std::endl; speed_x = 1; @@ -101,19 +102,19 @@ TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) throw std::runtime_error("wrong number of tiles in tilemap."); } - // make sure all tiles are loaded + // make sure all tiles used on the tilemap are loaded for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) - tilemanager->get(*i); + tileset->get(*i); } -TileMap::TileMap(std::string name, int z_pos, bool solid, size_t width, size_t height) - : solid(solid), speed_x(1), speed_y(1), width(0), height(0), z_pos(z_pos), - x_offset(0), y_offset(0), drawing_effect(NO_EFFECT), alpha(1.0), - current_alpha(1.0), remaining_fade_time(0), - draw_target(DrawingContext::NORMAL) +TileMap::TileMap(const TileSet *new_tileset, std::string name, int z_pos, + bool solid, size_t width, size_t height) + : tileset(new_tileset), solid(solid), speed_x(1), speed_y(1), width(0), + height(0), z_pos(z_pos), x_offset(0), y_offset(0), movement(Vector(0,0)), + drawing_effect(NO_EFFECT), alpha(1.0), current_alpha(1.0), + remaining_fade_time(0), draw_target(DrawingContext::NORMAL) { this->name = name; - tilemanager = tile_manager; resize(width, height); } @@ -156,9 +157,11 @@ TileMap::update(float elapsed_time) if ((alpha > 0.75) && (current_alpha > 0.75)) set_solid(true); } + movement = Vector(0,0); // if we have a path to follow, follow it if (walker.get()) { Vector v = walker->advance(elapsed_time); + movement = Vector(v.x-get_x_offset(), std::max(0.0f,v.y-get_y_offset())); set_x_offset(v.x); set_y_offset(v.y); } @@ -179,7 +182,8 @@ TileMap::draw(DrawingContext& context) float trans_x = roundf(context.get_translation().x); float trans_y = roundf(context.get_translation().y); - context.set_translation(Vector(trans_x * speed_x, trans_y * speed_y)); + context.set_translation(Vector(int(trans_x * speed_x), + int(trans_y * speed_y))); /** if we don't round here, we'll have a 1 pixel gap on screen sometimes. * I have no idea why */ @@ -195,7 +199,7 @@ TileMap::draw(DrawingContext& context) for(pos.x = start_x, tx = tsx; pos.x < end_x; pos.x += 32, ++tx) { for(pos.y = start_y, ty = tsy; pos.y < end_y; pos.y += 32, ++ty) { if ((tx < 0) || (ty < 0)) continue; - const Tile* tile = tilemanager->get(tiles[ty*width + tx]); + const Tile* tile = tileset->get(tiles[ty*width + tx]); assert(tile != 0); tile->draw(context, pos, z_pos); } @@ -259,7 +263,7 @@ TileMap::set(int newwidth, int newheight, const std::vector&newt, // make sure all tiles are loaded for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) - tilemanager->get(*i); + tileset->get(*i); } void @@ -300,21 +304,36 @@ TileMap::set_solid(bool solid) this->solid = solid; } -const Tile* -TileMap::get_tile(int x, int y) const +uint32_t +TileMap::get_tile_id(int x, int y) const { if(x < 0 || x >= width || y < 0 || y >= height) { //log_warning << "tile outside tilemap requested" << std::endl; - return tilemanager->get(0); + return 0; } - return tilemanager->get(tiles[y*width + x]); + return tiles[y*width + x]; +} + + +const Tile* +TileMap::get_tile(int x, int y) const +{ + uint32_t id = get_tile_id(x, y); + return tileset->get(id); +} + +uint32_t +TileMap::get_tile_id_at(const Vector& pos) const +{ + return get_tile_id(int(pos.x - x_offset)/32, int(pos.y - y_offset)/32); } const Tile* TileMap::get_tile_at(const Vector& pos) const { - return get_tile(int(pos.x - x_offset)/32, int(pos.y - y_offset)/32); + uint32_t id = get_tile_id_at(pos); + return tileset->get(id); } void @@ -333,10 +352,14 @@ TileMap::change_at(const Vector& pos, uint32_t newtile) void TileMap::change_all(uint32_t oldtile, uint32_t newtile) { - for (size_t x = 0; x < get_width(); x++) + for (size_t x = 0; x < get_width(); x++) { for (size_t y = 0; y < get_height(); y++) { - if (get_tile(x,y)->getID() == oldtile) change(x,y,newtile); + if (get_tile_id(x,y) != oldtile) + continue; + + change(x,y,newtile); } + } } void @@ -362,5 +385,5 @@ TileMap::get_alpha() { return this->current_alpha; } - + IMPLEMENT_FACTORY(TileMap, "tilemap");