Mercurial > dw
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()
