summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--character.py15
-rw-r--r--level1.tmx9
-rw-r--r--tileset.py35
-rwxr-xr-xtroll8
4 files changed, 50 insertions, 17 deletions
diff --git a/character.py b/character.py
index 665bd19..7ac8aad 100644
--- a/character.py
+++ b/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
diff --git a/level1.tmx b/level1.tmx
index 8c236dc..69e70e4 100644
--- a/level1.tmx
+++ b/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>
diff --git a/tileset.py b/tileset.py
index fecebb1..95473e3 100644
--- a/tileset.py
+++ b/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))
diff --git a/troll b/troll
index ee2f7ae..7572296 100755
--- a/troll
+++ b/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: