X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ftilemap.cpp;h=a3e11eabacb0e7f1809255c753cc00e4a78e4211;hb=75acd4b141f45e851a492f089aa9ad24a9552409;hp=1c4e49031be7ea86f8453be36dfafbfffc3f593e;hpb=0d4be1a5fadf30244c41188f114f83c818ece9bc;p=supertux.git diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index 1c4e49031..a3e11eaba 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -44,7 +44,7 @@ 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), drawing_effect(NO_EFFECT), + 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) { @@ -52,7 +52,7 @@ TileMap::TileMap(const TileSet *new_tileset) 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), drawing_effect(NO_EFFECT), + 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) { @@ -95,22 +95,32 @@ TileMap::TileMap(const lisp::Lisp& reader) if(width < 0 || height < 0) throw std::runtime_error("Invalid/No width/height specified in tilemap."); - if(!reader.get_vector("tiles", tiles)) + if(!reader.get("tiles", tiles)) throw std::runtime_error("No tiles in tilemap."); if(int(tiles.size()) != width*height) { throw std::runtime_error("wrong number of tiles in tilemap."); } - // make sure all tiles used on the tilemap are loaded - for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) + bool empty = true; + + // make sure all tiles used on the tilemap are loaded and tilemap isn't empty + for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) { + if(*i != 0) { + empty = false; + } + tileset->get(*i); + } + + if(empty) + log_info << "Tilemap '" << name << "', z-pos '" << z_pos << "' is empty." << std::endl; } 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), + 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) { @@ -128,14 +138,14 @@ TileMap::write(lisp::Writer& writer) { writer.start_list("tilemap"); - writer.write_int("z-pos", z_pos); + writer.write("z-pos", z_pos); - writer.write_bool("solid", solid); - writer.write_float("speed", speed_x); - writer.write_float("speed-y", speed_y); - writer.write_int("width", width); - writer.write_int("height", height); - writer.write_int_vector("tiles", tiles); + writer.write("solid", solid); + writer.write("speed", speed_x); + writer.write("speed-y", speed_y); + writer.write("width", width); + writer.write("height", height); + writer.write("tiles", tiles); writer.end_list("tilemap"); } @@ -157,9 +167,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); } @@ -180,7 +192,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 */