X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ftilemap.cpp;h=59557d162c4a7e3c3d76a2137f018ae0186a9ae2;hb=495f8b77cb935fe8eff81bec755efca8e34e8a99;hp=fd6c74dd4453ae296c66543024a96135db1169a4;hpb=ef57479f613b900b73eba8e8f4d026aae0de25cc;p=supertux.git diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index fd6c74dd4..59557d162 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -33,10 +33,11 @@ #include "app/globals.h" #include "lisp/lisp.h" #include "lisp/writer.h" +#include "object_factory.h" TileMap::TileMap() : solid(false), speed(1), width(0), height(0), layer(LAYER_TILES), - vertical_flip(false) + drawing_effect(0) { tilemanager = tile_manager; @@ -46,7 +47,7 @@ TileMap::TileMap() TileMap::TileMap(const lisp::Lisp& reader) : solid(false), speed(1), width(0), height(0), layer(LAYER_TILES), - vertical_flip(false) + drawing_effect(0) { tilemanager = tile_manager; @@ -86,7 +87,7 @@ TileMap::TileMap(const lisp::Lisp& reader) TileMap::TileMap(int layer_, bool solid_, size_t width_, size_t height_) : solid(solid_), speed(1), width(0), height(0), layer(layer_), - vertical_flip(false) + drawing_effect(0) { tilemanager = tile_manager; @@ -135,8 +136,8 @@ TileMap::draw(DrawingContext& context) { context.push_transform(); - if(vertical_flip) - context.set_drawing_effect(VERTICAL_FLIP); + if(drawing_effect != 0) + context.set_drawing_effect(drawing_effect); 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)); @@ -144,7 +145,9 @@ TileMap::draw(DrawingContext& context) /** if we don't round here, we'll have a 1 pixel gap on screen sometimes. * I have no idea why */ float start_x = roundf(context.get_translation().x); + if(start_x < 0) start_x = 0; float start_y = roundf(context.get_translation().y); + if(start_y < 0) start_y = 0; float end_x = std::min(start_x + screen->w, float(width * 32)); float end_y = std::min(start_y + screen->h, float(height * 32)); start_x -= int(start_x) % 32; @@ -231,19 +234,6 @@ TileMap::resize(int new_width, int new_height) width = new_width; } -void -TileMap::do_vertical_flip() -{ - // remap tiles vertically flipped - for(int y = 0; y < height / 2; ++y) { - for(int x = 0; x < width; ++x) { - std::swap(tiles[y*width + x], tiles[(((height-1)*width) - (y*width)) + x]); - } - } - - vertical_flip = true; -} - const Tile* TileMap::get_tile(int x, int y) const { @@ -275,3 +265,5 @@ TileMap::change_at(const Vector& pos, uint32_t newtile) { change(int(pos.x)/32, int(pos.y)/32, newtile); } + +IMPLEMENT_FACTORY(TileMap, "tilemap");