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()