Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/game.py
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@gmail.com>2014-06-06 20:39:08 (GMT)
committer Gonzalo Odiard <godiard@gmail.com>2014-06-16 15:26:38 (GMT)
commit4c326b1140597b917b644926d92438637fc94b56 (patch)
tree462f6256055b00bb152c1a4dccde460a16d13fbb /game.py
parente5d667273d209b17b43ed3bbb666161c8786364f (diff)
Use accelerometer
This change implement the following funtionality: * Detect when the xo is in ebook mode, and use the accelerometer if available. Detect the sensr the ebook switch in XO-4 only. * The player advance only one step by accelerator lecture, and only in the direction selected by the user. Is different to the mode by default, where walk until the first fork in the maze.
Diffstat (limited to 'game.py')
-rw-r--r--game.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/game.py b/game.py
index 7acf5d9..359c971 100644
--- a/game.py
+++ b/game.py
@@ -39,6 +39,7 @@ presenceService = presenceservice.get_instance()
from maze import Maze, Rectangle
from player import Player
+import sensors
class MazeGame(Gtk.DrawingArea):
@@ -126,6 +127,14 @@ class MazeGame(Gtk.DrawingArea):
Gdk.EventMask.TOUCH_MASK)
self.set_can_focus(True)
self.grab_focus()
+ self._ebook_mode_detector = sensors.EbookModeDetector()
+ self._accelerometer = sensors.Accelerometer()
+ self._read_accelerator_id = None
+ if self._ebook_mode_detector.get_ebook_mode():
+ self._read_accelerator_id = GObject.timeout_add(
+ 200, self._read_accelerometer)
+ self._ebook_mode_detector.connect('changed',
+ self._ebook_mode_changed_cb)
def __configure_cb(self, event):
''' Screen size has changed '''
@@ -293,6 +302,54 @@ class MazeGame(Gtk.DrawingArea):
"""Mark a single point that needs to be redrawn."""
self.dirtyPoints.append(pt)
+ def _ebook_mode_changed_cb(self, detector, ebook_mode):
+ if ebook_mode:
+ if self._read_accelerator_id is None:
+ self._read_accelerator_id = GObject.timeout_add(
+ 200, self._read_accelerometer)
+ else:
+ self._read_accelerator_id = None
+
+ def _read_accelerometer(self):
+ x, y, z = self._accelerometer.read_position()
+ logging.error('read_acceleromter %s', (x, y, z))
+ TRIGGER = 150
+ if abs(x) < TRIGGER:
+ x = 0
+ if abs(y) < TRIGGER:
+ y = 0
+
+ player = self.localplayers[0]
+ player.hidden = False
+ if x > 0:
+ # RIGHT
+ player.direction = (1, 0)
+ if x < 0:
+ # LEFT
+ player.direction = (-1, 0)
+ if y < 0:
+ # UP
+ player.direction = (0, -1)
+ if y > 0:
+ # DOWN
+ player.direction = (0, 1)
+ if x == 0 and y == 0:
+ player.direction = (0, 0)
+
+ oldposition = player.position
+ newposition = player.animate(self.maze, False)
+ if oldposition != newposition:
+ self.markPointDirty(oldposition)
+ self.markPointDirty(newposition)
+ if player in self.localplayers:
+ self.maze.map[player.previous[0]][player.previous[1]] = \
+ self.maze.SEEN
+ if self.maze.map[newposition[0]][newposition[1]] == \
+ self.maze.GOAL:
+ self.finish(player)
+ self.queue_draw()
+ return self._read_accelerator_id is not None
+
def __event_cb(self, widget, event):
if event.type in (Gdk.EventType.TOUCH_BEGIN,