changeset 3:a9af6ec19195

working map and tileset loading
author fred@reichbier.de
date Thu, 17 Jul 2008 21:34:53 +0200
parents fc2f936a961c
children 292df259cc85
files bin/tileset-example.xml src/test.d src/tilemap.d src/xmlmap.d
diffstat 4 files changed, 27 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/bin/tileset-example.xml	Thu Jul 17 21:06:43 2008 +0200
+++ b/bin/tileset-example.xml	Thu Jul 17 21:34:53 2008 +0200
@@ -1,3 +1,4 @@
 <tileset version="1">
   <tile id="0" filename="grass.png" />
+  <tile id="1" filename="grass-stone-water-l.png" />
 </tileset>
--- a/src/test.d	Thu Jul 17 21:06:43 2008 +0200
+++ b/src/test.d	Thu Jul 17 21:34:53 2008 +0200
@@ -16,22 +16,10 @@
 int main(char[][] args) {
     Cache cache = new Cache("gfx");
     Tilemap map = parse_map(cache, read_file_contents("map-example.xml"));
-/*
-    Tileset tileset = new Tileset(cache);
-    Tilemap map = new Tilemap(tileset, 5, 5, 32, 32);
-    tileset.add_tile(0, "grass.png");
-    tileset.add_tile(1, "grass-stone-water-east.png");
-    for(int x=0; x < 5; x++) {
-	for(int y=0; y < 5; y++) {
-	    map.map[0][x][y] = 0;
-	}
-    }
-    map.map[1][1][1] = 1;
-
     Renderer render = new Renderer("Blubb", 600, 480, 32);
     TileConsumer consumer = new TileConsumer(render, map);
     render.add_consumer(consumer);
 
-    render.mainloop();*/
+    render.mainloop();
     return 0; 
 }
--- a/src/tilemap.d	Thu Jul 17 21:06:43 2008 +0200
+++ b/src/tilemap.d	Thu Jul 17 21:34:53 2008 +0200
@@ -12,6 +12,7 @@
 
 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;
 
@@ -23,35 +24,35 @@
 	this.tileheight = tileheight;
     }
 
-    void real_to_tile(int real_x, int real_y, inout int tile_x, inout int tile_y) {
-	tile_x = rndint(floor(real_x / this.tilewidth));
-	tile_y = rndint(floor(real_y / this.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)));
     }
 
-    void tile_to_real(int tile_x, int tile_y, inout int real_x, inout int real_y) {
-	real_x = tile_x*this.tilewidth;
-	real_y = tile_y*this.tileheight;
+    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 real_x, real_y;
+	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;
-			    tile_to_real(x, y, real_x, real_y);
-			    sprite.setX(real_x);
-			    sprite.setY(real_y);
+			    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;	
     }
--- a/src/xmlmap.d	Thu Jul 17 21:06:43 2008 +0200
+++ b/src/xmlmap.d	Thu Jul 17 21:34:53 2008 +0200
@@ -8,6 +8,9 @@
 import tango.io.Stdout; // TODO
 import tools;
 import imagecache;
+import dsfml.system.all;
+import Text = tango.text.Util;
+
 
 alias XmlPath!(char).NodeSet NodeSet;
 alias Document!(char).Node NodeImpl;
@@ -38,9 +41,20 @@
     auto tiles_node = root.child.nodes[0];
     char[] tileset_file = tiles_node.getAttribute("tileset").value;
     auto tilemap = new Tilemap(parse_tileset(cache, read_file_contents(tileset_file)), width, height, 32, 32); // TODO: variable tile size
+    int layer_id=0;
     foreach(NodeImpl layer_node; tiles_node.query["layer"].nodes) {
 	int tile_width = Integer.parse(layer_node.getAttribute("tilewidth").value);
 	int tile_height = Integer.parse(layer_node.getAttribute("tileheight").value);
+	tilemap.layer_tsizes[layer_id] = Vector2i(tile_width, tile_height);
+	char[][] content_ = Text.delimit(Text.trim(layer_node.value), ",");
+	int i=0;
+	for(int x=0; x < width; x++) {
+	    for(int y=0; y < height; y++) {
+		tilemap.map[layer_id][x][y] = Integer.parse(content_[i]);
+		i++;
+	    }
+	}
+	layer_id++;
     }
     return tilemap;
 }