changeset 8:d958026f72b5

Add a Display object
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 26 Feb 2012 11:19:22 +0100
parents c8ec5029a5f9
children f1b43f6480c5
files mhrok.png mhrok.py
diffstat 2 files changed, 75 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
Binary file mhrok.png has changed
--- a/mhrok.py	Sun Feb 26 10:33:26 2012 +0100
+++ b/mhrok.py	Sun Feb 26 11:19:22 2012 +0100
@@ -21,7 +21,7 @@
     animations = [[0]]
     movements = [[(0, 0)]]
 
-    def __init__(self, frames, x, y):
+    def __init__(self, frames, (x, y)):
         super(Mob, self).__init__()
         self.animation = 0
         self.frames = frames
@@ -63,7 +63,7 @@
     ]
 
 
-class PlayerCharacter(Mob):
+class Player(Mob):
     animations = [
         [0, 0, 1, 1, 0, 0, 2, 2],
         [5, 5, 6, 6, 5, 5, 7, 7],
@@ -106,73 +106,77 @@
         return sorted(self.spritedict.keys(),
                       key=lambda sprite: getattr(sprite, "depth", 0))
 
+    def move(self, (dx, dy)):
+        for sprite in self.sprites():
+            sprite.rect.move_ip(dx, dy)
+
 
 class Level(object):
-    def __init__(self, tiles, (width, height), pc):
-        self.tiles = tiles
-        self.background = pygame.Surface((width * 20 + 28, height * 12 + 36))
-        blood = self.tiles[21].copy()
-        blood.set_alpha(220)
-        for y in range(height):
-            for x in range(width):
-                self.background.blit(self.tiles[23], (x * 20 + 6, y * 12))
-                if (9*x + 5*y + 2) % (y+3) == 3:
-                    self.background.blit(blood, (x * 20 + 6, y * 12))
-        for x in range(width):
-            if x != 3:
-                self.background.blit(self.tiles[4], (x * 20 + 6, 0))
-                self.background.blit(self.tiles[14], (x * 20 + 6, height * 12 - 12))
-            else:
-                self.background.blit(self.tiles[24], (x * 20 + 6, 0))
-                self.background.blit(self.tiles[34], (x * 20 + 6, height * 12 - 12))
-        for y in range(height):
-            if y != 3:
-                self.background.blit(self.tiles[9], (6, y * 12))
-                self.background.blit(self.tiles[19], (width * 20 - 14, y * 12))
-            else:
-                self.background.blit(self.tiles[29], (6, y * 12))
-                self.background.blit(self.tiles[39], (width * 20 - 14, y * 12))
+    def __init__(self, (width, height)):
+        self.mobs = {}
+        self.width = width
+        self.height = height
+
+        self.mobs[2, 3] = Bat
+        self.mobs[4, 2] = Chest
+        self.mobs[6, 3] = Skeleton
+        self.mobs[9, 10] = Teddybear
 
 
+    def render_background(self, tiles):
+        background = pygame.Surface((self.width * 20 + 28, self.height * 12 + 36))
+        blood = tiles[21].copy()
+        blood.set_alpha(220)
+        blood2 = tiles[22].copy()
+        blood2.set_alpha(220)
+        for y in range(self.height):
+            for x in range(self.width):
+                background.blit(tiles[23], (x * 20 + 6, y * 12))
+                if (9*x + 5*y + 2) % (y+3) == 3:
+                    background.blit(blood, (x * 20 + 6, y * 12))
+                if (13*x + 5*y + 2) % (y+4) == 2:
+                    background.blit(blood2, (x * 20 + 6, y * 12))
+        for x in range(self.width):
+            if x != 3:
+                background.blit(tiles[4], (x * 20 + 6, 0))
+                background.blit(tiles[14], (x * 20 + 6, self.height * 12 - 12))
+            else:
+                background.blit(tiles[24], (x * 20 + 6, 0))
+                background.blit(tiles[34], (x * 20 + 6, self.height * 12 - 12))
+        for y in range(self.height):
+            if y != 3:
+                background.blit(tiles[9], (6, y * 12))
+                background.blit(tiles[19], (self.width * 20 - 14, y * 12))
+            else:
+                background.blit(tiles[29], (6, y * 12))
+                background.blit(tiles[39], (self.width * 20 - 14, y * 12))
+        return background
 
-class Game(object):
+    def render_sprites(self, tiles, pc):
+        sprites = SortedUpdates()
+        shadows = pygame.sprite.RenderUpdates()
+        for (x, y), Mob in self.mobs.iteritems():
+            mob = Mob(tiles, (x, y))
+            sprites.add(mob)
+            shadows.add(Shadow(tiles, mob))
+        sprites.add(pc)
+        shadows.add(Shadow(tiles, pc))
+        return sprites, shadows
+
+
+class Display(object):
     def __init__(self):
         pygame.display.init()
-        self.screen = pygame.display.set_mode((320, 200))
+        self.screen = pygame.display.set_mode((640, 480))
         pygame.display.set_caption('Mhrok')
-        self.tiles = load_tiles('mhrok.png', 32, 32)
-        self.clock = pygame.time.Clock()
-        self.game_over = False
         self.first_draw = True
-
-        pc = PlayerCharacter(self.tiles, 0, 0)
-        self.pc = pc
-        self.level = Level(self.tiles, (15, 14), self.pc)
-
+        self.tiles = load_tiles('mhrok.png', 32, 32)
         self.background = pygame.Surface(self.screen.get_size())
-        self.background.blit(self.level.background, (0, 0))
 
-        self.sprites = SortedUpdates()
-        self.shadows = pygame.sprite.RenderUpdates()
-        self.sprites.add(pc)
-        self.shadows.add(Shadow(self.tiles, pc))
-
-        bat = Bat(self.tiles, 2, 3)
-        self.sprites.add(bat)
-        self.shadows.add(Shadow(self.tiles, bat))
-
-        chest = Chest(self.tiles, 4, 2)
-        self.sprites.add(chest)
-        self.shadows.add(Shadow(self.tiles, chest))
-
-        skeleton = Skeleton(self.tiles, 6, 3)
-        self.sprites.add(skeleton)
-        self.shadows.add(Shadow(self.tiles, skeleton))
-
-        teddy = Teddybear(self.tiles, 9, 10)
-        self.sprites.add(teddy)
-        self.shadows.add(Shadow(self.tiles, teddy))
-
+    def render_level(self, level, pc):
+        self.sprites, self.shadows = level.render_sprites(self.tiles, pc)
+        self.background.blit(level.render_background(self.tiles), (160, 140))
+        self.sprites.move((160, 140))
 
     def draw(self):
         if self.first_draw:
@@ -186,14 +190,24 @@
             self.shadows.draw(self.screen)
             dirty = self.sprites.draw(self.screen)
         pygame.display.update(dirty)
+        self.sprites.update()
+        self.shadows.update()
 
 
+class Game(object):
+    def __init__(self):
+        self.display = Display()
+        self.clock = pygame.time.Clock()
+        self.game_over = False
+
+        self.pc = Player(self.display.tiles, (0, 0))
+        self.level = Level((15, 14))
+        self.display.render_level(self.level, self.pc)
+
     def main(self):
         while not self.game_over:
             self.pc.control()
-            self.draw()
-            self.sprites.update()
-            self.shadows.update()
+            self.display.draw()
             self.clock.tick(15)
             for event in pygame.event.get():
                 if event.type == pg.QUIT or (