changeset 9:31534af99229

walls with overlays
author Radomir Dopieralski <moindev@sheep.art.pl>
date Wed, 27 Aug 2008 18:11:36 +0200
parents 8d647cfd6115
children b87fd9e8c365
files corridor.png dungeon.png level.map qq.py
diffstat 4 files changed, 53 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
Binary file corridor.png has changed
Binary file dungeon.png has changed
--- a/level.map	Sun Aug 24 01:21:44 2008 +0200
+++ b/level.map	Wed Aug 27 18:11:36 2008 +0200
@@ -4,16 +4,16 @@
 \@: player
 \S: skeleton
 \b: crate
-map:    ###############
+map:    ###.###########
         #.......#.#.#.#
         #......#.#.#.##
         #...@.......#.#
         #......s...#.##
-        #...........#.#
+        #...........#..
         ##.#.#.#...#.##
         #.#.#.#.....#.#
         ##.#.b.#......#
-        #..........s..#
+        ...........s..#
         ##.##.###.....#
         #..##.###...#.#
         ##.##.###....##
--- a/qq.py	Sun Aug 24 01:21:44 2008 +0200
+++ b/qq.py	Wed Aug 27 18:11:36 2008 +0200
@@ -109,8 +109,6 @@
         self.animation.next()
 
 
-
-
 class Skeleton(Sprite):
     frames = load_tiles("skeleton.png")
 
@@ -162,7 +160,7 @@
         'wall': 0,
         'floor': 1,
         'skeleton': Skeleton,
-        'crate': Crate
+        'crate': Crate,
     }
     def __init__(self, filename="level.map"):
         parser = ConfigParser.ConfigParser()
@@ -174,29 +172,58 @@
             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)
+        self.tiles = load_tiles("dungeon.png", tile_width, tile_height)
         width = len(self.map[0])
         height = len(self.map)
         self.image = pygame.Surface((width*tile_width, height*tile_height))
+        self.overlays = {}
         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:
+                    self.image.blit(self.tiles[0][3], (x*tile_width, y*tile_height))
+                else:
+                    if self(x, y+1):
+                        if self(x+1, y) and self(x-1, y):
+                            tile_image = self.tiles[3][2]
+                        elif self(x+1, y):
+                            tile_image = self.tiles[2][2]
+                        elif self(x-1, y):
+                            tile_image = self.tiles[0][2]
+                        else:
+                            tile_image = self.tiles[1][2]
+                    else:
+                        if self(x+1, y+1) and self(x-1, y+1):
+                            tile_image = self.tiles[3][1]
+                        elif self(x+1, y+1):
+                            tile_image = self.tiles[2][1]
+                        elif self(x-1, y+1):
+                            tile_image = self.tiles[0][1]
+                        else:
+                            tile_image = self.tiles[1][1]
+                    self.image.blit(tile_image, (x*tile_width, y*tile_height))
+                    if self(x, y-1):
+                        if self(x+1, y) and self(x-1, y):
+                            overlay_image = self.tiles[3][0]
+                        elif self(x+1, y):
+                            overlay_image = self.tiles[2][0]
+                        elif self(x-1, y):
+                            overlay_image = self.tiles[0][0]
+                        else:
+                            overlay_image = self.tiles[1][0]
+                        self.overlays[(x, y)] = overlay_image
                 if tile != 1 and tile != 0:
                     self.items[(x, y)] = tile
                 x += 1
             y += 1
 
-    def get(self, x, y):
+    def __call__(self, x, y):
         try:
-            return self.key[self.map[y][x]]
+            return self.item_names[self.key[self.map[y][x]]]
         except IndexError:
-            return 'wall'
+            return None
 
     def draw(self, surface):
         surface.blit(self.image, (0, 0))
@@ -212,13 +239,19 @@
     def use_level(self, level):
         self.shadows = pygame.sprite.RenderUpdates()
         self.sprites = SortedUpdates()
+        self.overlays = pygame.sprite.RenderUpdates()
         self.level = level
-        for pos, kind in self.level.items.iteritems():
+        for pos, kind in level.items.iteritems():
             item = kind(pos)
             if kind == Player:
                 self.player = item
             self.sprites.add(item)
             self.shadows.add(Shadow(item))
+        for pos, image in level.overlays.iteritems():
+            x, y = pos
+            overlay = pygame.sprite.Sprite(self.overlays)
+            overlay.image = image
+            overlay.rect = image.get_rect().move(x*24, y*16-16)
         self.background = self.level.image.copy()
 
     def control(self):
@@ -228,7 +261,7 @@
         def walk(d):
             x, y = self.player.pos
             self.player.direction = d
-            if self.level.get(x+DX[d], y+DY[d]) != 'wall':
+            if self.level(x+DX[d], y+DY[d]):
                 self.player.animation = self.player.walk_animation()
         if pressed(K_UP):
             walk(0)
@@ -243,6 +276,7 @@
     def main(self):
         clock = pygame.time.Clock()
         self.screen.blit(self.background, (0, 0))
+        self.overlays.draw(self.screen)
         pygame.display.flip()
         while not self.game_over:
             self.sprites.clear(self.screen, self.background)
@@ -252,8 +286,9 @@
                 self.control()
                 self.player.update()
             self.shadows.update()
-            dirty = self.shadows.draw(self.screen)
-            dirty += self.sprites.draw(self.screen)
+            self.shadows.draw(self.screen)
+            dirty = self.sprites.draw(self.screen)
+            self.overlays.draw(self.screen)
             pygame.display.update(dirty)
             clock.tick(15)
             for event in pygame.event.get():