Browse Source

handle player start position in Tiled unit layer

raylu 12 years ago
parent
commit
312fcdcbf7
4 changed files with 50 additions and 17 deletions
  1. 8 7
      character.py
  2. 7 2
      level1.tmx
  3. 29 6
      tileset.py
  4. 6 2
      troll

+ 8 - 7
character.py

@@ -5,10 +5,11 @@ from tileset import Tileset
 class Character(object):
 	movement = [0, 0]
 
-	def __init__(self, tilesize):
+	def __init__(self, start_pos, tilesize):
 		self.tilesize = tilesize
-		self.render_x = 0
-		self.render_y = 13*tilesize
+		self.render_x, self.render_y = start_pos
+		self.render_x *= tilesize
+		self.render_y *= tilesize
 
 	def frame(self, keys):
 		# are we done moving?
@@ -21,18 +22,18 @@ class Character(object):
 		direction = None
 		# can we start moving?
 		if self.movement[1] == 0:
-			if keys[pygame.K_DOWN]:
+			if keys[pygame.K_DOWN] or keys[pygame.K_j]:
 				self.movement[1] = SPEED
 				direction = Tileset.DOWN
-			elif keys[pygame.K_UP]:
+			elif keys[pygame.K_UP] or keys[pygame.K_k]:
 				self.movement[1] = -SPEED
 				direction = Tileset.UP
 		if self.movement[0] == 0:
-			if keys[pygame.K_RIGHT]:
+			if keys[pygame.K_RIGHT] or keys[pygame.K_l]:
 				self.movement[0] = SPEED
 				if not self.movement[1]: # prefer up/down when moving diagonally
 					direction = Tileset.RIGHT
-			elif keys[pygame.K_LEFT]:
+			elif keys[pygame.K_LEFT] or keys[pygame.K_h]:
 				self.movement[0] = -SPEED
 				if not self.movement[1]:
 					direction = Tileset.LEFT

+ 7 - 2
level1.tmx

@@ -1,9 +1,14 @@
 <?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">
+ <layer name="level" width="50" height="50">
   <data encoding="base64" compression="zlib">
-   eJztzzkOgDAMBdGw07LTAhJw/xPiIkVKlAAO0jxpOhffiTEmdcrMPzVS69TpzvHGH3FZpNVp052Dh5RSZauVt4QYpck2K28JEfMfuVTcvN2lw3a+tshPLw3aIwAAAAAAAAAAAAAA+MAF4KMDZQ==
+   eJztmdkKwjAQRaOC25sK1vqmgtsP1P//Mm+hDyUkJQbHTsZ74UDpQud0uoTGOZnMwaLHUug80tmDCZiCGTiMW052Wo8N2IKdK9vjBM7g4srw8J+FlqpjBdbdsr+PtmemvfZVhBocI9u09WjIYwh6yIQeukIPXel7NM6Gh5V+xHgE1pXoYaUf9PhdruDmEarb3+c+RrEfxu+RtmufGnroCj10hR66otkj9H8nRug7mHqs9P+g3PGHtvGKtEdjxGPsfrwSansW4GGlH/SgBz3+2yPlnVyCh5V+0EPeI+ee1+jxTRojHlb6QQ96WPEIzQ9IkDOf8Abr0lIM
+  </data>
+ </layer>
+ <layer name="units" width="50" height="50">
+  <data encoding="base64" compression="zlib">
+   eJzt17ENADAIAzD+/6In9SOOaCWEYs8ZGJKBKgCYdz5lgD1sGgAAIJN/kGSv/bcfAIBMd/qAZRo+KQSY
   </data>
  </layer>
 </map>

+ 29 - 6
tileset.py

@@ -10,6 +10,9 @@ class Tileset(object):
 	LEFT = 2
 	UP = 3
 
+	PLAYER = 209
+	ENEMY1 = 161
+
 	def __init__(self, screen):
 		self.screen = screen
 		image = pygame.image.load('tileset.png').convert()
@@ -42,15 +45,35 @@ class Tileset(object):
 
 	def load_level(self): # 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')
-		# read as array of 4-byte ints
-		self.level_array = struct.unpack('<{}i'.format(len(data)/4), data)
+		layers = level_data.findall('layer')
+		if len(layers) != 2:
+			raise Exception('expected 2 layers: level and units')
+		loaded = {}
+		for layer in layers:
+			name = layer.attrib['name']
+			raw_data = layer.findall('data')[0].text.strip()
+			data = raw_data.decode('base64').decode('zlib')
+			# read as array of 4-byte ints
+			array = list(struct.unpack('<{}i'.format(len(data)/4), data))
+			loaded[name] = array
+		self.level_array = loaded['level']
+
+		units = {
+			self.ENEMY1: [],
+			self.PLAYER: [],
+		}
+		for i, tile in enumerate(loaded['units']):
+			if tile in units.iterkeys():
+				y, x = divmod(i, 50)
+				units[tile].append((x, y))
+		if len(units[self.PLAYER]) != 1:
+			raise Exception('expected exactly 1 player tile in units layer, found ' + str(len(units[self.PLAYER])))
+		return units
 
 	def render_level(self):
 		for i, tile in enumerate(self.level_array):
-			x, y = divmod(i, 50)
+			y, x = divmod(i, 50)
 			x *= self.tilesize
 			y *= self.tilesize
 			tile_y, tile_x = divmod(tile - 1, self.tilesize) # those 1-indexing fuckers
-			self._render(tile_x, tile_y, (y, x))
+			self._render(tile_x, tile_y, (x, y))

+ 6 - 2
troll

@@ -8,8 +8,8 @@ from character import Character
 pygame.init()
 screen = pygame.display.set_mode((800, 800))
 tileset = Tileset(screen)
-tileset.load_level()
-character = Character(tileset.tilesize)
+units = tileset.load_level()
+character = Character(units[Tileset.PLAYER][0], tileset.tilesize)
 clock = pygame.time.Clock()
 
 black = (0, 0, 0)
@@ -19,6 +19,10 @@ keys = {
 	pygame.K_RIGHT: False,
 	pygame.K_UP: False,
 	pygame.K_DOWN: False,
+	pygame.K_h: False,
+	pygame.K_j: False,
+	pygame.K_k: False,
+	pygame.K_l: False,
 }
 def handle_events(events):
 	for event in events: