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)
Binary file mhrok/level.png has changed
--- /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)
Binary file mhrok/level.pyc has changed
--- /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