view src/tilemap.d @ 3:a9af6ec19195

working map and tileset loading
author fred@reichbier.de
date Thu, 17 Jul 2008 21:34:53 +0200
parents f193d0c14685
children 292df259cc85
line wrap: on
line source

module tilemap;

import tango.math.Math;

import dsfml.window.all;
import dsfml.system.all;
import dsfml.graphics.all;

import tileset;

typedef Sprite[] SpriteArray;

class Tilemap {
    public int[int][int][int] map; // Layer: x: y: Tile-ID
    public Vector2i[int] layer_tsizes; // Layer: Tile size
    private Tileset tileset;
    public int width, height, tilewidth, tileheight;

    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;
    }

    Vector2i real_to_tile(int layer, int real_x, int real_y) {
	return Vector2i(rndint(floor(real_x / this.layer_tsizes[layer].x)), rndint(floor(real_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);
    }

    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]) {
			    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;	
    }
}