Mercurial > scrounge
changeset 17:bf688acbf1d2
added monsters
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Sun, 21 Aug 2011 22:59:11 +0200 |
| parents | 18954a799e9e |
| children | 4356dae3b3da |
| files | display.py generator.py hero.py level.py monsters.png objects.png thing.py |
| diffstat | 7 files changed, 57 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/display.py Sun Aug 21 21:25:01 2011 +0200 +++ b/display.py Sun Aug 21 22:59:11 2011 +0200 @@ -84,6 +84,7 @@ self.background.fill((0, 0, 0)) self.sprites = SortedUpdates() self.overlay = pygame.sprite.Group() + self.shadows = pygame.sprite.Group() self.key = None def _sprite_clear(self, screen, rect): @@ -113,7 +114,11 @@ pygame.rect.Rect( (-self.scroll_offset[0], -self.scroll_offset[1]), (self.screen.get_width(), self.screen.get_height()))) + 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.sprites.draw(self.screen) self._sprite_shift(self.sprites, self.scroll_offset, reverse=True) @@ -127,6 +132,10 @@ self.sprites.clear(self.screen, self._sprite_clear) self.sprites.update() + self.shadows.update() + 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) dirty = self.sprites.draw(self.screen) self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
--- a/generator.py Sun Aug 21 21:25:01 2011 +0200 +++ b/generator.py Sun Aug 21 22:59:11 2011 +0200 @@ -3,12 +3,14 @@ import random import thing +import monster class LevelGenerator(object): def __init__(self): self.map = [['x'] * 30 for i in range(30)] self.things = {} + self.monsters = {} self.rooms = [[self.make_room(x, y) for x in range(3)] for y in range(3)] for line in self.rooms: @@ -19,8 +21,9 @@ for i, c in enumerate(line): if c == 'X': line[i] = 'x' + self.make_monsters() + self.make_trash() self.make_stairs() - self.make_trash() def _random_place(self): r1 = random.choice(random.choice(self.rooms)) @@ -29,17 +32,30 @@ return x1, y1 def make_trash(self): - for i in range(25): + trash = [thing.Plant, thing.Crate] + for i in range(random.randint(5, 15)): p = self._random_place() if p not in self.things: - self.things[p] = thing.Plant(*p) + self.things[p] = random.choice(trash)(*p) + + def make_monsters(self): + for i in range(15): + p = self._random_place() + if (p not in self.monsters and + not isinstance(self.things.get(p), thing.Entrance)): + monsters = [monster.Skeleton, monster.Zombie, monster.Jack, + monster.Bat] + self.monsters[p] = random.choice(monsters)(*p) def make_stairs(self): p = self._random_place() while p in self.things: p = self._random_place() self.things[p] = thing.Entrance(*p) - x1, y1 = self._random_place() + p = self._random_place() + while p in self.things: + p = self._random_place() + x1, y1 = p self.map[y1][x1] = '>' def make_connections(self):
--- a/hero.py Sun Aug 21 21:25:01 2011 +0200 +++ b/hero.py Sun Aug 21 22:59:11 2011 +0200 @@ -28,6 +28,7 @@ def anim_walk(self, dx, dy): self.facing = self.faces[dx][dy] + self.depth = self.rect.midbottom[1] + 1 for frame in range(4): self.image = self.frames[self.facing][frame % 4] for step in range(2): @@ -37,6 +38,7 @@ def anim_blocked(self, dx, dy): self.facing = self.faces[dx][dy] + self.depth = self.rect.midbottom[1] + 1 for frame in range(4): self.image = self.frames[self.facing][frame % 4] yield @@ -59,6 +61,7 @@ def render(self, to_display): to_display.sprites.add(self.sprite) + to_display.sprites.add(thing.ShadowSprite(self.sprite)) def walk(self, level, dx, dy): if level.is_blocked(self.x + dx, self.y + dy):
--- a/level.py Sun Aug 21 21:25:01 2011 +0200 +++ b/level.py Sun Aug 21 22:59:11 2011 +0200 @@ -105,6 +105,9 @@ self.things[(t.x, t.y)] = t if isinstance(t, thing.Entrance) and self.hero is None: self.hero = hero.Hero(t.x, t.y) + self.monsters = {} + for m in gen.monsters.itervalues(): + self.monsters[(m.x, m.y)] = m def is_blocked(self, x, y): if x<0 or y<0: @@ -130,5 +133,7 @@ if tile_class is None or tile.blocks: self.flags[-1][-1] |= self.BLOCKED self.hero.render(display) - for thing in self.things.itervalues(): - thing.render(display) + for t in self.things.itervalues(): + t.render(display) + for m in self.monsters.itervalues(): + m.render(display)
--- a/thing.py Sun Aug 21 21:25:01 2011 +0200 +++ b/thing.py Sun Aug 21 22:59:11 2011 +0200 @@ -3,8 +3,21 @@ import display + +class ShadowSprite(display.Sprite): + def __init__(self, parent): + super(ShadowSprite, self).__init__(0, 0, 'objects.png', 3, 3) + self.image.set_alpha(64) + self.parent = parent + + def update(self): + depth = getattr(self.parent, 'depth', None) + self.rect.midbottom = (self.parent.rect.midbottom[0], depth) + + class Thing(object): tx, ty = 0, 1 + blocks = False def __init__(self, x, y): self.x = x @@ -14,6 +27,7 @@ self.sprite = display.Sprite(self.x, self.y, 'objects.png', self.tx, self.ty) to_display.sprites.add(self.sprite) + to_display.shadows.add(ShadowSprite(self.sprite)) class Door(Thing): @@ -22,6 +36,7 @@ def __init__(self, x, y, vertical): self.x = x self.y = y + self.blocks = True self.vertical = vertical if self.vertical: self.tx = 1 @@ -31,8 +46,9 @@ tx, ty = 3, 0 -class Bones(Thing): - tx, ty = 2, 3 +class Crate(Thing): + tx, ty = 0, 1 + blocks = True class Plant(Thing): tx, ty = 2, 2
