# HG changeset patch # User davidsharpe@lantea.local # Date 1378068817 -7200 # Node ID a1b4d09e6f23e2bb274343bb10c4067ce97cb9dd # Parent 77e66eca8093cfd6a49706014ce9e8c3cc523f8d Floor switch with horrible hackery. diff -r 77e66eca8093 -r a1b4d09e6f23 nagslang/constants.py --- a/nagslang/constants.py Sun Sep 01 22:36:49 2013 +0200 +++ b/nagslang/constants.py Sun Sep 01 22:53:37 2013 +0200 @@ -7,3 +7,11 @@ debug=False, sound=True, ) + +COLLISION_TYPE_OTHER = 0 +COLLISION_TYPE_PLAYER = 1 +COLLISION_TYPE_WALL = 2 +COLLISION_TYPE_SWITCH = 3 +COLLISION_TYPE_BOX = 4 + +SWITCH_PUSHERS = [COLLISION_TYPE_PLAYER, COLLISION_TYPE_BOX] diff -r 77e66eca8093 -r a1b4d09e6f23 nagslang/game_object.py --- a/nagslang/game_object.py Sun Sep 01 22:36:49 2013 +0200 +++ b/nagslang/game_object.py Sun Sep 01 22:53:37 2013 +0200 @@ -1,5 +1,28 @@ import math +import pygame +import pymunk + +from nagslang.constants import SWITCH_PUSHERS, COLLISION_TYPE_SWITCH + +class Puzzler(object): + def get_state(self, space): + raise NotImplementedError() + + def notify(self): + pass + + +class FloorSwitchPuzzler(Puzzler): + def __init__(self, shape): + self.shape = shape + + def get_state(self, space): + for shape in space.shape_query(self.shape): + if shape.collision_type in SWITCH_PUSHERS: + return True + return False + class Physicser(object): def add_to_space(self, space): @@ -98,11 +121,12 @@ This has a rendery thing, physicsy things and maybe some other things. """ - def __init__(self, renderer, physicser=None): + def __init__(self, renderer, physicser=None, puzzler=None): self.renderer = renderer if physicser is None: physicser = NullPhysicser() self.physicser = physicser + self.puzzler = puzzler def add_to_space(self, space): self.physicser.add_to_space(space) @@ -111,3 +135,28 @@ return self.renderer.render( surface, self.physicser.render_position(surface), self.physicser.render_angle()) + + +class FloorSwitch(GameObject): + def __init__(self, position): + body = pymunk.Body() + body.position = position + self.shape = pymunk.Circle(body, 30) + self.shape.collision_type = COLLISION_TYPE_SWITCH + self.shape.sensor = True + super(FloorSwitch, self).__init__( + ShapeRenderer(self.shape), + SingleShapePhysicser(self.shape), + FloorSwitchPuzzler(self.shape), + ) + + def add_to_space(self, space): + # XXX: Hacky hack. + self._space = space + + def render(self, surface): + if self.puzzler.get_state(self._space): + self.shape.color = pygame.color.THECOLORS['green'] + else: + self.shape.color = pygame.color.THECOLORS['red'] + super(FloorSwitch, self).render(surface) \ No newline at end of file diff -r 77e66eca8093 -r a1b4d09e6f23 nagslang/protagonist.py --- a/nagslang/protagonist.py Sun Sep 01 22:36:49 2013 +0200 +++ b/nagslang/protagonist.py Sun Sep 01 22:53:37 2013 +0200 @@ -1,6 +1,7 @@ import pymunk import pymunk.pygame_util +from nagslang.constants import COLLISION_TYPE_PLAYER from nagslang.game_object import ( GameObject, SingleShapePhysicser, FacingImageRenderer) from nagslang.mutators import FLIP_H @@ -35,6 +36,7 @@ self.shape = pymunk.Circle(self._body, 30) self.shape.elasticity = 1.0 self.shape.friction = 10.0 + self.shape.collision_type = COLLISION_TYPE_PLAYER def _get_image(self, name, *transforms): return resources.get_image('creatures', name, transforms=transforms) diff -r 77e66eca8093 -r a1b4d09e6f23 nagslang/screens/area.py --- a/nagslang/screens/area.py Sun Sep 01 22:36:49 2013 +0200 +++ b/nagslang/screens/area.py Sun Sep 01 22:53:37 2013 +0200 @@ -5,11 +5,11 @@ import pymunk.pygame_util from nagslang.events import ScreenChange +from nagslang.game_object import FloorSwitch from nagslang.level import Level from nagslang.protagonist import Protagonist from nagslang.screens.base import Screen - class ControlKeys(object): def __init__(self): self.keys_down = set() @@ -54,6 +54,8 @@ def add_protagonist(self): self.protagonist = Protagonist((400, 300)) self.protagonist.add_to_space(self.space) + self.toy_switch = FloorSwitch((300, 400)) + self.toy_switch.add_to_space(self.space) def handle_event(self, ev): if ev.type == pygame.locals.KEYDOWN: @@ -69,6 +71,7 @@ surface.blit(background, (0, 0)) #pymunk.pygame_util.draw(surface, *self.walls) self.protagonist.render(surface) + self.toy_switch.render(surface) def tick_protagonist(self): dx, dy = 0, 0 @@ -84,3 +87,4 @@ def tick(self, seconds): self.tick_protagonist() super(AreaScreen, self).tick(seconds) +