diff nagslang/screens/area.py @ 34:2995723e8ccf

Move and hold.
author Simon Cross <hodgestar@gmail.com>
date Sun, 01 Sep 2013 16:50:06 +0200
parents 3e4d8091268c
children 457280af5f3a
line wrap: on
line diff
--- a/nagslang/screens/area.py	Sun Sep 01 16:44:04 2013 +0200
+++ b/nagslang/screens/area.py	Sun Sep 01 16:50:06 2013 +0200
@@ -10,9 +10,27 @@
 from nagslang.events import ScreenChange
 
 
+class ControlKeys(object):
+    def __init__(self):
+        self.keys_down = set()
+
+    def key_down(self, key):
+        self.keys_down.add(key)
+
+    def key_up(self, key):
+        self.keys_down.discard(key)
+
+    def handle_event(self, ev):
+        if ev.type == pygame.locals.KEYDOWN:
+            self.key_down(ev.key)
+        elif ev.type == pygame.locals.KEYUP:
+            self.key_up(ev.key)
+
+
 class AreaScreen(Screen):
 
     def setup(self, world):
+        self.keys = ControlKeys()
         self.add_walls(world)
         self.add_protagonist(world)
 
@@ -30,27 +48,37 @@
     def add_protagonist(self, world):
         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, angle):
-        self.protagonist_body.angle = angle
-        self.protagonist_body.apply_impulse((dx * 2000, dy * 2000))
+    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))
 
     def handle_event(self, ev):
         if ev.type == pygame.locals.KEYDOWN:
             if ev.key == pygame.locals.K_ESCAPE:
                 ScreenChange.post('menu')
-            elif ev.key == pygame.locals.K_UP:
-                self.protagonist_move(0, 1, math.pi / 2)
-            elif ev.key == pygame.locals.K_DOWN:
-                self.protagonist_move(0, -1, -math.pi / 2)
-            elif ev.key == pygame.locals.K_LEFT:
-                self.protagonist_move(-1, 0, math.pi)
-            elif ev.key == pygame.locals.K_RIGHT:
-                self.protagonist_move(1, 0, 0)
+        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)
+
+    def tick_protagonist(self):
+        dx, dy = 0, 0
+        for key, tx, ty in [
+            (pygame.locals.K_UP, 0, 1), (pygame.locals.K_DOWN, 0, -1),
+            (pygame.locals.K_LEFT, -1, 0), (pygame.locals.K_RIGHT, 1, 0)
+        ]:
+            if key in self.keys.keys_down:
+                dx += tx
+                dy += ty
+        self.protagonist_move(dx, dy)
+
+    def tick(self, seconds):
+        self.tick_protagonist()
+        super(AreaScreen, self).tick(seconds)