Explorar o código

parse tiled output

raylu %!s(int64=12) %!d(string=hai) anos
pai
achega
c6f6f7a619
Modificáronse 3 ficheiros con 34 adicións e 5 borrados
  1. 9 0
      level1.tmx
  2. 4 0
      tileset.tsx
  3. 21 5
      troll

+ 9 - 0
level1.tmx

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="50" height="50" tilewidth="16" tileheight="16">
+ <tileset firstgid="1" source="tileset.tsx"/>
+ <layer name="Tile Layer 1" width="50" height="50">
+  <data encoding="base64" compression="zlib">
+   eJztzzkOgDAMBdGw07LTAhJw/xPiIkVKlAAO0jxpOhffiTEmdcrMPzVS69TpzvHGH3FZpNVp052Dh5RSZauVt4QYpck2K28JEfMfuVTcvN2lw3a+tshPLw3aIwAAAAAAAAAAAAAA+MAF4KMDZQ==
+  </data>
+ </layer>
+</map>

+ 4 - 0
tileset.tsx

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tileset name="t1" tilewidth="16" tileheight="16">
+ <image source="tileset.png" width="256" height="256"/>
+</tileset>

+ 21 - 5
troll

@@ -1,8 +1,11 @@
 #!/usr/bin/env python
 
-import pygame
+from xml.etree import ElementTree
+import struct
 import sys
 
+import pygame
+
 class Tileset(object):
 	tilesize = 16
 	RIGHT = 0
@@ -23,7 +26,7 @@ class Tileset(object):
 		self.tile_width /= self.tilesize
 		self.tile_height /= self.tilesize
 
-	def _render(self, tile_x, tile_y, pos, direction=RIGHT):
+	def render(self, tile_x, tile_y, pos, direction=RIGHT):
 		tileset = self.tileset[direction]
 		if direction == self.RIGHT:
 			x, y = tile_x, tile_y
@@ -38,15 +41,14 @@ class Tileset(object):
 		self.screen.blit(tileset, pos, (x, y, self.tilesize, self.tilesize))
 
 	def render_person(self, pos, direction):
-		self._render(0, 13, pos, direction)
+		self.render(0, 13, pos, direction)
 
-size = width, height = 640, 480
 black = (0, 0, 0)
 render_x = 0
 render_y = 13*16
 
 pygame.init()
-screen = pygame.display.set_mode(size)
+screen = pygame.display.set_mode((800, 800))
 tileset = Tileset(screen)
 clock = pygame.time.Clock()
 
@@ -66,6 +68,14 @@ def handle_event(event):
 	elif event.type == pygame.QUIT:
 		sys.exit()
 
+def load_level(): # https://bitbucket.org/r1chardj0n3s/pygame-tutorial/src/a383dd24790d/tmx.py#cl-241
+	level_data = ElementTree.parse('level1.tmx').getroot()
+	raw_data = level_data.findall('layer')[0].findall('data')[0].text.strip()
+	data = raw_data.decode('base64').decode('zlib')
+	level_array = struct.unpack('<{}i'.format(len(data)/4), data) # read as array of 4-byte ints
+	return level_array
+level_array = load_level()
+
 direction = Tileset.RIGHT
 while True:
 	clock.tick(60)
@@ -87,5 +97,11 @@ while True:
 		direction = Tileset.UP
 
 	screen.fill(black)
+	for i, tile in enumerate(level_array):
+		x, y = divmod(i, 50)
+		x *= tileset.tilesize
+		y *= tileset.tilesize
+		tile_y, tile_x = divmod(tile - 1, tileset.tilesize) # those 1-indexing fuckers
+		tileset.render(tile_x, tile_y, (y, x))
 	tileset.render_person((render_x, render_y), direction)
 	pygame.display.flip()