changeset 7:49756204d145

load the level from file
author Radomir Dopieralski <moindev@sheep.art.pl>
date Sun, 24 Aug 2008 01:21:27 +0200
parents 3a6e7753aa28
children 8d647cfd6115
files qq.py
diffstat 1 files changed, 49 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/qq.py	Sat Aug 23 23:08:24 2008 +0200
+++ b/qq.py	Sun Aug 24 01:21:27 2008 +0200
@@ -1,6 +1,8 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 
+import ConfigParser
+
 import pygame
 from pygame.locals import *
 
@@ -107,50 +109,6 @@
         self.animation.next()
 
 
-class Level:
-    def __init__(self):
-        self.items = {}
-        self.map = [
-            "xxxxxxxxxxxxxxx",
-            "x.......x.x.x.x",
-            "x......x.x.x.xx",
-            "x...@.......x.x",
-            "x......S...x.xx",
-            "x...........x.x",
-            "xx.x.x.x...x.xx",
-            "x.x.x.x.....x.x",
-            "xx.x.b.x......x",
-            "x..........S..x",
-            "xx.xx.xxx.....x",
-            "x..xx.xxx...x.x",
-            "xx.xx.xxx....xx",
-            "x.....xxx...x.x",
-            "xxxxxxxxxxxxxxx",
-        ]
-        tile_width, tile_height = 24, 16
-        tiles = load_tiles("corridor.png", tile_width, tile_height)
-        width = len(self.map[0])
-        height = len(self.map)
-        self.image = pygame.Surface((width*tile_width, height*tile_height))
-        y = 0
-        for line in self.map:
-            x = 0
-            for tile in line:
-                if self.map[y][x] != 'x':
-                    self.image.blit(tiles[0][0], (x*tile_width, y*tile_height))
-                elif y > 1 and self.map[y-1][x] != 'x':
-                    self.image.blit(tiles[0][1], (x*tile_width, y*tile_height))
-                if self.map[y][x] == 'S':
-                    self.items[(x, y)] = Skeleton
-                if self.map[y][x] == '@':
-                    self.items[(x, y)] = Player
-                if self.map[y][x] == 'b':
-                    self.items[(x, y)] = Crate
-                x += 1
-            y += 1
-
-    def draw(self, surface):
-        surface.blit(self.image, (0, 0))
 
 
 class Skeleton(Sprite):
@@ -198,6 +156,52 @@
                 self.animation = None
 
 
+class Level:
+    item_names = {
+        'player': Player,
+        'wall': 0,
+        'floor': 1,
+        'skeleton': Skeleton,
+        'crate': Crate
+    }
+    def __init__(self, filename="level.map"):
+        parser = ConfigParser.ConfigParser()
+        parser.read(filename)
+        self.items = {}
+        self.key = {}
+        self.map = parser.get("level", "map").split("\n")
+        for option in parser.options("level"):
+            if option.startswith('\\'):
+                self.key[option[1]] = parser.get("level", option).strip()
+        tile_width, tile_height = 24, 16
+        tiles = load_tiles("corridor.png", tile_width, tile_height)
+        width = len(self.map[0])
+        height = len(self.map)
+        self.image = pygame.Surface((width*tile_width, height*tile_height))
+        y = 0
+        for line in self.map:
+            x = 0
+            for c in line:
+                tile = self.item_names[self.key[c]]
+                if tile != 0:
+                    self.image.blit(tiles[0][0], (x*tile_width, y*tile_height))
+                elif y > 1 and self.get(x, y-1) != 'wall':
+                    self.image.blit(tiles[0][1], (x*tile_width, y*tile_height))
+                if tile != 1 and tile != 0:
+                    self.items[(x, y)] = tile
+                x += 1
+            y += 1
+
+    def get(self, x, y):
+        try:
+            return self.key[self.map[y][x]]
+        except IndexError:
+            return 'wall'
+
+    def draw(self, surface):
+        surface.blit(self.image, (0, 0))
+
+
 class Game:
     def __init__(self):
         self.screen = pygame.display.get_surface()
@@ -224,7 +228,7 @@
         def walk(d):
             x, y = self.player.pos
             self.player.direction = d
-            if self.level.map[y+DY[d]][x+DX[d]] != 'x':
+            if self.level.get(x+DX[d], y+DY[d]) != 'wall':
                 self.player.animation = self.player.walk_animation()
         if pressed(K_UP):
             walk(0)