changeset 81:a1b4d09e6f23

Floor switch with horrible hackery.
author davidsharpe@lantea.local
date Sun, 01 Sep 2013 22:53:37 +0200
parents 77e66eca8093
children 11b0017b5e4b
files nagslang/constants.py nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 4 files changed, 65 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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]
--- 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
--- 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)
--- 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)
+