changeset 49:acbd199a7923

Remove references to sptites from mobs
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 11 Mar 2012 08:51:15 +0100
parents f0697a2de62a
children 4eba5962a8ba
files mhrok/__init__.py mhrok/display.py mhrok/mobs.py mhrok/rooms_level.py mhrok/sprites.py
diffstat 5 files changed, 59 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/mhrok/__init__.py	Sun Mar 11 00:27:27 2012 +0100
+++ b/mhrok/__init__.py	Sun Mar 11 08:51:15 2012 +0100
@@ -30,7 +30,7 @@
                         event.type == pg.KEYDOWN and
                         event.key == pg.K_ESCAPE):
                     self.game_over = True
-            if self.pc.sprite.animation is None:
+            if self.display.mob_sprites[id(self.pc)].animation is None:
                 if self.pc.control(self.level):
                     for mob in self.level.mobs:
                         if mob == self.pc:
@@ -40,6 +40,6 @@
                     for mob in self.level.mobs:
                         if mob == self.pc:
                             continue
-                        mob.sprite.direction = None
                 self.display.events(self.level.events)
+                self.level.events = []
 
--- a/mhrok/display.py	Sun Mar 11 00:27:27 2012 +0100
+++ b/mhrok/display.py	Sun Mar 11 08:51:15 2012 +0100
@@ -7,6 +7,7 @@
 except ImportError:
     import StringIO
 import random
+import weakref
 
 import pygame
 from pygame import locals as pg
@@ -35,13 +36,29 @@
         self.memory = pygame.Surface(self.screen.get_size(), pg.SRCALPHA)
         self.memory.fill((0, 0, 0, 255))
         self.dirty = []
+        self.mob_sprites = weakref.WeakValueDictionary()
+        self.mob_lights = weakref.WeakValueDictionary()
 
     def render_level(self, level):
-        (self.sprites,
-         self.shadows, self.visions) = render_sprites(level, self.tiles)
+        self.render_sprites(level)
         self.background.blit(render_background(level, self.tiles), (0, 0))
 
-    def light_room(self, room):
+    def render_sprites(self, level):
+        self.sprites = SortedUpdates()
+        self.shadows = pygame.sprite.RenderUpdates()
+        self.visions = pygame.sprite.LayeredDirty()
+        for mob in level.mobs:
+            sprite = mob.Sprite(self.tiles, mob.pos, mob.animation)
+            self.sprites.add(sprite)
+            self.mob_sprites[id(mob)] = sprite
+            shadow = sprites.Shadow(self.tiles, sprite)
+            self.shadows.add(shadow)
+            if mob.has_light:
+                light = sprites.Vision(sprite, 64)
+                self.visions.add(light)
+                self.mob_lights[id(mob)] = light
+
+    def light_room(self, mob, room):
         (rx, ry), (rw, rh) = room
         mx = rx * 20 + 6
         my = ry * 12 + 12
@@ -79,41 +96,52 @@
         self.visions.update()
 
     def events(self, events):
-        while events:
-            event = events.pop()
+        for event in events:
             getattr(self, 'on_%s' % event[0])(*event[1:])
 
     def on_mob_dust(self, mob, amount=4, delay=0):
         for i in xrange(amount):
-            x = mob.sprite.rect.centerx + random.randint(-8, 8)
-            y = mob.sprite.rect.centery + random.randint(-3, 3)
+            sprite = self.mob_sprites[id(mob)]
+            x = sprite.rect.centerx + random.randint(-8, 8)
+            y = sprite.rect.centery + random.randint(-3, 3)
             self.sprites.add(sprites.Dust(
                 self.tiles, (x, y), min(0, delay + random.randint(0, 4))))
 
     def on_mob_blood(self, mob, delay=0):
+        sprite = self.mob_sprites[id(mob)]
         self.sprites.add(sprites.Blood(
-            self.tiles, mob.sprite.rect.center, delay))
+            self.tiles, sprite.rect.center, delay))
 
-    def on_room_light(self, room):
-        self.light_room(room)
+    def on_room_light(self, mob, room):
+        self.light_room(mob, room)
+
+    def on_light_radius(self, mob, radius):
+        light = self.mob_lights[id(mob)]
+        light.radius = radius
 
     def on_mob_walk(self, mob, direction):
