Mercurial > skaapsteker
view skaapsteker/sprites/base.py @ 206:e2acf4663065
Move fox properties to the world
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Wed, 06 Apr 2011 23:19:08 +0200 |
parents | 0a793c4ac341 |
children | c72d9bf911fb |
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 from skaapsteker import dialogue TILE_SIZE = (64, 64) # Collision Layers (values are ids not numbers) PC_LAYER = 0 MONSTER_LAYER = 1 NPC_LAYER = 2 class GameSprite(Sprite): image_dir = 'sprites/' image_file = None def __init__(self, pos, **opts): Sprite.__init__(self) self.image = data.load_image(self.image_dir + 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.setup(**opts) class Monster(GameSprite): collision_layer = MONSTER_LAYER collides_with = set([PC_LAYER]) debug_color = (240, 120, 120) block = True def __init__(self, pos, **opts): GameSprite.__init__(self, pos, **opts) self.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2)) self._layer = Layers.PLAYER self.health = 10 self.setup(**opts) def collided_player(self): print "%s collided with player" % self class NPC(GameSprite): image_file = None collision_layer = NPC_LAYER collides_with = set([PC_LAYER]) debug_color = (240, 240, 240) block = False def __init__(self, pos, **opts): GameSprite.__init__(self, pos, **opts) self._layer = Layers.PLAYER def setup(self, name, world, dsm): self.dsm = dialogue.DSM(name, world, dsm) class Projectile(GameSprite): gravitates = False class Item(GameSprite): mobile = False gravitates = False collision_layer = MONSTER_LAYER collides_with = set([PC_LAYER]) portable = True def __init__(self, pos, **opts): GameSprite.__init__(self, pos, **opts) self._layer = Layers.PLAYER def setup(self, name, world): pass def get_debug_color(self): if self.portable: return (240, 0, 240) return (0, 0, 240) def collided_player(self): print "Player touched %s" % self class Geography(Sprite): mobile = False gravitates = False collides_with = set([PC_LAYER, MONSTER_LAYER, NPC_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.floor_rect = Rect(self.collide_rect.topleft, (self.collide_rect.width, 2)) 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.floor_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)