annotate nagslang/screens/menu.py @ 345:4708e86a9a3c

Remember start position on a level (a bit hacky)
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 06 Sep 2013 13:42:42 +0200
parents 11febdb72296
children 282113d86d75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Display a menu screen."""
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
19
113f31bd9d49 Clean-up imports.
Simon Cross <hodgestar@gmail.com>
parents: 18
diff changeset
3 import pygame
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5 from nagslang.screens.base import Screen
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 19
diff changeset
6 from nagslang.events import QuitEvent, ScreenChange
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents: 226
diff changeset
7 from nagslang.widgets.text import TextWidget, MultiLineWidget
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 class MenuScreen(Screen):
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
11 def setup(self):
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
12 # Position is hacked later
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
13 self.cursor = TextWidget((0, 0), u'\N{Rightwards Arrow}',
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
14 colour='red')
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
15 self.cursor_pos = 0
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
16 self.options = [
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
17 self.play,
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
18 self.restart,
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
19 self.quit,
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
20 ]
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
21 self.widgets = [
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
22 TextWidget((10, 10), 'Menu', fontsize=20),
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
23 TextWidget((40, 50), 'Play the game'),
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
24 TextWidget((40, 70), 'Start the game from the beginning again'),
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
25 TextWidget((40, 90), 'Quit'),
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents: 226
diff changeset
26 MultiLineWidget((60, 120), self.world.get_formatted_stats()),
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
27 self.cursor,
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
28 ]
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
29
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30 def handle_event(self, ev):
20
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 19
diff changeset
31 if ev.type == pygame.locals.KEYDOWN:
347667c941de Hook up area.
Simon Cross <hodgestar@gmail.com>
parents: 19
diff changeset
32 if ev.key == pygame.locals.K_ESCAPE:
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
33 self.quit()
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
34 elif ev.key == pygame.locals.K_DOWN:
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
35 self.cursor_pos = (self.cursor_pos + 1) % len(self.options)
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
36 elif ev.key == pygame.locals.K_UP:
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
37 self.cursor_pos = (self.cursor_pos - 1) % len(self.options)
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
38 elif ev.key == pygame.locals.K_RETURN:
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
39 self.options[self.cursor_pos]()
18
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
40
9ecb1d222ee0 Screens.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41 def render(self, surface):
29
58505d3482b6 Text on the menu screen
Stefano Rivera <stefano@rivera.za.net>
parents: 21
diff changeset
42 surface.fill(pygame.color.Color(255, 255, 255))
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
43 self.cursor.pos = (10, 50 + 20 * self.cursor_pos)
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
44 self.cursor.rect.top = self.cursor.pos[1]
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
45 for widget in self.widgets:
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
46 widget.draw(surface)
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
47
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
48 def play(self):
345
4708e86a9a3c Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents: 342
diff changeset
49 level_name, pos = self.world.level
4708e86a9a3c Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents: 342
diff changeset
50 self.world.protagonist.set_position(pos)
4708e86a9a3c Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents: 342
diff changeset
51 ScreenChange.post(level_name)
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
52
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
53 def restart(self):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
54 self.world.reset()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
55 self.setup()
226
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
56
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
57 def quit(self):
e89a43d208b9 A stupid, simple menu
Stefano Rivera <stefano@rivera.za.net>
parents: 180
diff changeset
58 QuitEvent.post()