# HG changeset patch # User Jeremy Thurgood # Date 1378137903 -7200 # Node ID 79e1888573d374e262985655d734d45d9569824b # Parent e1ef3727b7f8ac333f313d6e8705e707488f7f4c A box. diff -r e1ef3727b7f8 -r 79e1888573d3 nagslang/game_object.py --- 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(), + ) diff -r e1ef3727b7f8 -r 79e1888573d3 nagslang/protagonist.py --- 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): diff -r e1ef3727b7f8 -r 79e1888573d3 nagslang/screens/area.py --- 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 = []