Advance through the levels
[erdslangetjie.git] / erdslangetjie / __main__.py
1 import sys
2 import kivy
3 import pygame
4
5 kivy.require('1.6.0')
6
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
12
13 from erdslangetjie.level import LevelList
14 from erdslangetjie.player import ThePlayer, Nemesis
15
16 TILE_SIZE = 24
17
18
19 class GameWindow(FloatLayout):
20
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()
26         self.tiles = {}
27
28         self.player = ThePlayer()
29         if not self.level_obj.enter_pos:
30             raise RuntimeError('No entry point')
31         self.player_tile = None
32
33         self.player.pos = self.level_obj.enter_pos
34         self.keyboard = Window.request_keyboard(self._closed, self)
35         self.keyboard.bind(on_key_down=self._on_key_down)
36
37     def build(self):
38         self.clear_widgets()
39         self.tiles = {}
40         tiles = self.level_obj.get_tiles()
41         bx, by = 0, 0
42         for tile_line in tiles:
43             bx = 0
44             for tile in tile_line:
45                 node = Widget(size=(TILE_SIZE, TILE_SIZE), pos=(bx, by))
46                 with node.canvas:
47                     Color(1, 1, 1)
48                     Rectangle(pos=node.pos, size=node.size,
49                             texture=tile.texture)
50                 self.add_widget(node)
51                 self.tiles[(bx, by)] = node
52                 bx += TILE_SIZE
53             by += TILE_SIZE
54
55         self.draw_player()
56
57     def draw_player(self):
58         if self.player_tile:
59             self.remove_widget(self.player_tile)
60         player_pos = (self.player.pos[0] * TILE_SIZE,
61                 self.player.pos[1] * TILE_SIZE)
62         self.player_tile = Widget(size=(TILE_SIZE, TILE_SIZE),
63                 pos=player_pos)
64         with self.player_tile.canvas:
65             Color(1, 1, 1)
66             Rectangle(pos=player_pos, size=self.player_tile.size,
67                     texture=self.player.sprite.texture)
68         self.add_widget(self.player_tile)
69
70     def _closed(self):
71         self.keyboard.unbind(on_key_down=self._on_key_down)
72
73     def _on_key_down(self, keyboard, keycode, text, modifiers):
74         # FIXME - likely portablity issues
75         direction = None
76         if keycode[0] == pygame.K_UP:
77             direction = (0, 1)
78         elif keycode[0] == pygame.K_DOWN:
79             direction = (0, -1)
80         elif keycode[0] == pygame.K_LEFT:
81             direction = (-1, 0)
82         elif keycode[0] == pygame.K_RIGHT:
83             direction = (1, 0)
84         if direction:
85             if self.player.can_move(direction, self.level_obj):
86                 self.player.move(direction)
87                 self.draw_player()
88                 if self.level_obj.at_exit(self.player.pos):
89                     self.level_obj = self.level_list.advance_to_next_level()
90                     if self.level_obj:
91                         self.level_obj.load_tiles()
92                         self.player.pos = self.level_obj.enter_pos
93                         self.remove_widget(self.player_tile)
94                         self.build()
95                     else:
96                         print 'You won!'
97                         sys.exit(1)
98
99
100 class GameApp(App):
101
102     def __init__(self):
103         self.levels = LevelList()
104         super(GameApp, self).__init__()
105
106     def build(self):
107         game = GameWindow(self.levels)
108         game.build()
109         return game
110
111
112 def main():
113     """ Erdslangetjie, a maze game of eluding nemesis
114     """
115     GameApp().run()