changeset 15:d8731b40e57e

move item definitions to the level file
author Radomir Dopieralski <moindev@sheep.art.pl>
date Thu, 28 Aug 2008 14:07:12 +0200
parents 441252535ee9
children 4223254474e1
files box.png crate.png level.map qq.py
diffstat 4 files changed, 93 insertions(+), 87 deletions(-) [+]
line wrap: on
line diff
Binary file box.png has changed
Binary file crate.png has changed
--- a/level.map	Thu Aug 28 12:10:21 2008 +0200
+++ b/level.map	Thu Aug 28 14:07:12 2008 +0200
@@ -1,38 +1,58 @@
 [level]
-tileset: ground.png
-map:###.###########
-    #.......#.#.#.#
-    #.>....#.#.h.##
-    #...@.......#.#
-    #......s...#.##
-    #..............
-    ##.#.#.#...#.##
-    #...........#.#
-    ##.#.#.#......#
-    ...........s..#
-    ##.##.###..b..#
-    #..##.###.bb#.#
-    ##.##.###....##
-    #.....###...#.#
-    ###############
+tileset = ground.png
+map =   ###.###########
+        #.......#.#.#.#
+        #.>....#.#.h.##
+        #...@.......#.#
+        #......s...#.##
+        #..............
+        ##.#.#.#...#.##
+        #...........#.#
+        ##.#.#.#......#
+        ...........s..#
+        ##.##.###..b..#
+        #..##.###.bb#.#
+        ##.##.###....##
+        #.....###...#.#
+        ###############
 
 [#]
-name: wall
+name = wall
+tile = 0, 0
+pass = false
+wall = true
 
 [.]
-name: floor
+name = floor
+pass = true
+tile = 0, 3
 
 [@]
-name: player
+name = player
+pass = true
+tile = 0, 3
+player = true
+sprite = player.png
 
 [s]
-name: skeleton
+name = skeleton
+pass = false
+tile = 0, 3
+sprite = skeleton.png
 
 [>]
-name: stairs
+name = stairs
+pass = true
+tile = 3, 3
 
 [b]
-name: crate
+name = crate
+pass = false
+tile = 0, 3
+sprite = crate.png
 
 [h]
-name: house
+name = house
+tile = 0, 3
+pass = false
+sprite = house.png
--- a/qq.py	Thu Aug 28 12:10:21 2008 +0200
+++ b/qq.py	Thu Aug 28 14:07:12 2008 +0200
@@ -59,8 +59,10 @@
 class Sprite(pygame.sprite.Sprite):
     is_player = False
 
-    def __init__(self, pos=(0, 0)):
+    def __init__(self, pos=(0, 0), frames=None):
         pygame.sprite.Sprite.__init__(self)
+        if frames:
+            self.frames = frames
         self.image = self.frames[0][0]
         self.rect = self.image.get_rect()
         self.animation = self.stand_animation()
@@ -87,57 +89,36 @@
     def update(self):
         self.animation.next()
 
-class Items:
-    """ Group all the item classes together."""
-    Wall = 0
-    Floor = 1
-    Stairs = 4
 
-    class Skeleton(Sprite):
-        def __init__(self, pos):
-            self.frames = tiles("skeleton.png")
-            Sprite.__init__(self, pos)
+class Player(Sprite):
+    """ Display and animate the player character."""
+    is_player = True
 
-    class Crate(Sprite):
-        def __init__(self, pos):
-            self.frames = tiles("box.png")
-            Sprite.__init__(self, pos)
-
-
-    class House(Sprite):
-        def __init__(self, pos):
-            self.frames = tiles("house.png")
-            Sprite.__init__(self, pos)
-
+    def __init__(self, pos=(1, 1)):
+        self.frames = tiles("player.png")
+        Sprite.__init__(self, pos)
+        self.direction = 2
+        self.animation = None
+        self.image = self.frames[self.direction][0]
+        # Move it on top of all other sprites on the same tile
+        self.rect.move_ip((0, 1))
 
-    class Player(Sprite):
-        """ Display and animate the player character."""
-        is_player = True
-
-        def __init__(self, pos=(1, 1)):
-            self.frames = tiles("player.png")
-            Sprite.__init__(self, pos)
-            self.direction = 2
-            self.animation = None
-            self.image = self.frames[self.direction][0]
-            self.rect.move_ip((0, 1))
+    def walk_animation(self):
+        for frame in range(4):
+            self.image = self.frames[self.direction][frame]
+            yield None
+            self.move(3*DX[self.direction], 2*DY[self.direction])
+            yield None
+            self.move(3*DX[self.direction], 2*DY[self.direction])
 
-        def walk_animation(self):
-            for frame in range(4):
-                self.image = self.frames[self.direction][frame]
-                yield None
-                self.move(3*DX[self.direction], 2*DY[self.direction])
-                yield None
-                self.move(3*DX[self.direction], 2*DY[self.direction])
-
-        def update(self):
-            if self.animation is None:
-                self.image = self.frames[self.direction][0]
-            else:
-                try:
-                    self.animation.next()
-                except StopIteration:
-                    self.animation = None
+    def update(self):
+        if self.animation is None:
+            self.image = self.frames[self.direction][0]
+        else:
+            try:
+                self.animation.next()
+            except StopIteration:
+                self.animation = None
 
 
 class Level:
@@ -152,7 +133,7 @@
         for section in parser.sections():
             if len(section) == 1:
                 value = parser.get(section, "name")
-                self.key[section] = getattr(Items, value.capitalize())
+                self.key[section] = dict(parser.items(section))
         tile_width, tile_height = 24, 16
         self.tiles = tiles(parser.get("level", "tileset"),
                                 tile_width, tile_height)
@@ -164,15 +145,17 @@
         for line in self.map:
             x = 0
             for c in line:
-                tile = self.key[c]
-                if tile:
+                if not self.key[c].get('wall', None):
                     # floor
-                    if isinstance(tile, int):
-                        floor = tile
-                    else:
-                        floor = 1
-                        self.items[(x, y)] = tile((x, y))
-                    self.image.blit(self.tiles[floor-1][3],
+                    if 'sprite' in self.key[c]:
+                        self.items[(x, y)] = self.key[c]
+                    try:
+                        tile_x, tile_y = self.key[c]['tile'].split(',')
+                        tile_x = int(tile_x)
+                        tile_y = int(tile_y)
+                    except ValueError, KeyError:
+                        tile_x, tile_y = 0, 3
+                    self.image.blit(self.tiles[tile_x][tile_y],
                                     (x*tile_width, y*tile_height))
                 else:
                     # wall
@@ -211,8 +194,8 @@
     def __call__(self, x, y):
         """ Tell what is at this position on the map."""
         try:
-            return self.key[self.map[y][x]]
-        except IndexError:
+            return self.key[self.map[y][x]]['pass'] in ('true', 'yes', 'True', 'Yes', '1', 'on', 'On')
+        except (IndexError, AttributeError):
             return None
 
     def draw(self, surface):
@@ -232,11 +215,14 @@
         self.sprites = SortedUpdates()
         self.overlays = pygame.sprite.RenderUpdates()
         self.level = level
-        for pos, item in level.items.iteritems():
-            if item.is_player:
-                self.player = item
-            self.sprites.add(item)
-            self.shadows.add(Shadow(item))
+        for pos, tile in level.items.iteritems():
+            if tile.get("player") in ('true', '1', 'yes', 'on'):
+                sprite = Player(pos)
+                self.player = sprite
+            else:
+                sprite = Sprite(pos, tiles(tile["sprite"]))
+            self.sprites.add(sprite)
+            self.shadows.add(Shadow(sprite))
         for pos, image in level.overlays.iteritems():
             x, y = pos
             overlay = pygame.sprite.Sprite(self.overlays)