Mercurial > projects > myrrdin
diff import/myrrdin/tilemap.d @ 5:f4b89014ad39
added moving figure stuff + animated sprites. not usable atm.
author | fred@reichbier.de |
---|---|
date | Sat, 19 Jul 2008 14:33:08 +0200 |
parents | src/tilemap.d@292df259cc85 |
children | 510541745cd1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/import/myrrdin/tilemap.d Sat Jul 19 14:33:08 2008 +0200 @@ -0,0 +1,101 @@ +/* + This file is part of myrrdin. + + myrrdin is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + myrrdin is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with myrrdin. If not, see <http://www.gnu.org/licenses/>. +*/ + +module tilemap; + +import tango.math.Math; + +import dsfml.window.all; +import dsfml.system.all; +import dsfml.graphics.all; + +import tileset; +import tango.io.Stdout; + +typedef Sprite[] SpriteArray; + +class Tilemap { + public int[int][int][int] map; // Layer: x: y: Tile-ID + public Vector2i[int] layer_tsizes; // Layer: Tile size + public Tileset tileset; + public int width, height, tilewidth, tileheight; + private View view; + + this(Tileset tileset, int width, int height, int tilewidth, int tileheight) { + this.tileset = tileset; + this.width = width; + this.height = height; + this.tilewidth = tilewidth; + this.tileheight = tileheight; + } + + /* set the view. you should do this if you use a sf::View */ + void set_view(View view) { + this.view = view; + } + + /* translate On-Screen -> With-View */ + Vector2i translate_with_view(int real_x, int real_y) { + Vector2i vec = Vector2i(real_x, real_y); + if(this.view) { + FloatRect rect = this.view.getRect(); + vec.x += rect.getLeft(); + vec.y += rect.getTop(); + } + return vec; + } + + Vector2i real_to_tile(int layer, int real_x, int real_y) { + Vector2i vec = this.translate_with_view(real_x, real_y); + return Vector2i(rndint(floor(vec.x / this.layer_tsizes[layer].x)), rndint(floor(vec.y / this.layer_tsizes[layer].y))); + } + + Vector2i tile_to_real(int layer, int tile_x, int tile_y) { + return Vector2i(tile_x*this.layer_tsizes[layer].x, tile_y*this.layer_tsizes[layer].y); + } + + bool has_tile(int layer, int x, int y) { + return (layer in this.map && x in this.map[layer] && y in this.map[layer][x]); + } + + SpriteArray get_sprites() { + SpriteArray sprites; + Sprite sprite; + int layer_id=0; + Vector2i pos; + foreach(int[int][int] layer; map) { + for(int x=0; x<width; x++) { + if(x in layer) { + for(int y=0; y<height; y++) { + if(y in layer[x]) { + if (layer[x][y] != 0) { // is no transparent tile? + sprite = new Sprite; + pos = tile_to_real(layer_id, x, y); + sprite.setX(pos.x); + sprite.setY(pos.y); + sprite.setImage(this.tileset.tiles[layer[x][y]]); + sprites ~= sprite; + } + } + } + } + } + layer_id++; + } + return sprites; + } +}