changeset 65:a99ac95a2940

Move protagonist object to the right place.
author Jeremy Thurgood <firxen@gmail.com>
date Sun, 01 Sep 2013 19:31:39 +0200
parents 972142c543ef
children 8bf0459ebc56
files nagslang/protagonist.py nagslang/screens/area.py
diffstat 2 files changed, 79 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- 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.
         """
--- 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):