X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ftilemap.cpp;h=576cf48674c48b1ce63c52e0876ea142031c1b3f;hb=fea3446f05e1e7673607b835c269d3e8d1929ab3;hp=ec91db2120a989d934e27eb73551d4a165c386e2;hpb=d091bb359b3d5112bd3a6fb73def479bcb779b6f;p=supertux.git diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index ec91db212..576cf4867 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include #include "tilemap.hpp" #include "video/drawing_context.hpp" @@ -40,7 +40,7 @@ #include "scripting/squirrel_util.hpp" TileMap::TileMap() - : solid(false), speed(1), width(0), height(0), z_pos(0), x_offset(0), y_offset(0), + : 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), draw_target(DrawingContext::NORMAL) { @@ -48,7 +48,7 @@ TileMap::TileMap() } TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) - : solid(false), speed(1), width(-1), height(-1), z_pos(0), + : 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), @@ -61,11 +61,13 @@ TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) reader.get("name", name); reader.get("z-pos", z_pos); reader.get("solid", solid); - reader.get("speed", speed); + reader.get("speed", speed_x); + reader.get("speed-y", speed_y); - if(solid && speed != 1) { + if(solid && ((speed_x != 1) || (speed_y != 1))) { log_warning << "Speed of solid tilemap is not 1. fixing" << std::endl; - speed = 1; + speed_x = 1; + speed_y = 1; } const lisp::Lisp* pathLisp = reader.get_lisp("path"); @@ -77,12 +79,16 @@ TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) set_x_offset(v.x); set_y_offset(v.y); } - + std::string draw_target_s = "normal"; reader.get("draw-target", draw_target_s); if (draw_target_s == "normal") draw_target = DrawingContext::NORMAL; if (draw_target_s == "lightmap") draw_target = DrawingContext::LIGHTMAP; + if (reader.get("alpha", alpha)) { + current_alpha = alpha; + } + reader.get("width", width); reader.get("height", height); if(width < 0 || height < 0) @@ -101,7 +107,7 @@ TileMap::TileMap(const lisp::Lisp& reader, TileManager* new_tile_manager) } TileMap::TileMap(std::string name, int z_pos, bool solid, size_t width, size_t height) - : solid(solid), speed(1), width(0), height(0), z_pos(z_pos), + : 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) @@ -124,7 +130,8 @@ TileMap::write(lisp::Writer& writer) writer.write_int("z-pos", z_pos); writer.write_bool("solid", solid); - writer.write_float("speed", speed); + 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); @@ -145,6 +152,8 @@ TileMap::update(float elapsed_time) if (amt > 0) current_alpha = std::min(current_alpha + amt, alpha); if (amt < 0) current_alpha = std::max(current_alpha + amt, alpha); } + if ((alpha < 0.25) && (current_alpha < 0.25)) set_solid(false); + if ((alpha > 0.75) && (current_alpha > 0.75)) set_solid(true); } // if we have a path to follow, follow it @@ -158,6 +167,9 @@ TileMap::update(float elapsed_time) void TileMap::draw(DrawingContext& context) { + // skip draw if current opacity is set to 0.0 + if (current_alpha == 0.0) return; + context.push_transform(); context.push_target(); context.set_target(draw_target); @@ -167,7 +179,7 @@ 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, trans_y * speed)); + context.set_translation(Vector(trans_x * speed_x, 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 */ @@ -218,7 +230,6 @@ void TileMap::expose(HSQUIRRELVM vm, SQInteger table_idx) { if (name.empty()) return; - if (!walker.get()) return; Scripting::TileMap* interface = new Scripting::TileMap(this); expose_object(vm, table_idx, interface, name, true); } @@ -227,7 +238,6 @@ void TileMap::unexpose(HSQUIRRELVM vm, SQInteger table_idx) { if (name.empty()) return; - if (!walker.get()) return; Scripting::unexpose_object(vm, table_idx, name); } @@ -253,7 +263,7 @@ TileMap::set(int newwidth, int newheight, const std::vector&newt, } void -TileMap::resize(int new_width, int new_height) +TileMap::resize(int new_width, int new_height, int fill_id) { if(new_width < width) { // remap tiles for new width @@ -264,14 +274,14 @@ TileMap::resize(int new_width, int new_height) } } - tiles.resize(new_width * new_height); + tiles.resize(new_width * new_height, fill_id); if(new_width > width) { // remap tiles for(int y = std::min(height, new_height)-1; y >= 0; --y) { for(int x = new_width-1; x >= 0; --x) { if(x >= width) { - tiles[y * new_width + x] = 0; + tiles[y * new_width + x] = fill_id; continue; } @@ -284,6 +294,12 @@ TileMap::resize(int new_width, int new_height) width = new_width; } +void +TileMap::set_solid(bool solid) +{ + this->solid = solid; +} + const Tile* TileMap::get_tile(int x, int y) const { @@ -323,11 +339,28 @@ TileMap::change_all(uint32_t oldtile, uint32_t newtile) } } -void +void TileMap::fade(float alpha, float seconds) { this->alpha = alpha; this->remaining_fade_time = seconds; } + +void +TileMap::set_alpha(float alpha) +{ + this->alpha = alpha; + this->current_alpha = alpha; + this->remaining_fade_time = 0; + if (current_alpha < 0.25) set_solid(false); + if (current_alpha > 0.75) set_solid(true); +} + +float +TileMap::get_alpha() +{ + return this->current_alpha; +} + IMPLEMENT_FACTORY(TileMap, "tilemap");