changeset 133:79e1888573d3

A box.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 02 Sep 2013 18:05:03 +0200
parents e1ef3727b7f8
children 2e1059b1a247
files nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 3 files changed, 47 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Mon Sep 02 17:44:27 2013 +0200
+++ b/nagslang/game_object.py	Mon Sep 02 18:05:03 2013 +0200
@@ -5,7 +5,7 @@
 import pymunk.pygame_util
 
 from nagslang.constants import (
-    SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, ZORDER_LOW)
+    SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, COLLISION_TYPE_BOX, ZORDER_LOW)
 from nagslang.options import options
 
 
@@ -174,7 +174,13 @@
         super(FacingImageRenderer, self).render(surface)
 
 
-class ShapeStateRenderer(Renderer):
+class ShapeRenderer(Renderer):
+    def render(self, surface):
+        self._render_shape(surface)
+        super(ShapeRenderer, self).render(surface)
+
+
+class ShapeStateRenderer(ShapeRenderer):
     """Renders the shape in a different colour depending on the state.
 
     Requires the game object it's attached to to have a puzzler.
@@ -186,10 +192,25 @@
             color = pygame.color.THECOLORS['red']
 
         self.game_object.get_shape().color = color
-        self._render_shape(surface)
         super(ShapeStateRenderer, self).render(surface)
 
 
+def damping_velocity_func(body, gravity, damping, dt):
+    """Apply custom damping to this body's velocity.
+    """
+    damping = getattr(body, 'damping', damping)
+    return pymunk.Body.update_velocity(body, gravity, damping, dt)
+
+
+def make_body(mass, moment, position, damping=None):
+    body = pymunk.Body(mass, moment)
+    body.position = position
+    if damping is not None:
+        body.damping = damping
+        body.velocity_func = damping_velocity_func
+    return body
+
+
 class GameObject(object):
     """A representation of a thing in the game world.
 
@@ -249,3 +270,15 @@
             ShapeStateRenderer(),
             StateProxyPuzzler(state_source),
         )
+
+
+class Box(GameObject):
+    def __init__(self, space, position):
+        body = make_body(10, 10000, position, damping=0.5)
+        self.shape = pymunk.Poly(
+            body, [(-20, -20), (20, -20), (20, 20), (-20, 20)])
+        self.shape.collision_type = COLLISION_TYPE_BOX
+        super(Box, self).__init__(
+            SingleShapePhysicser(space, self.shape),
+            ShapeRenderer(),
+        )
--- a/nagslang/protagonist.py	Mon Sep 02 17:44:27 2013 +0200
+++ b/nagslang/protagonist.py	Mon Sep 02 18:05:03 2013 +0200
@@ -3,7 +3,7 @@
 
 from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID
 from nagslang.game_object import (
-    GameObject, SingleShapePhysicser, FacingImageRenderer)
+    GameObject, SingleShapePhysicser, FacingImageRenderer, make_body)
 from nagslang.mutators import FLIP_H
 from nagslang.resources import resources
 
@@ -30,9 +30,7 @@
         self.go_human()
 
     def _setup_physics(self, space, position):
-        self._body = pymunk.Body(10, pymunk.inf)
-        self._body.position = position
-        self._body.velocity_func = self.velocity_func
+        self._body = make_body(10, pymunk.inf, position, 0.8)
 
         self._shapes = {
             self.HUMAN_FORM: pymunk.Poly(
@@ -70,9 +68,6 @@
         # TODO: Update from saved state.
         return obj
 
-    def velocity_func(self, body, gravity, damping, dt):
-        return pymunk.Body.update_velocity(body, gravity, self.damping, dt)
-
     def get_render_angle(self):
         return self.angle
 
@@ -83,7 +78,7 @@
         self._body.mass = 100
         self._body.velocity_limit = 1000
         self.impulse_factor = 4000
-        self.damping = 0.9
+        self._body.damping = 0.9
         self.renderer = self._renderers[self.form]
 
     def go_human(self):
@@ -93,7 +88,7 @@
         self._body.mass = 10
         self._body.velocity_limit = 1000
         self.impulse_factor = 500
-        self.damping = 0.8
+        self._body.damping = 0.8
         self.renderer = self._renderers[self.form]
 
     def set_direction(self, dx, dy):
--- a/nagslang/screens/area.py	Mon Sep 02 17:44:27 2013 +0200
+++ b/nagslang/screens/area.py	Mon Sep 02 18:05:03 2013 +0200
@@ -6,7 +6,7 @@
 
 from nagslang.constants import ZORDER_HIGH
 from nagslang.events import ScreenChange
-from nagslang.game_object import FloorSwitch, FloorLight, PuzzleGlue
+from nagslang.game_object import FloorSwitch, FloorLight, PuzzleGlue, Box
 from nagslang.level import Level
 from nagslang.protagonist import Protagonist
 from nagslang.screens.base import Screen
@@ -71,7 +71,10 @@
         self._drawables = Drawables()
         self.add_walls()
         self.add_protagonist()
-        # TODO: Put this in a level instead:
+        self._setup_demo_objects()
+
+    def _setup_demo_objects(self):
+        # TODO: Put this in a level instead
         glue = PuzzleGlue()
         switch = FloorSwitch(self.space, (300, 400))
         light = FloorLight(self.space, (300, 500), 'switch')
@@ -83,6 +86,8 @@
         self._drawables.add(switch)
         self._drawables.add(light)
         self._drawables.add(light2)
+        box = Box(self.space, (250, 350))
+        self._drawables.add(box)
 
     def add_walls(self):
         self.walls = []