X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=koperkapel%2Fscenes%2Fbase.py;h=47891a6582784613cf4f12ae81415e32be097d53;hb=29ced0c100363be9400a13efad9ef3a6901a75a8;hp=dae87e387f69280330f4edaa296c40cacfe089ea;hpb=721b4c2e5e6d17c39f47b3886da3d27d4d7344ae;p=koperkapel.git diff --git a/koperkapel/scenes/base.py b/koperkapel/scenes/base.py index dae87e3..47891a6 100644 --- a/koperkapel/scenes/base.py +++ b/koperkapel/scenes/base.py @@ -13,11 +13,13 @@ def apply_events(f): class Engine: - """ A holder for game state. """ + """ A holder for game state & scene management. + """ - def __init__(self, app, scene): + def __init__(self, app, scene, world): self._app = app self._scene = scene + self._world = world self._viewport = (0, 0) def _apply_events(self, events): @@ -27,9 +29,12 @@ class Engine: ev.apply(self) def change_scene(self, scene): - self._scene.exit() + self._apply_events(self._scene.exit(self._world.proxy())) self._scene = scene - self._scene.enter() + self._apply_events(self._scene.enter(self._world.proxy())) + + def change_world(self, *args, **kw): + self._world.apply_event(*args, **kw) def quit_game(self): from pgzero.game import exit @@ -41,7 +46,7 @@ class Engine: @apply_events def update(self, dt): - return self._scene.update(dt) + return self._scene.update(self._world.proxy(), dt) def draw(self): self._scene.draw(self._app.screen, self._viewport) @@ -86,6 +91,12 @@ class ChangeSceneEvent(Event): ENGINE_METHOD = "change_scene" +class WorldEvent(Event): + """ Be a hero. Change the world. """ + + ENGINE_METHOD = "change_world" + + class QuitEvent(Event): """ Quit the game. """ @@ -98,23 +109,62 @@ class MoveViewportEvent(Event): ENGINE_METHOD = "move_screen" -class Actors: - """ A list of actors. """ +class Layer: + """ A single layer of actors. """ - def __init__(self): - self._actors = [] + def __init__(self, name): + self.name = name + self.actors = [] + + def __iter__(self): + return iter(self.actors) + + def __getitem__(self, i): + return self.actors[i] + + def __len__(self): + return len(self.actors) def add(self, actor): - self._actors.append(actor) + self.actors.append(actor) return actor def remove(self, actor): - self._actors.remove(actor) + self.actors.remove(actor) return actor + +class Actors: + """ Layers of actors. + + Actors may be rendered in different layers. Layers with lower levels + are rendered lower than layers with higher ones. + """ + + def __init__(self): + self._ordered_layers = [] + self._layers = {} + self.add_layer("default", 0) + + def __getattr__(self, name): + return self._layers[name] + + def add_layer(self, name, level): + layer = self._layers[name] = Layer(name) + self._ordered_layers.append((level, name)) + self._ordered_layers.sort() + return layer + + def add(self, actor, layer="default"): + return self._layers[layer].add(actor) + + def remove(self, actor, layer="default"): + return self._layers[layer].remove(actor) + def draw(self, screen): - for actor in self._actors: - actor.draw() # TODO: allow an option screen to be passed in + for lvl, name in self._ordered_layers: + for actor in self._layers[name]: + actor.draw() # TODO: allow an option screen to be passed in class Scene: @@ -123,13 +173,13 @@ class Scene: def __init__(self): self.actors = Actors() - def enter(self): + def enter(self, world): pass - def exit(self): + def exit(self, world): pass - def update(self, dt): + def update(self, world, dt): pass def draw(self, screen, viewport):