X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fobject%2Ftilemap.cpp;h=e845a2dbf60233dca857fde416e1766712f2583f;hb=ddc3b7ef2077567d368e244a292b41187311e8e3;hp=fd6c74dd4453ae296c66543024a96135db1169a4;hpb=ef57479f613b900b73eba8e8f4d026aae0de25cc;p=supertux.git diff --git a/src/object/tilemap.cpp b/src/object/tilemap.cpp index fd6c74dd4..e845a2dbf 100644 --- a/src/object/tilemap.cpp +++ b/src/object/tilemap.cpp @@ -30,13 +30,14 @@ #include "tile.h" #include "resources.h" #include "tile_manager.h" -#include "app/globals.h" #include "lisp/lisp.h" #include "lisp/writer.h" +#include "object_factory.h" +#include "main.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; @@ -82,11 +83,15 @@ TileMap::TileMap(const lisp::Lisp& reader) if(int(tiles.size()) != width*height) { throw std::runtime_error("wrong number of tiles in tilemap."); } + + // make sure all tiles are loaded + for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) + tilemanager->get(*i); } 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 +140,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,9 +149,11 @@ 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); - float end_x = std::min(start_x + screen->w, float(width * 32)); - float end_y = std::min(start_y + screen->h, float(height * 32)); + if(start_y < 0) start_y = 0; + float end_x = std::min(start_x + SCREEN_WIDTH, float(width * 32)); + float end_y = std::min(start_y + SCREEN_HEIGHT, float(height * 32)); start_x -= int(start_x) % 32; start_y -= int(start_y) % 32; int tsx = int(start_x / 32); // tilestartindex x @@ -162,6 +169,7 @@ TileMap::draw(DrawingContext& context) } } +#if 0 if (debug_grid) { for (pos.x = start_x; pos.x < end_x; pos.x += 32) @@ -176,6 +184,7 @@ TileMap::draw(DrawingContext& context) Color(225, 225, 225), LAYER_GUI-50); } } +#endif context.pop_transform(); } @@ -197,6 +206,10 @@ TileMap::set(int newwidth, int newheight, const std::vector&newt, solid = newsolid; if(solid) flags |= FLAG_SOLID; + + // make sure all tiles are loaded + for(Tiles::iterator i = tiles.begin(); i != tiles.end(); ++i) + tilemanager->get(*i); } void @@ -231,19 +244,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 +275,5 @@ TileMap::change_at(const Vector& pos, uint32_t newtile) { change(int(pos.x)/32, int(pos.y)/32, newtile); } + +IMPLEMENT_FACTORY(TileMap, "tilemap");