Redo keyboard navigation code to support WASD as well
[erdslangetjie.git] / erdslangetjie / __main__.py
index e6bc2ce169f096958636cdaba8914651b0162cfd..71ef53b405cc46e9c6f5a8780109e6eaeac8abda 100644 (file)
@@ -1,21 +1,23 @@
-import kivy
-import pygame
-
-kivy.require('1.6.0')
+from erdslangetjie.constants import TILE_SIZE, LEFT, RIGHT, UP, DOWN
 
 from kivy.app import App
 from kivy.uix.widget import Widget
 
 from kivy.app import App
 from kivy.uix.widget import Widget
-from kivy.logger import Logger, LoggerHistory
 from kivy.uix.relativelayout import RelativeLayout
 from kivy.uix.scrollview import ScrollView
 from kivy.uix.label import Label
 from kivy.graphics import Color, Rectangle
 from kivy.utils import platform
 from kivy.uix.relativelayout import RelativeLayout
 from kivy.uix.scrollview import ScrollView
 from kivy.uix.label import Label
 from kivy.graphics import Color, Rectangle
 from kivy.utils import platform
+from kivy.clock import Clock
+from kivy.config import Config
 
 from erdslangetjie.level import LevelList
 from erdslangetjie.data import load_image
 from erdslangetjie.player import ThePlayer, Nemesis
 
 from erdslangetjie.level import LevelList
 from erdslangetjie.data import load_image
 from erdslangetjie.player import ThePlayer, Nemesis
-from erdslangetjie.constants import TILE_SIZE, QUIET
+
+
+if platform() != 'android':
+    Config.set('graphics', 'width', '1026')
+    Config.set('graphics', 'height', '760')
 
 
 class GameWindow(RelativeLayout):
 
 
 class GameWindow(RelativeLayout):
@@ -45,6 +47,7 @@ class GameWindow(RelativeLayout):
             raise RuntimeError('No entry point')
         self.player_tile = None
         self.nemesis_tile = None
             raise RuntimeError('No entry point')
         self.player_tile = None
         self.nemesis_tile = None
+        self.timer_set = False
 
         self.player.pos = self.level_obj.enter_pos
         if platform() != 'android':
 
         self.player.pos = self.level_obj.enter_pos
         if platform() != 'android':
@@ -159,15 +162,15 @@ class GameWindow(RelativeLayout):
         self.keyboard.unbind(on_key_down=self._on_key_down)
 
     def _on_key_down(self, keyboard, keycode, text, modifiers):
         self.keyboard.unbind(on_key_down=self._on_key_down)
 
     def _on_key_down(self, keyboard, keycode, text, modifiers):
-        # FIXME - likely portablity issues
         direction = None
         direction = None
-        if keycode[0] == pygame.K_UP:
+        letter = keycode[1].lower()
+        if letter in UP:
             direction = (0, 1)
             direction = (0, 1)
-        elif keycode[0] == pygame.K_DOWN:
+        elif letter in DOWN:
             direction = (0, -1)
             direction = (0, -1)
-        elif keycode[0] == pygame.K_LEFT:
+        elif letter in LEFT:
             direction = (-1, 0)
             direction = (-1, 0)
-        elif keycode[0] == pygame.K_RIGHT:
+        elif letter in RIGHT:
             direction = (1, 0)
         if direction:
             self.do_move(direction)
             direction = (1, 0)
         if direction:
             self.do_move(direction)
@@ -175,42 +178,52 @@ class GameWindow(RelativeLayout):
     def do_move(self, direction):
         if not self.level_obj:
             return
     def do_move(self, direction):
         if not self.level_obj:
             return
-        self.nemesis.move(self.level_obj)
-        self.draw_nemesis()
         self.player.move(direction, self.level_obj)
         self.draw_player()
         self.check_state()
         self.player.move(direction, self.level_obj)
         self.draw_player()
         self.check_state()
-        self.reset_timer()
+        if not self.timer_set:
+            self.reset_timer()
 
 
-    def timed_move(self):
+    def timed_move(self, event):
         if not self.level_obj:
             return
         if not self.level_obj:
             return
-        self.nemesis.move(self.level_obj)
+        self.nemesis.move(self.level_obj, self.check_caught)
         self.draw_nemesis()
         self.check_state()
         self.reset_timer()
 
     def reset_timer(self):
         self.draw_nemesis()
         self.check_state()
         self.reset_timer()
 
     def reset_timer(self):
-        pass
+        self.timer_set = True
+        Clock.unschedule(self.timed_move)
+        Clock.schedule_once(self.timed_move, 0.5)
+
+    def check_caught(self):
+        return self.nemesis.pos == self.player.pos
+
+    def reset_level(self):
+        Clock.unschedule(self.timed_move)
+        self.timer_set = False
+        self.remove_widget(self.nemesis_tile)
+        self.nemesis.reset_pos()
+        if self.level_obj:
+            self.level_obj.load_tiles()
+            self.player.pos = self.level_obj.enter_pos
+            self.remove_widget(self.player_tile)
+            self.view.scroll_x = 0
+            self.view.scroll_y = 0
+            self.build()
+            self.draw_nemesis()
+            self.draw_player()
+            return True
+        return False
 
     def check_state(self):
         if self.level_obj.at_exit(self.player.pos):
             # Jump to next level
             self.level_obj = self.level_list.advance_to_next_level()
 
     def check_state(self):
         if self.level_obj.at_exit(self.player.pos):
             # Jump to next level
             self.level_obj = self.level_list.advance_to_next_level()
-            self.remove_widget(self.nemesis_tile)
-            self.nemesis.reset_pos()
-            if self.level_obj:
-                self.level_obj.load_tiles()
-                self.player.pos = self.level_obj.enter_pos
-                self.remove_widget(self.player_tile)
-                self.view.scroll_x = 0
-                self.view.scroll_y = 0
-                self.build()
-                self.draw_nemesis()
-                self.draw_player()
-            else:
+            if not self.reset_level():
                 self.app.game_over(True)
                 self.app.game_over(True)
-        elif self.nemesis.pos == self.player.pos:
+        elif self.check_caught():
             # Caught
             self.app.game_over(False)
 
             # Caught
             self.app.game_over(False)
 
@@ -259,9 +272,9 @@ class Screen(Widget):
                 pos=((1026 - 200) / 2 - 100, 100))
         self.stop_button.bind(on_ref_press=self.app.stop_app)
         self.start_button = Label(
                 pos=((1026 - 200) / 2 - 100, 100))
         self.stop_button.bind(on_ref_press=self.app.stop_app)
         self.start_button = Label(
-                text="[ref=start][color=00ff66]" + self.START + "[/color][/ref]",
+                text="[ref=start][color=00ff66]%s[/color][/ref]" % self.START,
                 font_size=30,
                 font_size=30,
-                markup = True, size=(200, 40),
+                markup=True, size=(200, 40),
                 pos=((1026 - 200) / 2 + 100, 100))
         self.start_button.bind(on_ref_press=self.app.start_game)
         self.add_widget(self.stop_button)
                 pos=((1026 - 200) / 2 + 100, 100))
         self.start_button.bind(on_ref_press=self.app.start_game)
         self.add_widget(self.stop_button)
@@ -339,8 +352,4 @@ class GameApp(App):
 def main():
     """ Erdslangetjie, a maze game of eluding nemesis
     """
 def main():
     """ Erdslangetjie, a maze game of eluding nemesis
     """
-    if QUIET:
-        for hdlr in Logger.handlers[:]:
-            if not isinstance(hdlr, LoggerHistory):
-                Logger.removeHandler(hdlr)
     GameApp().run()
     GameApp().run()