Mercurial > mhrok1
changeset 1:0593652a8283 default tip
Add a Tiled level
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 06 May 2012 00:25:58 +0200 |
| parents | 9ba84a825287 |
| children | |
| files | mhrok/asset.py mhrok/game.py mhrok/level.png mhrok/level.py mhrok/level.pyc mhrok/level1.tmx mhrok/mobs.py |
| diffstat | 7 files changed, 106 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/mhrok/asset.py Sat May 05 22:27:12 2012 +0200 +++ b/mhrok/asset.py Sun May 06 00:25:58 2012 +0200 @@ -10,52 +10,51 @@ import StringIO import pygame +import spyral PACKAGE_NAME = 'mhrok' -TILE_CACHE = {} -FONT_CACHE = {} - - -def load_tiles(filename, width, height): - try: - return TILE_CACHE[filename, width, height] - except KeyError: - image = load_image(filename) - image_width, image_height = image.get_size() - tiles = [] - for x in range(image_width/width): - for y in range(image_height/height): - rect = (x * width, y * height, width, height) - tiles.append(image.subsurface(rect)) - TILE_CACHE[filename, width, height] = tiles - return tiles -def load_image(filename): - f = StringIO.StringIO(pkgutil.get_data(PACKAGE_NAME, filename)) - return pygame.image.load(f, filename).convert() +@spyral.memoize.Memoize +def load_tiles(filename, width, height, alpha=False): + image = load_image(filename, alpha) + image_width, image_height = image.get_size() + tiles = [] + for x in range(image_width/width): + column = [] + for y in range(image_height/height): + rect = (x * width, y * height, width, height) + column.append(image.subsurface(rect)) + tiles.append(column) + return tiles +def load_image(filename, alpha=False): + f = StringIO.StringIO(load_data(filename)) + image = pygame.image.load(f, filename) + if alpha: + return image.convert_alpha() + else: + return image.convert() +def load_data(filename): + return pkgutil.get_data(PACKAGE_NAME, filename) + +@spyral.memoize.Memoize def load_font(filename, size=8): + # XXX the "right" way causes segmentation fault + # f = StringIO.StringIO(load_data(filename)) + tmpdir = tempfile.mkdtemp() + fname = os.path.join(tmpdir, filename) try: - return FONT_CACHE[filename, size] - except KeyError: - # XXX the "right" way causes segmentation fault - # f = StringIO.StringIO(pkgutil.get_data(PACKAGE_NAME, filename)) - tmpdir = tempfile.mkdtemp() - fname = os.path.join(tmpdir, filename) + with open(fname, 'wb') as f: + data = load_data(filename) + f.write(data) + font = pygame.font.Font(fname, size) + finally: try: - with open(fname, 'wb') as f: - data = pkgutil.get_data(PACKAGE_NAME, filename) - f.write(data) - font = pygame.font.Font(fname, size) - finally: - try: - os.remove(fname) - os.rmdir(tmpdir) - except: - pass - FONT_CACHE[filename, size] = font + os.remove(fname) + os.rmdir(tmpdir) + except: + pass return font -
--- a/mhrok/game.py Sat May 05 22:27:12 2012 +0200 +++ b/mhrok/game.py Sun May 06 00:25:58 2012 +0200 @@ -5,6 +5,7 @@ import spyral from mhrok import mobs +from mhrok import level BG_COLOR = (128, 128, 128) @@ -28,6 +29,8 @@ self.initialized = True bg = spyral.util.new_surface(self.size) bg.fill(BG_COLOR) + self.level = level.Level('level1.tmx') + self.level.render(bg) self.camera.set_background(bg) self.player = mobs.Player() self.group.add(self.player)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mhrok/level.py Sun May 06 00:25:58 2012 +0200 @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os + +from tiledtmxloader import tmxreader +from tiledtmxloader import helperspygame + +from mhrok import asset + + +class Parser(tmxreader.TileMapParser): + """A tmx parser that uses `asset` to load the xml.""" + + def parse(self, filename): + self.map_file_name = filename + data = asset.load_data(filename) + dom = tmxreader.minidom.parseString(data) + for node in self._get_nodes(dom.childNodes, 'map'): + world_map = self._build_world_map(node) + break + world_map.map_file_name = filename + world_map.convert() + return world_map + + +class ResourceLoader(helperspygame.ResourceLoaderPygame): + """A resource loader that uses `asset` to load images.""" + + def _load_image(self, filepath, colorkey=None): + filename = os.path.basename(filepath) + image = asset.load_image(filename) + if colorkey: + image.set_colorkey(colorkey) + return image + + +class Level(object): + def __init__(self, filename): + parser = Parser() + self.level_map = parser.parse_decode(filename) + resources = ResourceLoader() + resources.load(self.level_map) + self.layers = helperspygame.get_layers_from_map(resources) + self.renderer = helperspygame.RendererPygame() + + def render(self, surface): + w, h = surface.get_size() + self.renderer.set_camera_position_and_size(0, 0, w, h, 'topleft') + for layer in self.layers: + if layer.is_object_group: + continue + self.renderer.render_layer(surface, layer)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mhrok/level1.tmx Sun May 06 00:25:58 2012 +0200 @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<map version="1.0" orientation="orthogonal" width="20" height="20" tilewidth="32" tileheight="24"> + <tileset firstgid="1" name="level" tilewidth="32" tileheight="24"> + <image source="level.png" width="32" height="24"/> + </tileset> + <layer name="Tile Layer 1" width="20" height="20"> + <data encoding="base64" compression="zlib"> + eJxjYBgcgBEND3fzkM0kxV587qCGeYTsGGjzSAXUctdINQ/ZTELmD5R52MwerOYNNwAAtBcAhw== + </data> + </layer> +</map>
--- a/mhrok/mobs.py Sat May 05 22:27:12 2012 +0200 +++ b/mhrok/mobs.py Sun May 06 00:25:58 2012 +0200 @@ -10,7 +10,7 @@ def __init__(self): super(Player, self).__init__() self.frames = asset.load_tiles('whitey.png', 48, 48) - self.image = self.frames[0] + self.image = self.frames[0][0] self.rect.midbottom = 48, 48 self.animation = self.walk_anim(0) @@ -20,7 +20,7 @@ def walk_anim(self, face): frame = 0 while True: - self.image = self.frames[frame + 4 * face] + self.image = self.frames[face][frame] frame = (frame + 1) % 4 for i in xrange(3): yield
