changeset 57:f0fa340b35d0

sprite.py
author Radomir Dopieralski <moindev@sheep.art.pl>
date Wed, 02 Jan 2008 03:23:06 +0100
parents 32cfc82acef6
children 45deecf194a9
files lib/sprite.py
diffstat 1 files changed, 114 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sprite.py	Wed Jan 02 03:23:06 2008 +0100
@@ -0,0 +1,114 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+import pygame
+from pygame.locals import *
+import os
+
+from util import *
+
+class Monster(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
+