# HG changeset patch # User Jeremy Thurgood # Date 1378056699 -7200 # Node ID a99ac95a294054b0f132b10f614234c3d2c1606a # Parent 972142c543efda11e65d96486fabf5abca5a4c08 Move protagonist object to the right place. diff -r 972142c543ef -r a99ac95a2940 nagslang/protagonist.py --- a/nagslang/protagonist.py Sun Sep 01 19:18:45 2013 +0200 +++ b/nagslang/protagonist.py Sun Sep 01 19:31:39 2013 +0200 @@ -1,6 +1,14 @@ +import pygame +import pymunk +import pymunk.pygame_util + +from nagslang.game_object import ( + GameObject, SingleShapePhysicser, FacingImageRenderer) +from nagslang.mutators import FLIP_H, BLUE +from nagslang.resources import resources -class Protagonist(object): +class Protagonist(GameObject): """Representation of our fearless protagonist. TODO: Factor out a bunch of this stuff when we need it for other objects. @@ -9,10 +17,39 @@ HUMAN_FORM = 'human' WOLF_FORM = 'wolf' - def __init__(self): + def __init__(self, position): + self._setup_physics(position) + self._setup_renderers() self.inventory = {} self.form = self.HUMAN_FORM + super(Protagonist, self).__init__( + self._renderers[self.form], SingleShapePhysicser(self.shape)) + + self.go_human() + + def _setup_physics(self, position): + self.body = pymunk.Body(10, 10000) + self.body.position = position + self.body.velocity_func = self.velocity_func + + self.shape = pymunk.Circle(self.body, 30) + self.shape.elasticity = 1.0 + self.shape.friction = 10.0 + + def _setup_renderers(self): + self._renderers = { + self.HUMAN_FORM: FacingImageRenderer( + resources.get_image( + 'creatures', 'werewolf_1.png', transforms=(BLUE,)), + resources.get_image( + 'creatures', 'werewolf_1.png', transforms=(FLIP_H, BLUE))), + self.WOLF_FORM: FacingImageRenderer( + resources.get_image('creatures', 'werewolf_1.png'), + resources.get_image( + 'creatures', 'werewolf_1.png', transforms=(FLIP_H,))), + } + @classmethod def from_saved_state(cls, saved_state): """Create an instance from the provided serialised state. @@ -21,24 +58,49 @@ # 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 go_werewolf(self): + self.form = self.WOLF_FORM + self.body.mass = 100 + self.body.moment = 10000 + self.body.velocity_limit = 1000 + self.shape.color = pygame.color.THECOLORS['red'] + self.impulse_factor = 4000 + self.damping = 0.9 + self.renderer = self._renderers[self.form] + + def go_human(self): + self.form = self.HUMAN_FORM + self.body.mass = 10 + self.body.moment = 1000 + self.body.velocity_limit = 1000 + self.shape.color = pygame.color.THECOLORS['blue'] + self.impulse_factor = 500 + self.damping = 0.8 + self.renderer = self._renderers[self.form] + + def set_direction(self, dx, dy): + if (dx, dy) == (0, 0): + return + vec = pymunk.Vec2d((dx, dy)) + self.body.angle = vec.angle + self.body.apply_impulse( + (dx * self.impulse_factor, dy * self.impulse_factor)) + + def toggle_form(self): + if self.form == self.WOLF_FORM: + self.go_human() + else: + self.go_werewolf() + def act_on(self, target): """Perform an action on the target. """ # TODO: Decide how best to do this. pass - def change_to_form(self, form): - """Change to a particular form. - - This will be a no-op if we're already in this form. - """ - pass - - def swap_form(self): - """Swap to your other form. - """ - pass - def attack(self): """Attempt to hurt something. """ diff -r 972142c543ef -r a99ac95a2940 nagslang/screens/area.py --- a/nagslang/screens/area.py Sun Sep 01 19:18:45 2013 +0200 +++ b/nagslang/screens/area.py Sun Sep 01 19:31:39 2013 +0200 @@ -4,13 +4,10 @@ import pymunk import pymunk.pygame_util -from nagslang.game_object import ( - GameObject, SingleShapePhysicser, FacingImageRenderer) -from nagslang.screens.base import Screen +from nagslang.events import ScreenChange from nagslang.level import Level -from nagslang.events import ScreenChange -from nagslang.resources import resources -from nagslang.mutators import FLIP_H +from nagslang.protagonist import Protagonist +from nagslang.screens.base import Screen class ControlKeys(object): @@ -30,61 +27,6 @@ self.key_up(ev.key) -class Protagonist(GameObject): - def __init__(self, position): - self.body = pymunk.Body(10, 10000) - self.body.position = position - self.body.velocity_func = self.velocity_func - - self.shape = pymunk.Circle(self.body, 30) - self.shape.elasticity = 1.0 - self.shape.friction = 10.0 - - super(Protagonist, self).__init__( - FacingImageRenderer( - resources.get_image('creatures', 'werewolf_1.png'), - resources.get_image( - 'creatures', 'werewolf_1.png', transforms=(FLIP_H,))), - SingleShapePhysicser(self.shape)) - - self.go_human() - - def velocity_func(self, body, gravity, damping, dt): - return pymunk.Body.update_velocity(body, gravity, self.damping, dt) - - def go_werewolf(self): - self.werewolf = True - self.body.mass = 100 - self.body.moment = 10000 - self.body.velocity_limit = 1000 - self.shape.color = pygame.color.THECOLORS['red'] - self.impulse_factor = 4000 - self.damping = 0.9 - - def go_human(self): - self.werewolf = False - self.body.mass = 10 - self.body.moment = 1000 - self.body.velocity_limit = 1000 - self.shape.color = pygame.color.THECOLORS['blue'] - self.impulse_factor = 500 - self.damping = 0.8 - - def set_direction(self, dx, dy): - if (dx, dy) == (0, 0): - return - vec = pymunk.Vec2d((dx, dy)) - self.body.angle = vec.angle - self.body.apply_impulse( - (dx * self.impulse_factor, dy * self.impulse_factor)) - - def toggle_form(self): - if self.werewolf: - self.go_human() - else: - self.go_werewolf() - - class AreaScreen(Screen): def setup(self):