diff nagslang/screens/area.py @ 47:82036437ebf6

Better movement and swap between werewolf and human form with 'w' (hodgestar, decoy).
author Simon Cross <hodgestar@gmail.com>
date Sun, 01 Sep 2013 18:22:46 +0200
parents 4140780c21bc
children 94d47bfcc7bb
line wrap: on
line diff
--- a/nagslang/screens/area.py	Sun Sep 01 18:21:12 2013 +0200
+++ b/nagslang/screens/area.py	Sun Sep 01 18:22:46 2013 +0200
@@ -25,6 +25,60 @@
             self.key_up(ev.key)
 
 
+class Protagonist(object):
+    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
+
+        self.go_human()
+
+    def add_space(self, space):
+        space.add(self.body, self.shape)
+
+    def velocity_func(self, body, gravity, damping, dt):
+        return pymunk.Body.update_velocity(body, gravity, self.damping, dt)
+
+    def render(self, surface):
+        pymunk.pygame_util.draw(surface, self.shape)
+
+    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 = 200
+        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):
@@ -39,32 +93,28 @@
         corners = [(-200, -150), (-200, 150), (200, 150), (200, -150)]
         corner = corners[-1]
         for next_corner in corners:
-            self.walls.append(pymunk.Segment(body, corner, next_corner, 5))
+            wall = pymunk.Segment(body, corner, next_corner, 50)
+            wall.elasticity = 1.0
+            self.walls.append(wall)
             corner = next_corner
         self.space.add(*self.walls)
 
     def add_protagonist(self):
-        self.protagonist_body = pymunk.Body(100, 1000)
-        self.protagonist_body.position = (400, 300)
-        self.protagonist_body.velocity_limit = 5000
-        self.protagonist = pymunk.Circle(self.protagonist_body, 30)
-        self.space.add(self.protagonist_body, self.protagonist)
-
-    def protagonist_move(self, dx, dy):
-        vec = pymunk.Vec2d((dx, dy))
-        self.protagonist_body.angle = vec.angle
-        self.protagonist_body.apply_impulse((dx * 1000, dy * 1000))
+        self.protagonist = Protagonist((400, 300))
+        self.protagonist.add_space(self.space)
 
     def handle_event(self, ev):
         if ev.type == pygame.locals.KEYDOWN:
             if ev.key == pygame.locals.K_ESCAPE:
                 ScreenChange.post('menu')
+            if ev.key == pygame.locals.K_w:
+                self.protagonist.toggle_form()
         self.keys.handle_event(ev)
 
     def render(self, surface):
         surface.fill(pygame.color.Color(0, 0, 0))
         pymunk.pygame_util.draw(surface, *self.walls)
-        pymunk.pygame_util.draw(surface, self.protagonist)
+        self.protagonist.render(surface)
 
     def tick_protagonist(self):
         dx, dy = 0, 0
@@ -75,7 +125,7 @@
             if key in self.keys.keys_down:
                 dx += tx
                 dy += ty
-        self.protagonist_move(dx, dy)
+        self.protagonist.set_direction(dx, dy)
 
     def tick(self, seconds):
         self.tick_protagonist()