--- /dev/null
+""" 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)
--- /dev/null
+""" 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()
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
pass
def draw(self, screen):
- pass
+ screen.clear()
+ self.actors.draw(screen)
def on_mouse_down(self, pos, button):
pass
""" 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'))]