Mercurial > scrounge
changeset 25:3216ed15bcbc
floating captions
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Mon, 22 Aug 2011 21:15:45 +0200 |
| parents | 81766ab43cce |
| children | 59b340afd783 |
| files | display.py generator.py hero.py main.py monster.py thing.py |
| diffstat | 6 files changed, 72 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/display.py Mon Aug 22 19:01:59 2011 +0200 +++ b/display.py Mon Aug 22 21:15:45 2011 +0200 @@ -75,6 +75,7 @@ class Display(object): def __init__(self, size=(384, 384), caption=""): pygame.display.init() + pygame.font.init() pygame.display.set_mode(size) pygame.display.set_caption(caption) self.clock = pygame.time.Clock() @@ -83,8 +84,9 @@ self.background = pygame.Surface(size) self.background.fill((0, 0, 0)) self.sprites = SortedUpdates() + self.shadows = pygame.sprite.Group() self.overlay = pygame.sprite.Group() - self.shadows = pygame.sprite.Group() + self.effects = pygame.sprite.RenderUpdates() self.key = None def _sprite_clear(self, screen, rect): @@ -114,34 +116,43 @@ pygame.rect.Rect( (-self.scroll_offset[0], -self.scroll_offset[1]), (self.screen.get_width(), self.screen.get_height()))) + self.sprites.clear(self.screen, self._sprite_clear) + self.effects.clear(self.screen, self._sprite_clear) self.shadows.update() - self.sprites.clear(self.screen, self._sprite_clear) self._sprite_shift(self.shadows, self.scroll_offset) - self.shadows.draw(self.screen) - self._sprite_shift(self.shadows, self.scroll_offset, reverse=True) self._sprite_shift(self.sprites, self.scroll_offset) + self._sprite_shift(self.overlay, self.scroll_offset) + self._sprite_shift(self.effects, self.scroll_offset) + self.shadows.draw(self.screen) self.sprites.draw(self.screen) + self.overlay.draw(self.screen) + self.effects.draw(self.screen) + self._sprite_shift(self.shadows, self.scroll_offset, reverse=True) self._sprite_shift(self.sprites, self.scroll_offset, reverse=True) - self._sprite_shift(self.overlay, self.scroll_offset) - self.overlay.draw(self.screen) self._sprite_shift(self.overlay, self.scroll_offset, reverse=True) + self._sprite_shift(self.effects, self.scroll_offset, reverse=True) pygame.display.flip() def update(self): """Update all the animated parts""" self.sprites.clear(self.screen, self._sprite_clear) + self.effects.clear(self.screen, self._sprite_clear) self.sprites.update() + self.effects.update() self.shadows.update() self._sprite_shift(self.shadows, self.scroll_offset) + self._sprite_shift(self.sprites, self.scroll_offset) + self._sprite_shift(self.overlay, self.scroll_offset) + self._sprite_shift(self.effects, self.scroll_offset) self.shadows.draw(self.screen) - self._sprite_shift(self.shadows, self.scroll_offset, reverse=True) - self._sprite_shift(self.sprites, self.scroll_offset) dirty = self.sprites.draw(self.screen) + self.overlay.draw(self.screen) + dirty += self.effects.draw(self.screen) + self._sprite_shift(self.shadows, self.scroll_offset, reverse=True) self._sprite_shift(self.sprites, self.scroll_offset, reverse=True) - self._sprite_shift(self.overlay, self.scroll_offset) - self.overlay.draw(self.screen) self._sprite_shift(self.overlay, self.scroll_offset, reverse=True) + self._sprite_shift(self.effects, self.scroll_offset, reverse=True) pygame.display.update(dirty) def tick(self, tick=20):
--- a/generator.py Mon Aug 22 19:01:59 2011 +0200 +++ b/generator.py Mon Aug 22 21:15:45 2011 +0200 @@ -93,10 +93,10 @@ y1 = r1[3] x2 = random.randint(r2[0] + 1, r2[2] - 1) y2 = r2[1] - if y1 + 1 < y2 - 1: + if y1 + 1 != y2 - 1: m = random.randint(y1 + 1, y2 - 1) else: - m = y1 + m = y1 + 1 for y in range(y1, m): self.map[y][x1] = random.choice(',;') if x1 < x2: @@ -116,10 +116,10 @@ y1 = random.randint(r1[1] + 1, r1[3] - 1) x2 = r2[0] y2 = random.randint(r2[1] + 1, r2[3] - 1) - if x1 + 1 < x2 - 1: + if x1 + 1 != x2 - 1: m = random.randint(x1 + 1, x2 - 1) else: - m = x1 + m = x1 + 1 for x in range(x1, m): self.map[y1][x] = random.choice(',;') if y1 < y2:
--- a/hero.py Mon Aug 22 19:01:59 2011 +0200 +++ b/hero.py Mon Aug 22 21:15:45 2011 +0200 @@ -73,6 +73,7 @@ class Hero(thing.Thing): def __init__(self, x=1, y=1): self.x, self.y = x, y + self.effects = [] def render(self, to_display): self.sprite = HeroSprite(self.x, self.y)
--- a/main.py Mon Aug 22 19:01:59 2011 +0200 +++ b/main.py Mon Aug 22 21:15:45 2011 +0200 @@ -34,8 +34,17 @@ hero.walk(self.level, 1, 0) end_turn = True if end_turn: - for m in self.level.monsters.values(): + monsters = self.level.monsters.values() + for m in monsters: + if m.dead: + del self.level.monsters[(m.x, m.y)] + for m in monsters: m.act(self.level) + for m in monsters: + for d, effect in enumerate(m.effects): + effect.render(self.display, delay=d * 8) + m.effects = [] + def main(self): try:
--- a/monster.py Mon Aug 22 19:01:59 2011 +0200 +++ b/monster.py Mon Aug 22 21:15:45 2011 +0200 @@ -4,6 +4,7 @@ import random import thing +import effect import display @@ -57,22 +58,51 @@ self.depth = self.rect.midbottom[1] self.image = self.frames[self.tx][0] + def anim_die(self): + image = self.frames[self.tx][0] + edge = 4 + yield + yield + for frame in range(8): + yield + self.image = image.subsurface(0, 0, 32, 32 - edge) + edge += frame + self.image.set_alpha(256 - frame * 32) + self.rect.move_ip(0, frame - 1) + self.kill() class Monster(thing.Thing): tx = 0 + max_hp = 4 def __init__(self, x, y): self.x, self.y = x, y + self.dead = False + self.effects = [] + self.hp = self.max_hp def render(self, to_display): self.sprite = MonsterSprite(self.x, self.y, self.tx) to_display.sprites.add(self.sprite) to_display.sprites.add(thing.ShadowSprite(self.sprite)) - def hit(self): - pass + def hit(self, damage=1): + self.effects.append( + effect.Caption(self.x, self.y, '%d' % (-damage), (255, 128, 16))) + self.hp -= damage + if self.hp <= 0: + self.die() + + def die(self): + self.effects.append( + effect.Caption(self.x, self.y, 'RIP', (255, 128, 16))) + self.dead = True + self.sprite.animation = self.sprite.anim_die() + self.sprite.animation.next() def act(self, level): + if self.dead: + return try: dx, dy = random.choice([(dx, dy) for (dx, dy) in (0, 1), (0, -1), (1, 0), (-1, 0)
--- a/thing.py Mon Aug 22 19:01:59 2011 +0200 +++ b/thing.py Mon Aug 22 21:15:45 2011 +0200 @@ -11,6 +11,9 @@ self.parent = parent def update(self): + if not self.parent.alive(): + self.kill() + return depth = getattr(self.parent, 'depth', None) self.rect.midbottom = (self.parent.rect.midbottom[0], depth) @@ -32,7 +35,7 @@ def anim_open(self): self.depth += 2 - for step in range(8): + for step in range(6): yield self.rect.move_ip(0, -2)
