Mercurial > mhrok
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]
