diff options
-rw-r--r-- | character.py | 15 | ||||
-rw-r--r-- | level1.tmx | 9 | ||||
-rw-r--r-- | tileset.py | 35 | ||||
-rwxr-xr-x | troll | 8 |
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 @@ -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> @@ -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)) @@ -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: |