7 from kivy.app import App
8 from kivy.core.window import Window
9 from kivy.uix.widget import Widget
10 from kivy.uix.floatlayout import FloatLayout
11 from kivy.graphics import Color, Rectangle
13 from erdslangetjie.level import LevelList
14 from erdslangetjie.player import ThePlayer, Nemesis
19 class GameWindow(FloatLayout):
21 def __init__(self, level_list):
22 super(GameWindow, self).__init__(size=(648, 480))
23 self.level_list = level_list
24 self.level_obj = self.level_list.get_current_level()
25 self.level_obj.load_tiles()
28 self.mouse_move = False
30 self.player = ThePlayer()
31 self.nemesis = Nemesis()
32 if not self.level_obj.enter_pos:
33 raise RuntimeError('No entry point')
34 self.player_tile = None
35 self.nemesis_tile = None
37 self.player.pos = self.level_obj.enter_pos
38 self.keyboard = Window.request_keyboard(self._closed, self)
39 self.keyboard.bind(on_key_down=self._on_key_down)
44 tiles = self.level_obj.get_tiles()
46 for tile_line in tiles:
48 for tile in tile_line:
49 node = Widget(size=(TILE_SIZE, TILE_SIZE), pos=(bx, by))
52 Rectangle(pos=node.pos, size=node.size,
55 self.tiles[(bx, by)] = node
62 def draw_player(self):
64 self.remove_widget(self.player_tile)
65 sprite_pos = (self.player.pos[0] * TILE_SIZE,
66 self.player.pos[1] * TILE_SIZE)
67 self.player_tile = Widget(size=(TILE_SIZE, TILE_SIZE),
69 with self.player_tile.canvas:
71 Rectangle(pos=sprite_pos, size=self.player_tile.size,
72 texture=self.player.get_texture())
73 self.add_widget(self.player_tile)
75 def draw_nemesis(self):
76 if not self.nemesis.on_board():
79 self.remove_widget(self.nemesis_tile)
80 sprite_pos = (self.nemesis.pos[0] * TILE_SIZE,
81 self.nemesis.pos[1] * TILE_SIZE)
82 self.nemesis_tile = Widget(size=(TILE_SIZE, TILE_SIZE),
84 with self.nemesis_tile.canvas:
86 Rectangle(pos=sprite_pos, size=self.nemesis_tile.size,
87 texture=self.nemesis.get_texture())
88 self.add_widget(self.nemesis_tile)
91 self.keyboard.unbind(on_key_down=self._on_key_down)
93 def _on_key_down(self, keyboard, keycode, text, modifiers):
94 # FIXME - likely portablity issues
96 if keycode[0] == pygame.K_UP:
98 elif keycode[0] == pygame.K_DOWN:
100 elif keycode[0] == pygame.K_LEFT:
102 elif keycode[0] == pygame.K_RIGHT:
105 self.do_move(direction)
107 def do_move(self, direction):
108 self.nemesis.move(self.level_obj)
110 self.player.move(direction, self.level_obj)
114 def check_state(self):
115 if self.level_obj.at_exit(self.player.pos):
117 self.level_obj = self.level_list.advance_to_next_level()
118 self.nemesis.reset_pos()
120 self.level_obj.load_tiles()
121 self.player.pos = self.level_obj.enter_pos
122 self.remove_widget(self.player_tile)
127 elif self.nemesis.pos == self.player.pos:
132 def _calc_mouse_pos(self, pos):
133 return (int(pos[0] / TILE_SIZE), int(pos[1] / TILE_SIZE))
135 def on_touch_down(self, touch):
136 pos = self._calc_mouse_pos(touch.pos)
137 if pos == self.player.pos:
138 self.mouse_move = True
139 self.mouse_start = pos
141 def on_touch_up(self, touch):
142 self.mouse_move = False
144 def on_touch_move(self, touch):
146 pos = self._calc_mouse_pos(touch.pos)
147 if (pos[0] - self.mouse_start[0] != 0) or (
148 pos[1] - self.mouse_start[1] != 0):
149 direction = (pos[0] - self.mouse_start[0],
150 pos[1] - self.mouse_start[1])
151 self.do_move(direction)
152 self.mouse_start = pos
158 self.levels = LevelList()
159 super(GameApp, self).__init__()
162 game = GameWindow(self.levels)
168 """ Erdslangetjie, a maze game of eluding nemesis