65128b9e49d3184028320914508063cbc727c877
[koperkapel.git] / koperkapel / scenes / menu.py
1 """ Main menu scene. """
2
3 from pgzero.constants import keys
4 from ..actors.buttons import TextButton
5 from ..actors.navigator import ActorNavigator
6 from .base import Scene, ChangeSceneEvent, WorldEvent, QuitEvent
7
8
9 class MenuScene(Scene):
10     """ Main menu scene. """
11
12     def __init__(self):
13         super().__init__()
14         self._title = self.actors.add(TextButton("Main Menu"))
15         self._title.pos = (300, 100)
16         self._nav = ActorNavigator()
17         self._menu = [
18             TextButton("New Game", action=self.change_to_new_game),
19             TextButton("Resume", action=self.change_to_resume),
20             TextButton("Credits", action=self.change_to_credits),
21             TextButton("Quit", action=self.quit),
22         ]
23         for i, item in enumerate(self._menu):
24             item.pos = (300, 200 + (i * 100))
25             self.actors.add(item)
26         self._nav.connect(
27             self._menu, [keys.DOWN, keys.RIGHT], [keys.UP, keys.LEFT],
28             wrap=True)
29         self._nav.current.select()
30
31     def change_to_resume(self):
32         from .level import GameLevelScene
33         return [ChangeSceneEvent(GameLevelScene())]
34
35     def change_to_new_game(self):
36         from .level import GameLevelScene
37         return [
38             WorldEvent("reset"),
39             ChangeSceneEvent(GameLevelScene())
40         ]
41
42     def change_to_credits(self):
43         from .credits import CreditsScene
44         return [ChangeSceneEvent(CreditsScene())]
45
46     def quit(self):
47         return [QuitEvent()]
48
49     def on_key_down(self, key, mod, unicode):
50         if key == keys.RETURN:
51             current = self._nav.current
52             if current is not None:
53                 return current.action()
54         else:
55             prev, current = self._nav.follow(key)
56             if prev is not None:
57                 prev.deselect()
58             if current is not None:
59                 current.select()