#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;
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;
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;
{
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));
/** 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;
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
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
{
{
change(int(pos.x)/32, int(pos.y)/32, newtile);
}
+
+IMPLEMENT_FACTORY(TileMap, "tilemap");