diff pyntnclick/widgets/game.py @ 555:c0474fe18b96 pyntnclick

Copy in widgets from mamba (currently unused)
author Stefano Rivera <stefano@rivera.za.net>
date Sat, 11 Feb 2012 14:09:46 +0200
parents
children f9f04cb35697
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pyntnclick/widgets/game.py	Sat Feb 11 14:09:46 2012 +0200
@@ -0,0 +1,50 @@
+"""Display the game area."""
+
+from pygame.rect import Rect
+from pygame.locals import (KEYDOWN, K_LEFT, K_RIGHT, K_DOWN, K_UP, K_p,
+                           K_SPACE, K_PAUSE)
+
+from mamba.constants import UP, DOWN, LEFT, RIGHT
+from mamba.widgets.base import Widget
+from mamba.engine import FlipArrowsEvent
+
+
+class GameWidget(Widget):
+    def __init__(self, world, offset=(0, 0)):
+        self.world = world
+        self.actions = self.create_action_map()
+        rect = Rect(offset, world.get_size())
+        super(GameWidget, self).__init__(rect)
+        self.focussable = True
+        self.add_callback(KEYDOWN, self.action_callback)
+        self.add_callback(FlipArrowsEvent, self.flip_arrows)
+
+    def create_action_map(self):
+        actions = {}
+        pause = (self.world.toggle_pause, ())
+        actions[K_LEFT] = (self.world.snake.send_new_direction, (LEFT,))
+        actions[K_RIGHT] = (self.world.snake.send_new_direction, (RIGHT,))
+        actions[K_DOWN] = (self.world.snake.send_new_direction, (DOWN,))
+        actions[K_UP] = (self.world.snake.send_new_direction, (UP,))
+        actions[K_p] = pause
+        actions[K_SPACE] = pause
+        actions[K_PAUSE] = pause
+        return actions
+
+    def action_callback(self, ev, widget):
+        if ev.key in self.actions:
+            func, args = self.actions[ev.key]
+            func(*args)
+            return True
+
+    def flip_arrows(self, ev, widget):
+        self.world.level.flip_arrows()
+
+    def draw(self, surface):
+        self.world.update()
+        self.world.draw(surface)
+
+    def restart(self):
+        self.world.restart()
+        self.actions = self.create_action_map()
+        self.grab_focus()