changeset 35:b554cf77c358

Moved most of display-related code to display.py
author Radomir Dopieralski <moindev@sheep.art.pl>
date Tue, 25 Dec 2007 20:20:32 +0100
parents 2ba92b87c424
children b134bc7c1679
files lib/display.py lib/game.py lib/level.py lib/monster/__init__.py lib/shadow.py lib/sprites.py main.py
diffstat 7 files changed, 44 insertions(+), 117 deletions(-) [+]
line wrap: on
line diff
--- a/lib/display.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/lib/display.py	Tue Dec 25 20:20:32 2007 +0100
@@ -4,7 +4,20 @@
 from pygame.locals import *
 import os
 
+def z_compare(a, b):
+    return a.z-b.z
+
+class SortedUpdates(pygame.sprite.RenderUpdates):
+    """Sprite group with a depth for controlling drawing order."""
+    
+    def sprites(self):
+        l = self.spritedict.keys()
+        l.sort(z_compare)
+        return l
+
 class Display:
+    """Display-related code"""
+
     def __init__(self):
         pygame.init()
         self.screen = pygame.display.set_mode((480, 320))
@@ -48,6 +61,11 @@
         self.sprites.add(sprite)
         sprite.rect.move_ip(self.scrollpos[0], self.scrollpos[1])
 
+    def place_sprites(self, sprites):
+        for sprite in sprites:
+            self.add_sprite(sprite)
+
+
     def scroll(self, dx, dy):
         """Scroll the map by specified amount"""
     
@@ -75,7 +93,7 @@
     def refresh(self):
         '''Redraw the whole level'''
         
-        screen.blit(self.background, self.scrollpos)
+        self.screen.blit(self.background, self.scrollpos)
         self.effects.clear(self.screen, self.clear_func)
         self.sprites.clear(self.screen, self.clear_func)
         self.shadows.clear(self.screen, self.clear_func)
--- a/lib/game.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/lib/game.py	Tue Dec 25 20:20:32 2007 +0100
@@ -4,22 +4,18 @@
 
 from util import *
 from level import Level
-from mesg import Mesg
-
-data_path = ""
-image_path = "image"
+import display
 
 class Game:
-    def __init__(self, data_path, image_path):
+    def __init__(self):
         # Init
-        self.data_path = data_path
-        self.image_path = image_path
-        pygame.init()
-        self.screen = pygame.display.set_mode((480, 320))
+        self.display = display.Display()
         self.clock = pygame.time.Clock()
 
         # Prapare the map 
-        self.level = Level(os.path.join(data_path, 'map.txt'), image_path)
+        self.level = Level('data/map.txt')
+        self.display.draw_map(self.level.map)
+        self.display.place_sprites(self.level.monsters.values())
 
     def try_walk(self, d):
         from monster import MoveError, MoveBump, MoveBlocked
@@ -44,13 +40,13 @@
     def all_finished(self):
         """Are all animations ready?"""
         
-        for sprite in self.level.sprites:
+        for sprite in self.display.sprites:
             if sprite.step:
                 return False
         return True
-    
+
     def main_loop(self):
-        self.level.refresh(self.screen)
+        self.display.refresh()
         av = self.level.player
         key_pressed = None
         while 1:
@@ -59,16 +55,16 @@
             vscroll = 0            
             if av.rect.left<48:
                 hscroll = 3
-            if av.rect.right>self.screen.get_width()-48:
+            if av.rect.right>self.display.screen.get_width()-48:
                 hscroll = -3
             if av.rect.top<48:
                 vscroll = 2
-            if av.rect.bottom>self.screen.get_height()-48:
+            if av.rect.bottom>self.display.screen.get_height()-48:
                 vscroll = -2
             if hscroll or vscroll:
-                self.level.scroll(hscroll, vscroll)
-                self.level.refresh(self.screen)                
-            self.level.update(self.screen)
+                self.display.scroll(hscroll, vscroll)
+                self.display.refresh()
+            self.display.update()
             self.clock.tick(15)            
             # Process input
             for event in pygame.event.get():
@@ -90,7 +86,6 @@
                 elif key_pressed==K_SPACE:
                     av.wait()
                     self.end_turn()
-
                 elif key_pressed==K_ESCAPE:
                     return
                 key_pressed = None
--- a/lib/level.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/lib/level.py	Tue Dec 25 20:20:32 2007 +0100
@@ -2,99 +2,28 @@
 from pygame.locals import *
 import os
 
-import game
 from util import *
-import sprites
 from map import Map
 
 class Level:
-    def __init__(self, filename, image_path):
-        self.image_path = image_path
-        self.sprites = sprites.SortedUpdates()
-        self.shadows = pygame.sprite.RenderUpdates()
-        self.effects = pygame.sprite.RenderUpdates()
-        self.scrollpos = [-48,-32]
+    def __init__(self, filename):
         self.map = Map(filename)
