Mercurial > mamba
view mamba/sprites.py @ 183:045f6b4301eb
Water washes.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Wed, 14 Sep 2011 16:35:43 +0200 |
parents | 0a955d2536f0 |
children | 986e72d2cb4d |
line wrap: on
line source
from pygame.sprite import Sprite from mamba.data import load_image from mamba.constants import TILE_SIZE from mamba import mutators COLOURS = { 'red': mutators.RED, 'blue': mutators.BLUE, 'yellow': mutators.YELLOW, } def colour_with_fittings(image_name, tileset, colour): fittings_mutator = mutators.Overlay( "tiles/%s/%s-fittings.png" % (tileset, image_name)) return image_name, (COLOURS[colour], fittings_mutator) def tile_sizify(pos): ts_x, ts_y = TILE_SIZE p_x, p_y = pos return (ts_x * p_x, ts_y * p_y) class SpriteImageVariants(object): VARIANTS = { '....': ('-0', ()), 'X...': ('-1', (mutators.R90,)), '.X..': ('-1', (mutators.R270,)), '..X.': ('-1', (mutators.NULL,)), '...X': ('-1', (mutators.R180,)), 'XX..': ('-2o', (mutators.NULL,)), '..XX': ('-2o', (mutators.R90,)), 'X.X.': ('-2a', (mutators.R180,)), 'X..X': ('-2a', (mutators.R270,)), '.XX.': ('-2a', (mutators.R90,)), '.X.X': ('-2a', (mutators.NULL,)), '.XXX': ('-3', (mutators.R90,)), 'X.XX': ('-3', (mutators.R270,)), 'XX.X': ('-3', (mutators.NULL,)), 'XXX.': ('-3', (mutators.R180,)), 'XXXX': ('', ()), } def __init__(self, base_image_name): self.base_image_name = base_image_name def __call__(self, top, bottom, left, right): variant_str = ''.join('X' if d else '.' for d in [top, bottom, left, right]) variant_suffix, mutators = self.VARIANTS[variant_str] return (self.base_image_name + variant_suffix, mutators) class SolidSpriteImageVariants(SpriteImageVariants): VARIANTS = { '....': ('-0', ()), 'X...': ('-1', (mutators.R270,)), '.X..': ('-1', (mutators.R90,)), '..X.': ('-1', (mutators.NULL,)), '...X': ('-1', (mutators.R180,)), 'XX..': ('', ()), '..XX': ('', ()), 'X.X.': ('-2a', (mutators.R180,)), 'X..X': ('-2a', (mutators.R90,)), '.XX.': ('-2a', (mutators.R270,)), '.X.X': ('-2a', (mutators.NULL,)), '.XXX': ('', ()), 'X.XX': ('', ()), 'XX.X': ('', ()), 'XXX.': ('', ()), 'XXXX': ('', ()), } class BaseSprite(Sprite): tileset = 'common' variants_class = None variants = None name = None alive = True def __init__(self, tileset=None, image_name=None, name=None, mutators=()): super(BaseSprite, self).__init__() if name is not None: self.name = name if tileset is not None: self.tileset = tileset if image_name is not None: self.image_name = image_name self.image = self.load_image(image_name, mutators=mutators) def load_image(self, image_name, mutators=()): return load_image('tiles/%s/%s.png' % (self.tileset, image_name), mutators) def set_tile_pos(self, tile_pos): self.tile_pos = tile_pos self.rect = self.image.get_rect().move(tile_sizify(tile_pos)) def get_variant(self, top, bottom, left, right): if self.variants is None: self.variants = self.variants_class(self.image_name) return self.variants(top, bottom, left, right) def use_variant(self, *args): if self.variants_class is not None: self.image = self.load_image(*self.get_variant(*args)) class TileSprite(BaseSprite): def __init__(self, tile_char, solid=False, **kw): super(TileSprite, self).__init__(**kw) self.tile_char = tile_char self.solid = solid def get_solid(self, snake, segment): return self.solid def interact(self, snake, segment): if self.get_solid(snake, segment): snake.crash() class SingleImageTileSprite(TileSprite): image_name = None # subclasses will override this def __init__(self, **kw): kw.setdefault('image_name', self.image_name) kw.setdefault('name', self.name) super(SingleImageTileSprite, self).__init__(**kw) class DoorSprite(TileSprite): name = 'door' def __init__(self, colour, **kw): self.colour = colour super(DoorSprite, self).__init__(**kw) self.image = self.load_image( *colour_with_fittings("door", self.tileset, colour)) def get_solid(self, snake, segment): return COLOURS[self.colour] != segment._colour_overlay class EntrySprite(SingleImageTileSprite): image_name = 'arrow-r' name = 'entrance' def __init__(self, direction, **kw): self.direction = direction super(EntrySprite, self).__init__(**kw) class ExitSprite(SingleImageTileSprite): image_name = 'arrow-r' name = 'exit' class PuddleSprite(SingleImageTileSprite): image_name = 'puddle' name = 'puddle' variants_class = SolidSpriteImageVariants def __init__(self, variant=(0, 0, 0, 0), **kw): super(PuddleSprite, self).__init__(**kw) self.image = self.load_image(*self.get_variant(*variant)) def get_solid(self, snake, segment): if snake.can_swim(): print "Splishy!" return False print "Drownded. :-(" return True def interact(self, snake, segment): segment.set_colour(segment.GREEN) super(PuddleSprite, self).interact(snake, segment) class EdibleTile(SingleImageTileSprite): def interact(self, snake, segment): if not segment.is_head: return self.eat(snake) self.alive = False self.kill() def eat(self, snake): print "I'm delicious!" class BigMouse(EdibleTile): image_name = "rat-big" def eat(self, snake): print "Embiggen!" class SmallMouse(EdibleTile): image_name = "rat-small" def eat(self, snake): print "Ensmallen!" class Frog(EdibleTile): image_name = "frog" def eat(self, snake): print "Swimmery!" snake.mutate('amphibious') class Painter(TileSprite): def __init__(self, colour, **kw): super(Painter, self).__init__(**kw) self.colour = colour self.image = self.load_image( *colour_with_fittings("spray", self.tileset, colour)) def interact(self, snake, segment): print "Hissssst! *%s*" % (self.colour,) segment.set_colour(COLOURS[self.colour])