Merge branch 'master' of ctpug.org.za:koperkapel
authorSimon Cross <hodgestar@gmail.com>
Sun, 28 Feb 2016 20:28:39 +0000 (22:28 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sun, 28 Feb 2016 20:28:39 +0000 (22:28 +0200)
koperkapel/actors/buttons.py [new file with mode: 0644]
koperkapel/actors/surf.py [new file with mode: 0644]
koperkapel/scenes/base.py
koperkapel/scenes/menu.py

diff --git a/koperkapel/actors/buttons.py b/koperkapel/actors/buttons.py
new file mode 100644 (file)
index 0000000..dfe0ca7
--- /dev/null
@@ -0,0 +1,12 @@
+""" Buttons. """
+
+from pgzero.ptext import getsurf
+from .surf import SurfActor
+
+
+class TextButton(SurfActor):
+    def __init__(self, text, **kwargs):
+        super(TextButton, self).__init__(getsurf(text, **kwargs))
+
+    def text(self, *args, **kw):
+        self.surf = getsurf(*args, **kw)
diff --git a/koperkapel/actors/surf.py b/koperkapel/actors/surf.py
new file mode 100644 (file)
index 0000000..23dccc6
--- /dev/null
@@ -0,0 +1,30 @@
+""" Actor that takes a surface. """
+
+from pgzero.actor import Actor, POS_TOPLEFT, ANCHOR_CENTER
+
+
+class SurfActor(Actor):
+    def __init__(self, surf, pos=POS_TOPLEFT, anchor=ANCHOR_CENTER, **kwargs):
+        self._handle_unexpected_kwargs(kwargs)
+
+        self.surf = surf
+        # Initialise it at (0,0). We'll move it to the right place later
+        super(Actor, self).__init__((0, 0), self._surf.get_size())
+
+        self._init_position(pos, anchor, **kwargs)
+
+    def _update_pos(self):
+        p = self.pos
+        self.width, self.height = self._surf.get_size()
+        self._calc_anchor()
+        self.pos = p
+
+    @property
+    def surf(self):
+        """ The original surface displaying the actor. """
+        return self._orig_surf
+
+    @surf.setter
+    def surf(self, surf):
+        self._orig_surf = self._surf = surf
+        self._update_pos()
index 9bad13cd9f03b9e1d172c9c977ae575002a51c88..b6d6ff9bf86262a89345e0de38f8c0fadb162286 100644 (file)
@@ -77,9 +77,31 @@ class ChangeSceneEvent(Event):
     ENGINE_METHOD = "change_scene"
 
 
+class Actors:
+    """ A list of actors. """
+
+    def __init__(self):
+        self._actors = []
+
+    def add(self, actor):
+        self._actors.append(actor)
+        return actor
+
+    def remove(self, actor):
+        self._actors.remove(actor)
+        return actor
+
+    def draw(self, screen):
+        for actor in self._actors:
+            actor.draw()  # TODO: allow an option screen to be passed in
+
+
 class Scene:
     """ Base class for scenes. """
 
+    def __init__(self):
+        self.actors = Actors()
+
     def enter(self):
         pass
 
@@ -90,7 +112,8 @@ class Scene:
         pass
 
     def draw(self, screen):
-        pass
+        screen.clear()
+        self.actors.draw(screen)
 
     def on_mouse_down(self, pos, button):
         pass
index 63e1ba84ae48891201f24376fc3c002a5d6880bd..e5746e80463a82d87b1e7075115ce45c0c6621bc 100644 (file)
@@ -1,20 +1,26 @@
 """ Main menu scene. """
 
 from pgzero.constants import keys
+from ..actors.buttons import TextButton
 from .base import Scene, ChangeSceneEvent
-from .credits import CreditsScene
-from .level import LevelScene
 
 
 class MenuScene(Scene):
     """ Main menu scene. """
 
-    def draw(self, screen):
-        screen.clear()
-        screen.draw.text("Main menu", (300, 300))
+    def __init__(self):
+        super().__init__()
+        self._title = self.actors.add(TextButton("Main Menu"))
+        self._title.pos = (300, 200)
+        self._level = self.actors.add(TextButton("Level"))
+        self._level.pos = (300, 300)
+        self._credits = self.actors.add(TextButton("Credits"))
+        self._credits.pos = (300, 400)
 
     def on_key_down(self, key, mod, unicode):
         if key == keys.C:
+            from .credits import CreditsScene
             return [ChangeSceneEvent(CreditsScene())]
         if key == keys.L:
+            from .level import LevelScene
             return [ChangeSceneEvent(LevelScene('level1'))]