Bump tile size for better results on android
[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 = 40
17
18
19 class GameWindow(FloatLayout):
20
21     def __init__(self, level_list):
22         super(GameWindow, self).__init__(size=(1080, 800))
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.mouse_move = False
29
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
36
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)
40
41     def build(self):
42         self.clear_widgets()
43         self.tiles = {}
44         tiles = self.level_obj.get_tiles()
45         bx, by = 0, 0
46         for tile_line in tiles:
47             bx = 0
48             for tile in tile_line:
49                 node = Widget(size=(TILE_SIZE, TILE_SIZE), pos=(bx, by))
50                 with node.canvas:
51                     Color(1, 1, 1)
52                     Rectangle(pos=node.pos, size=node.size,
53                             texture=tile.texture)
54                 self.add_widget(node)
55                 self.tiles[(bx, by)] = node
56                 bx += TILE_SIZE
57             by += TILE_SIZE
58
59         self.draw_player()
60         self.draw_nemesis()
61
62     def draw_player(self):
63         if self.player_tile:
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),
68                 pos=sprite_pos)
69         with self.player_tile.canvas:
70             Color(1, 1, 1)
71             Rectangle(pos=sprite_pos, size=self.player_tile.size,
72                     texture=self.player.get_texture())
73         self.add_widget(self.player_tile)
74
75     def draw_nemesis(self):
76         if not self.nemesis.on_board():
77             return
78         if self.nemesis_tile:
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),
83                 pos=sprite_pos)
84         with self.nemesis_tile.canvas:
85             Color(1, 1, 1)
86             Rectangle(pos=sprite_pos, size=self.nemesis_tile.size,
87                     texture=self.nemesis.get_texture())
88         self.add_widget(self.nemesis_tile)
89
90     def _closed(self):
91         self.keyboard.unbind(on_key_down=self._on_key_down)
92
93     def _on_key_down(self, keyboard, keycode, text, modifiers):
94         # FIXME - likely portablity issues
95         direction = None
96         if keycode[0] == pygame.K_UP:
97             direction = (0, 1)
98         elif keycode[0] == pygame.K_DOWN:
99             direction = (0, -1)
100         elif keycode[0] == pygame.K_LEFT:
101             direction = (-1, 0)
102         elif keycode[0] == pygame.K_RIGHT:
103             direction = (1, 0)
104         if direction:
105             self.do_move(direction)
106
107     def do_move(self, direction):
108         self.nemesis.move(self.level_obj)
109         self.draw_nemesis()
110         self.player.move(direction, self.level_obj)
111         self.draw_player()
112         self.check_state()
113
114     def check_state(self):
115         if self.level_obj.at_exit(self.player.pos):
116             # Jump to next level
117             self.level_obj = self.level_list.advance_to_next_level()
118             self.nemesis.reset_pos()
119             if self.level_obj:
120                 self.level_obj.load_tiles()
121                 self.player.pos = self.level_obj.enter_pos
122                 self.remove_widget(self.player_tile)
123                 self.build()
124             else:
125                 print 'You won!'
126                 sys.exit(1)
127         elif self.nemesis.pos == self.player.pos:
128             # Caught
129             print 'You lost!'
130             sys.exit(1)
131
132     def _calc_mouse_pos(self, pos):
133         return (int(pos[0] / TILE_SIZE), int(pos[1] / TILE_SIZE))
134
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
140
141     def on_touch_up(self, touch):
142         self.mouse_move = False
143
144     def on_touch_move(self, touch):
145         if self.mouse_move:
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
153
154
155 class GameApp(App):
156
157     def __init__(self):
158         self.levels = LevelList()
159         super(GameApp, self).__init__()
160
161     def build(self):
162         game = GameWindow(self.levels)
163         game.build()
164         return game
165
166
167 def main():
168     """ Erdslangetjie, a maze game of eluding nemesis
169     """
170     GameApp().run()