Mercurial > dw
changeset 27:9897f946b8cc
Monster movement
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Tue, 18 Dec 2007 02:00:14 +0100 |
| parents | c66e886826b3 |
| children | 2ccb6995d85d |
| files | lib/game.py lib/level.py monster/__init__.py monster/jello.py monster/player.py |
| diffstat | 5 files changed, 94 insertions(+), 64 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/game.py Tue Dec 18 01:05:25 2007 +0100 +++ b/lib/game.py Tue Dec 18 02:00:14 2007 +0100 @@ -23,46 +23,47 @@ self.level.player.walk(d) except MoveBump, bump: self.level.player.attack(d, bump.monster) + self.end_turn() except MoveError: Mesg(self.level.player, "blocked") + + def end_turn(self): + for monster in self.level.monsters.values(): + if not monster.dead: + try: + monster.act() + except Exception, e: + print "Monster %s acting weird!" % repr(monster) + print repr(e) + + def all_finished(self): + """Are all animations ready?""" + for sprite in self.level.sprites: + if sprite.step: + return False + return True + def main_loop(self): self.level.refresh(self.screen) av = self.level.player - hscroll = 0 - vscroll = 0 key_pressed = None while 1: # Update the screen + hscroll = 0 + vscroll = 0 + if av.rect.left<48: + hscroll = 3 + if av.rect.right>self.screen.get_width()-48: + hscroll = -3 + if av.rect.top<48: + vscroll = 2 + if av.rect.bottom>self.screen.get_height()-48: + vscroll = -2 if hscroll or vscroll: - if hscroll>2: - hs = 3 - elif hscroll<-2: - hs = -3 - else: - hs = 0 - if vscroll>1: - vs = 2 - elif vscroll<-1: - vs = -2 - else: - vs = 0 - self.level.scroll(hs, vs) - hscroll -= hs - vscroll -= vs + self.level.scroll(hscroll, vscroll) self.level.refresh(self.screen) - else: - self.level.update(self.screen) - - if av.rect.left<48: - hscroll += 48-av.rect.left - if av.rect.right>self.screen.get_width()-48: - hscroll += self.screen.get_width()-48-av.rect.right - if av.rect.top<48: - vscroll += 48-av.rect.top - if av.rect.bottom>self.screen.get_height()-48: - vscroll += self.screen.get_height()-48-av.rect.bottom - + self.level.update(self.screen) self.clock.tick(15) # Process input for event in pygame.event.get(): @@ -71,7 +72,7 @@ elif event.type==KEYDOWN: key_pressed = event.key - if av.step==0: + if self.all_finished(): keys = pygame.key.get_pressed() if keys[K_UP] or key_pressed==K_UP: self.try_walk(1)
--- a/lib/level.py Tue Dec 18 01:05:25 2007 +0100 +++ b/lib/level.py Tue Dec 18 02:00:14 2007 +0100 @@ -9,7 +9,7 @@ class Level: def __init__(self, filename): - self.creatures = sprites.SortedUpdates() + self.sprites = sprites.SortedUpdates() self.shadows = pygame.sprite.RenderUpdates() self.effects = pygame.sprite.RenderUpdates() self.scrollpos = [-48,-32] @@ -52,32 +52,27 @@ monster = module.Mob((x, y), self) return monster - def add_sprite(self, group, sprite): - group.add(sprite) + 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.creatures: + 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.shadows.draw(screen) - self.creatures.draw(screen) - self.effects.draw(screen) - + 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()) @@ -87,16 +82,17 @@ patch = self.background.subsurface(source) screen.blit(patch, rect) - def update(self, screen): + def update(self, screen, update=True): '''Redraw and update all the animated parts''' self.effects.clear(screen, self.clear_func) - self.creatures.clear(screen, self.clear_func) + self.sprites.clear(screen, self.clear_func) self.shadows.clear(screen, self.clear_func) - self.creatures.update() + self.sprites.update() self.shadows.update() self.effects.update() dirty = self.shadows.draw(screen) - dirty += self.creatures.draw(screen) + dirty += self.sprites.draw(screen) dirty += self.effects.draw(screen) - pygame.display.update(dirty) + if update: + pygame.display.update(dirty)
--- a/monster/__init__.py Tue Dec 18 01:05:25 2007 +0100 +++ b/monster/__init__.py Tue Dec 18 02:00:14 2007 +0100 @@ -32,13 +32,16 @@ pygame.sprite.Sprite.__init__(self) self.frame = 0 self.delay = 0 + self.step = 0 self.level = level self.x, self.y = pos self.h = 0 + self.dead = False self.place(pos) self.frames = read_frames(os.path.join("image", image_file)) self.shadow = Shadow(self) - self.level.add_sprite(self.level.creatures, self) + self.level.add_sprite(self) + self.anim = self.anim_stand() self.shadow.update() self.update() @@ -80,21 +83,20 @@ if self.step==15: self.rect.move_ip(0, -4) self.h += 4 - if self.step<=0: + if self.step<=1: self.die() else: self.image.set_alpha(self.step*32) - def hit(self): - Mesg(self, "-5", color=(255,0,0)) - if self.anim!= self.anim_die: - self.anim = self.anim_die - self.step = 8 - - def anim(self): + def anim_stand(self): self.animate(self.frames[0], 3) - def die(self): + def anim_walk(self): + self.rect.move_ip(delta_x[self.facing]*3, delta_y[self.facing]*2) + self.z += delta_y[self.facing]*2 + self.animate(self.frames[0], 1) + + def destroy(self): try: self.shadow.kill() except AttributeError: @@ -105,6 +107,35 @@ except KeyError: pass + def hit(self): + if self.dead: + return + Mesg(self, "-5", color=(255,0,0)) + self.die() + + def die(self): + if not self.dead: + self.dead = True + self.anim = self.anim_die + self.step += 8 + + def rotate(self, direction): + self.facing = direction + def update(self): + if self.step<=0: + if self.dead: + self.destroy() + self.anim = self.anim_stand self.anim() + if self.step>0: + self.step -= 1 + + def walk(self, direction): + self.rotate(direction) + self.move((self.x+delta_x[direction],self.y+delta_y[direction])) + self.step += 8 + self.anim = self.anim_walk + def act(self): + pass
--- a/monster/jello.py Tue Dec 18 01:05:25 2007 +0100 +++ b/monster/jello.py Tue Dec 18 02:00:14 2007 +0100 @@ -1,8 +1,17 @@ #!/usr/bin/python # -*- coding: utf-8 -*- +import random + from monster import Monster class Mob(Monster): def __init__(self, pos, level): Monster.__init__(self, pos, level, "jello.png") + + def act(self): + direction = random.randint(1, 4) + try: + self.walk(direction) + except: + pass
--- a/monster/player.py Tue Dec 18 01:05:25 2007 +0100 +++ b/monster/player.py Tue Dec 18 02:00:14 2007 +0100 @@ -8,12 +8,10 @@ class Mob(Monster): def __init__(self, pos, level): self.facing = 0 - self.step = 0 Monster.__init__(self, pos, level, "abi2.png") self.rotate(3) - self.z+=1 + self.z += 1 self.level.player = self - self.anim = self.anim_stand def anim_stand(self): self.image = self.frames[self.facing-1][0] @@ -47,12 +45,7 @@ self.facing = facing self.image = self.frames[self.facing-1][0] - def walk(self, direction): - self.rotate(direction) - self.move((self.x+delta_x[direction],self.y+delta_y[direction])) - self.step = 8 - self.anim = self.anim_walk - + def attack(self, direction, monster): self.rotate(direction) self.step = 4
