From d7890e6e4eb3a93e3ccb24314e5b98760b0f99b9 Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Sun, 28 Feb 2016 21:27:41 +0200 Subject: [PATCH] Scene changing. --- koperkapel/scenes/base.py | 65 ++++++++++++++++++++++++++++++++---- koperkapel/scenes/credits.py | 17 ++++++++++ koperkapel/scenes/menu.py | 9 ++++- 3 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 koperkapel/scenes/credits.py diff --git a/koperkapel/scenes/base.py b/koperkapel/scenes/base.py index 859f816..9bad13c 100644 --- a/koperkapel/scenes/base.py +++ b/koperkapel/scenes/base.py @@ -1,5 +1,16 @@ """ Scene utilities. """ +import functools + + +def apply_events(f): + """ Decorator that applies events to an engine. """ + @functools.wraps(f) + def wrap(self, *args, **kw): + events = f(self, *args, **kw) + self._apply_events(events) + return wrap + class Engine: """ A holder for game state. """ @@ -8,31 +19,73 @@ class Engine: self._app = app self._scene = scene + def _apply_events(self, events): + if not events: + return + for ev in events: + ev.apply(self) + + def change_scene(self, scene): + self._scene.exit() + self._scene = scene + self._scene.enter() + + @apply_events def update(self, dt): - self._scene.update(dt) + return self._scene.update(dt) def draw(self): self._scene.draw(self._app.screen) + @apply_events def on_mouse_down(self, pos, button): - self._scene.on_mouse_down(pos, button) + return self._scene.on_mouse_down(pos, button) + @apply_events def on_mouse_up(self, pos, button): - self._scene.on_mouse_up(pos, button) + return self._scene.on_mouse_up(pos, button) + @apply_events def on_key_down(self, key, mod, unicode): - self._scene.on_key_down(key, mod, unicode) + return self._scene.on_key_down(key, mod, unicode) + @apply_events def on_key_up(self, key, mod): - self._scene.on_key_up(key, mod) + return self._scene.on_key_up(key, mod) + @apply_events def on_music_end(self): - self._scene.on_music_end() + return self._scene.on_music_end() + + +class Event: + """ Base class for events. """ + + ENGINE_METHOD = "unknown_event" + + def __init__(self, *args, **kw): + self._args = args + self._kw = kw + + def apply(self, engine): + getattr(engine, self.ENGINE_METHOD)(*self._args, **self._kw) + + +class ChangeSceneEvent(Event): + """ Change to a new scene. """ + + ENGINE_METHOD = "change_scene" class Scene: """ Base class for scenes. """ + def enter(self): + pass + + def exit(self): + pass + def update(self, dt): pass diff --git a/koperkapel/scenes/credits.py b/koperkapel/scenes/credits.py new file mode 100644 index 0000000..772943e --- /dev/null +++ b/koperkapel/scenes/credits.py @@ -0,0 +1,17 @@ +""" Credits scene. """ + +from pgzero.constants import keys +from .base import Scene, ChangeSceneEvent + + +class CreditsScene(Scene): + """ Credits scene. """ + + def draw(self, screen): + screen.clear() + screen.draw.text("Credits", (300, 300)) + + def on_key_down(self, key, mod, unicode): + if key == keys.ESCAPE: + from .menu import MenuScene + return [ChangeSceneEvent(MenuScene())] diff --git a/koperkapel/scenes/menu.py b/koperkapel/scenes/menu.py index 4d3b5cf..dac4402 100644 --- a/koperkapel/scenes/menu.py +++ b/koperkapel/scenes/menu.py @@ -1,10 +1,17 @@ """ Main menu scene. """ -from .base import Scene +from pgzero.constants import keys +from .base import Scene, ChangeSceneEvent +from .credits import CreditsScene class MenuScene(Scene): """ Main menu scene. """ def draw(self, screen): + screen.clear() screen.draw.text("Main menu", (300, 300)) + + def on_key_down(self, key, mod, unicode): + if key == keys.C: + return [ChangeSceneEvent(CreditsScene())] -- 2.34.1