-        mob.sprite.set_animation(mob.sprite.walk_animation(direction))
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.walk_animation(direction))
 
     def on_mob_stand(self, mob, direction):
-        mob.sprite.set_animation(mob.sprite.stand_animation(direction))
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.stand_animation(direction))
 
     def on_mob_wait(self, mob, direction):
-        mob.sprite.set_animation(mob.sprite.wait_animation(direction))
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.wait_animation(direction))
 
     def on_mob_attack(self, mob, direction, other):
-        mob.sprite.set_animation(mob.sprite.attack_animation(direction))
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.attack_animation(direction))
 
     def on_mob_death(self, mob):
-        mob.sprite.set_animation(mob.sprite.death_animation())
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.death_animation())
 
     def on_mob_open(self, mob):
-        mob.sprite.set_animation(mob.sprite.open_animation())
+        sprite = self.mob_sprites[id(mob)]
+        sprite.set_animation(sprite.open_animation())
 
 
 
@@ -171,18 +199,3 @@
 
     return background
 
-def render_sprites(level, tiles):
-    sprites = SortedUpdates()
-    shadows = pygame.sprite.RenderUpdates()
-    visions = pygame.sprite.LayeredDirty()
-    for mob in level.mobs:
-        sprite, shadow, vision = mob.make_sprite(tiles)
-        if sprite:
-            sprites.add(sprite)
-        if shadow:
-            shadows.add(shadow)
-        if vision:
-            visions.add(vision)
-    return sprites, shadows, visions
-
-
--- a/mhrok/mobs.py	Sun Mar 11 00:27:27 2012 +0100
+++ b/mhrok/mobs.py	Sun Mar 11 08:51:15 2012 +0100
@@ -21,15 +21,15 @@
 
 class Mob(object):
     Sprite = sprites.MobSprite
+    has_light = False
 
     def __init__(self, (x, y)):
         self.pos = x, y
-        self.vision = None
 
     def make_sprite(self, tiles):
-        self.sprite = self.Sprite(tiles, self.pos, self.animation)
-        shadow = sprites.Shadow(tiles, self.sprite)
-        return self.sprite, shadow, None
+        sprite = self.Sprite(tiles, self.pos, self.animation)
+        shadow = sprites.Shadow(tiles, sprite)
+        return sprite, shadow, None
 
     def control(self, level):
         x, y = self.pos
@@ -98,17 +98,14 @@
 
 class Player(object):
     name = 'player'
+    has_light = True
+    Sprite = sprites.PlayerSprite
+    animation = None
 
     def place(self, (x, y)):
         self.pos = x, y
         self.direction = 3
-        self.sprite = None
 
-    def make_sprite(self, tiles):
-        self.sprite = sprites.PlayerSprite(tiles, self.pos)
-        shadow = sprites.Shadow(tiles, self.sprite)
-        self.vision = sprites.Vision(self.sprite, 64)
-        return self.sprite, shadow, self.vision
 
     def control(self, level):
 
--- a/mhrok/rooms_level.py	Sun Mar 11 00:27:27 2012 +0100
+++ b/mhrok/rooms_level.py	Sun Mar 11 08:51:15 2012 +0100
@@ -77,12 +77,12 @@
 
     def walk(self, mob, direction):
         super(Level, self).walk(mob, direction)
-        if mob.vision:
+        if mob.has_light:
             room = self.find_room(mob.pos)
             if room:
-                mob.vision.radius = 64
+                self.events.append(('light_radius', mob, 64))
                 if room not in self.lit_rooms:
                     self.lit_rooms.append(room)
-                    self.events.append(('room_light', room))
+                    self.events.append(('room_light', mob, room))
             else:
-                mob.vision.radius = 40
+                self.events.append(('light_radius', mob, 40))
--- a/mhrok/sprites.py	Sun Mar 11 00:27:27 2012 +0100
+++ b/mhrok/sprites.py	Sun Mar 11 08:51:15 2012 +0100
@@ -69,8 +69,8 @@
 
 
 class PlayerSprite(MobSprite):
-    def __init__(self, frames, (x, y)):
-        super(PlayerSprite, self).__init__(frames, (x, y), None)
+    def __init__(self, frames, (x, y), steps):
+        super(PlayerSprite, self).__init__(frames, (x, y), steps)
         self.direction = 0
         self.frames = frames
         self.image = self.frames[0]