view lib/sprite.py @ 59:6b9f9dcfabf1 default tip

Monster cleanup
author Radomir Dopieralski <moindev@sheep.art.pl>
date Wed, 02 Jan 2008 03:54:40 +0100
parents f0fa340b35d0
children
line wrap: on
line source

#!/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