summaryrefslogtreecommitdiffstats
path: root/tileset.py
blob: fecebb1cbf61188976e93383bd11e3e3e045e949 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import struct
from xml.etree import ElementTree

import pygame

class Tileset(object):
	tilesize = 16
	RIGHT = 0
	DOWN = 1
	LEFT = 2
	UP = 3

	def __init__(self, screen):
		self.screen = screen
		image = pygame.image.load('tileset.png').convert()
		self.tileset = {
			self.RIGHT: image,
			self.UP: pygame.transform.rotate(image, 90),
			self.LEFT: pygame.transform.rotate(image, 180),
			self.DOWN: pygame.transform.rotate(image, 270),
		}
		self.tile_width, self.tile_height = image.get_size()
		self.tile_width /= self.tilesize
		self.tile_height /= self.tilesize

	def _render(self, tile_x, tile_y, pos, direction=RIGHT):
		tileset = self.tileset[direction]
		if direction == self.RIGHT:
			x, y = tile_x, tile_y
		elif direction == self.UP:
			x, y = tile_y, self.tile_width - tile_x - 1
		elif direction == self.LEFT:
			x, y = self.tile_width - tile_x - 1, self.tile_height - tile_y - 1
		elif direction == self.DOWN:
			x, y = self.tile_height -tile_y - 1, tile_x
		x *= self.tilesize
		y *= self.tilesize
		self.screen.blit(tileset, pos, (x, y, self.tilesize, self.tilesize))

	def render_person(self, pos, direction):
		self._render(0, 13, pos, direction)

	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)

	def render_level(self):
		for i, tile in enumerate(self.level_array):
			x, y = 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))