view skaapsteker/sprites/base.py @ 163:98ff05be85e0

Better Item placement.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 06 Apr 2011 00:02:41 +0200
parents 663bdac80299
children 8774c170a232
line wrap: on
line source

"""Basic sprite classes."""

from pygame import Rect

from skaapsteker.physics import Sprite
from skaapsteker.constants import Layers
from skaapsteker import data


TILE_SIZE = (64, 64)

# Collision Layers (values are ids not numbers)
PC_LAYER = 0
MONSTER_LAYER = 1


class Monster(Sprite):

    image_file = None
    collision_layer = MONSTER_LAYER
    collides_with = set([PC_LAYER])

    debug_color = (240, 120, 120)

    block = True

    def __init__(self, pos, **opts):
        Sprite.__init__(self)
        self.image = data.load_image('sprites/' + self.image_file)
        self.starting_tile_pos = pos
        self.rect = self.image.get_rect(topleft=(pos[0]*TILE_SIZE[0], pos[1]*TILE_SIZE[1]))
        self.collide_rect = self.image.get_rect(topleft=(pos[0]*TILE_SIZE[0], pos[1]*TILE_SIZE[1]))
        self._layer = Layers.PLAYER
        self.setup(**opts)


    def setup(self):
        pass


class NPC(Sprite):
    pass


class Projectile(Sprite):
    gravitates = False


class Item(Sprite):
    mobile = False
    gravitates = False

    image_file = None
    collision_layer = MONSTER_LAYER
    collides_with = set([PC_LAYER])

    debug_color = (240, 0, 240)

    def __init__(self, pos, **opts):
        Sprite.__init__(self)
        self.image = data.load_image('sprites/' + self.image_file)
        self.starting_tile_pos = pos
        self.rect = self.image.get_rect(midbottom=(pos[0]*TILE_SIZE[0]+TILE_SIZE[0]/2, (pos[1]+1)*TILE_SIZE[1]))
        self.collide_rect = self.rect.move(0, 0)
        self._layer = Layers.PLAYER
        self.setup(**opts)


    def setup(self):
        pass


class Geography(Sprite):
    mobile = False
    gravitates = False
    collides_with = set([PC_LAYER, MONSTER_LAYER])
    is_ground = True
    bounce_factor = (0.0, 0.0)

    def __init__(self, pos, image):
        Sprite.__init__(self)
        self.tile_pos = pos
        self.image = image
        self.collide_rect = self.image.get_bounding_rect(1)
        self.rect = self.image.get_rect()
        self.rect_offset = self.collide_rect.left - self.rect.left, self.rect.top - self.rect.top
        self.collide_rect.topleft = pos[0] * TILE_SIZE[0] + self.rect_offset[0], pos[1] * TILE_SIZE[1] + self.rect_offset[1]
        self.rect.topleft = pos[0] * TILE_SIZE[0], pos[1] * TILE_SIZE[1]

    def get_debug_color(self):
        if self.floor or self.block:
            return (240, 240, 0)
        return (0, 240, 0)


def find_sprite(descr, mod_name=None):
    """Create a sprite object from a dictionary describing it."""
    descr = descr.copy()
    cls_name = descr.pop("type")
    if mod_name is None:
        mod_name, cls_name = cls_name.rsplit(".", 1)
    mod_name = ".".join(["skaapsteker.sprites", mod_name])
    mod =  __import__(mod_name, fromlist=[cls_name])
    cls = getattr(mod, cls_name)
    return cls(**descr)