Mercurial > nagslang
diff nagslang/game_object.py @ 106:bce9cd8a4a8c
FloorLight, linked to a FloorSwitch.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Mon, 02 Sep 2013 13:48:24 +0200 |
parents | 1be3eebb87c4 |
children | b90d01e4d9d4 |
line wrap: on
line diff
--- a/nagslang/game_object.py Mon Sep 02 13:29:30 2013 +0200 +++ b/nagslang/game_object.py Mon Sep 02 13:48:24 2013 +0200 @@ -8,13 +8,29 @@ from nagslang.options import options +class PuzzleGlue(object): + """Glue that holds bits of a puzzle together. + """ + def __init__(self): + self._components = {} + + def add_component(self, name, puzzler): + self._components[name] = puzzler + puzzler.set_glue(self) + + def get_state_of(self, name): + return self._components[name].get_state() + + class Puzzler(object): - def get_state(self, space): + """Behaviour specific to a puzzle component. + """ + def set_glue(self, glue): + self.glue = glue + + def get_state(self): raise NotImplementedError() - def notify(self): - pass - class FloorSwitchPuzzler(Puzzler): def __init__(self, space, shape): @@ -28,6 +44,14 @@ return False +class StateProxyPuzzler(Puzzler): + def __init__(self, state_source): + self._state_source = state_source + + def get_state(self): + return self.glue.get_state_of(self._state_source) + + class Physicser(object): def __init__(self, space): self.space = space @@ -185,3 +209,24 @@ else: self.shape.color = pygame.color.THECOLORS['red'] super(FloorSwitch, self).render(surface) + + +class FloorLight(GameObject): + def __init__(self, space, position, state_source): + body = pymunk.Body() + body.position = position + self.shape = pymunk.Circle(body, 10) + self.shape.collision_type = COLLISION_TYPE_SWITCH + self.shape.sensor = True + super(FloorLight, self).__init__( + SingleShapePhysicser(space, self.shape), + ShapeRenderer(self.shape), + StateProxyPuzzler(state_source), + ) + + def render(self, surface): + if self.puzzler.get_state(): + self.shape.color = pygame.color.THECOLORS['green'] + else: + self.shape.color = pygame.color.THECOLORS['red'] + super(FloorLight, self).render(surface)