Mercurial > dw
changeset 56:32cfc82acef6
Moved monster sprites to sprite.py
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Wed, 02 Jan 2008 03:22:44 +0100 |
| parents | 17b5a0cc33d9 |
| children | f0fa340b35d0 |
| files | lib/monster/__init__.py lib/monster/player.py |
| diffstat | 2 files changed, 116 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/monster/__init__.py Wed Jan 02 03:02:27 2008 +0100 +++ b/lib/monster/__init__.py Wed Jan 02 03:22:44 2008 +0100 @@ -23,10 +23,11 @@ return "block (%d, %d)" % (self.pos[0], self.pos[1]) class Actor(): + """Logical representation of the creature, stored on the map.""" + def __init__(self, pos, level): self.x, self.y = pos self.level = level -# self.sprite = Monster(pos, level) self.place(pos) def place(self, pos): @@ -62,6 +63,111 @@ self.sprite.anim = self.sprite.anim_walk +class Sprite(pygame.sprite.Sprite): + '''Display the animated representation of a creature''' + + def __init__(self, pos, level): + 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.anim = self.anim_stand() + self.sprite = self + self.place(pos) + self.update() + + def place(self, pos): + x, y = pos + self.move(pos) + self.z = y*16-12 + self.rect = Rect(self.x*24, self.z, 24, 24) + try: + self.shadow.update() + except AttributeError: + pass + + def move(self, pos): + x, y = pos + self.x, self.y = pos + + def animate(self, frames, delay=0): + if self.delay>=delay: + self.delay = 0 + self.frame += 1 + if self.frame>=len(frames): + self.frame = 0 + else: + self.delay += 1 + self.image = frames[self.frame] + + def anim_die(self): + self.step -= 1 + if self.step==15: + self.rect.move_ip(0, -4) + self.h += 4 + if self.step<=1: + self.die() + else: + self.image.set_alpha(self.step*32) + + def anim_stand(self): + self.animate(self.frames[0], 3) + + 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 anim_attack(self): + if self.step<=2: + dx = -delta_x[self.facing]*6 + dy = -delta_y[self.facing]*4+1 + self.h-=1 + elif self.step<=4: + dx = delta_x[self.facing]*6 + dy = delta_y[self.facing]*4-1 + self.h+=1 + else: + dx = 0 + dy = 0 + self.rect.move_ip(dx, dy) + self.animate(self.frames[0], 0) + + def die(self): + self.image = self.image.copy() + self.anim = self.anim_die + self.step = 8 + + def rotate(self, direction): + self.facing = direction + + def update(self): + if self.step<=0: + 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 wait(self): + self.rotate(3) + self.step = 8 + self.anim = self.anim_stand + + def attack(self, direction): + self.rotate(direction) + self.step = 4 + self.anim = self.anim_attack + class Monster(pygame.sprite.Sprite): '''Monsters only have two frames of animation.'''
--- a/lib/monster/player.py Wed Jan 02 03:02:27 2008 +0100 +++ b/lib/monster/player.py Wed Jan 02 03:22:44 2008 +0100 @@ -5,15 +5,17 @@ import sys from monster import MoveError, MoveBump, MoveBlocked -from monster import Monster, Actor +import monster +import sprite import mesg from util import * -class Sprite(Monster): +class Sprite(sprite.Monster): frames = read_frames(os.path.join("data", "image", "abi2.png")) + def __init__(self, pos, level): self.facing = 3 - Monster.__init__(self, pos, level) + sprite.Monster.__init__(self, pos, level) self.rotate(3) self.z += 1 @@ -48,23 +50,20 @@ self.facing = facing self.image = self.frames[self.facing-1][0] -class Mob(Actor): +class Mob(monster.Actor): name = "player" def __init__(self, pos, level): self.sprite = Sprite(pos, level) - Actor.__init__(self, pos, level) + monster.Actor.__init__(self, pos, level) self.level.player = self self.display = None def wait(self): - self.sprite.step = 8 - self.sprite.anim = self.anim_stand + self.sprite.wait() def attack(self, direction, monster): - self.sprite.rotate(direction) - self.sprite.step = 4 - self.sprite.anim = self.anim_attack + self.sprite.attack(direction) mesg.Mesg(self.display, monster.sprite, "-1", color=(255,0,0)) monster.hit()