+        self.place_monsters(self.map)
+    
+    def place_monsters(self, m):
         self.monsters = {}
-        self.cache = {}
-        self.background = self.create_map(self.map)
-
-        
-    def get_image(self, filename):
-        try:
-            return self.cache[filename]
-        except KeyError:
-            filepath = os.path.join(self.image_path, filename)
-            self.cache[filename] = pygame.image.load(filepath).convert()
-            return self.cache[filename]
-    
-    def create_map(self, m):
-        '''Create background and animations.'''
-        
-        background = pygame.Surface((self.map.w*24+96, self.map.h*16+64))
-        background.fill( (0, 0, 0) )
-        x =0
-        y =0
+        x, y = 0, 0
         for line in m:
             for tile in line:
                 urls = m.map_key[tile]
                 if urls:
-                    if urls[0]:
-                        image = self.get_image(urls[0])
-                        background.blit(image , (x*24+48, y*16+32))
                     for url in urls[1:]:
-                        self.create_monster(x,y, url)
+                        monster = self.create_monster(x,y, url)
                 x += 1
             x = 0
             y += 1
-        return background
     
     def create_monster(self, x, y, kind):
         module = __import__("monster.%s" % kind, globals(), {}, ["Mob"])
         monster = module.Mob((x, y), self)
         return monster
-    
-    def add_sprite(self, sprite):
-        self.sprites.add(sprite)
-        sprite.rect.move_ip(self.scrollpos[0], self.scrollpos[1])
-
-    def scroll(self, dx, dy):
-        self.scrollpos[0] += dx
-        self.scrollpos[1] += dy
-        for sprite in self.sprites:
-            sprite.rect.move_ip(dx, dy)
-        for sprite in self.effects:
-            sprite.rect.move_ip(dx, dy)
-        for sprite in self.shadows:
-            sprite.rect.move_ip(dx, dy)
-
-    def refresh(self, screen):
-        '''Redraw the whole level'''
-
-        screen.blit(self.background, self.scrollpos)
-        self.update(screen, update=False)
-        pygame.display.update()
-
-    def clear_func(self, screen, rect):
-        source = rect.move(-self.scrollpos[0], -self.scrollpos[1])
-        source = source.clip(self.background.get_clip())
-        if source.width==0 or source.height==0:
-            patch = pygame.Surface((rect.width, rect.height+1))
-        else:
-            patch = self.background.subsurface(source)
-        screen.blit(patch, rect)
-
-    def update(self, screen, update=True):
-        '''Redraw and update all the animated parts'''
-
-        self.effects.clear(screen, self.clear_func)
-        self.sprites.clear(screen, self.clear_func)
-        self.shadows.clear(screen, self.clear_func)
-        self.sprites.update()
-        self.shadows.update()
-        self.effects.update()
-        dirty = self.shadows.draw(screen)
-        dirty += self.sprites.draw(screen)
-        dirty += self.effects.draw(screen)
-        if update:
-            pygame.display.update(dirty)
--- a/lib/monster/__init__.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/lib/monster/__init__.py	Tue Dec 25 20:20:32 2007 +0100
@@ -38,10 +38,10 @@
         self.h = 0
         self.dead = False
         self.place(pos)
-        self.shadow = Shadow(self)
-        self.level.add_sprite(self)
+#        self.shadow = Shadow(self)
+#        self.level.add_sprite(self)
         self.anim = self.anim_stand()
-        self.shadow.update()
+#        self.shadow.update()
         self.update()
 
     def place(self, pos):
--- a/lib/shadow.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/lib/shadow.py	Tue Dec 25 20:20:32 2007 +0100
@@ -21,7 +21,7 @@
         self.rect = Rect(0,0, 24, 24)
         self.sprite = sprite
         self.update()
-        sprite.level.shadows.add(self)
+        sprite.display.shadows.add(self)
 
     def update(self):
         x, y = self.sprite.rect.center
--- a/lib/sprites.py	Tue Dec 25 18:39:25 2007 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import pygame
-from pygame.locals import *
-
-
-class SortedUpdates(pygame.sprite.RenderUpdates):
-    def z_compare(self, a, b): return a.z-b.z
-    def sprites(self):
-        l = self.spritedict.keys()
-        l.sort(self.z_compare)
-        return l
--- a/main.py	Tue Dec 25 18:39:25 2007 +0100
+++ b/main.py	Tue Dec 25 20:20:32 2007 +0100
@@ -6,6 +6,4 @@
 base_path = os.path.split(os.path.abspath(sys.argv[0]))[0]
 sys.path.insert(0, os.path.join(base_path, "lib"))
 import game
-data_path = os.path.join(base_path, "data")
-image_path = os.path.join(data_path, "image")
-game.Game(data_path, image_path).main_loop()
+game.Game().main_loop()