projects
/
koperkapel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Move roaches to the roach layer.
[koperkapel.git]
/
koperkapel
/
scenes
/
base.py
diff --git
a/koperkapel/scenes/base.py
b/koperkapel/scenes/base.py
index 58f3874f204b87a874751d593f4360a785791a70..d0b9a951ae16c57e20e279560f54fd9ab8a7b7a4 100644
(file)
--- a/
koperkapel/scenes/base.py
+++ b/
koperkapel/scenes/base.py
@@
-13,11
+13,14
@@
def apply_events(f):
class Engine:
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._app = app
self._scene = scene
+ self._world = world
+ self._viewport = (0, 0)
def _apply_events(self, events):
if not events:
def _apply_events(self, events):
if not events:
@@
-26,20
+29,27
@@
class Engine:
ev.apply(self)
def change_scene(self, scene):
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 = 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
exit()
def quit_game(self):
from pgzero.game import exit
exit()
+ def move_screen(self, offset):
+ self._viewport = (self._viewport[0] + offset[0],
+ self._viewport[1] + offset[1])
+
@apply_events
def update(self, dt):
@apply_events
def update(self, dt):
- return self._scene.update(dt)
+ return self._scene.update(
self._world.proxy(),
dt)
def draw(self):
def draw(self):
- self._scene.draw(self._app.screen)
+ self._scene.draw(self._app.screen
, self._viewport
)
@apply_events
def on_mouse_down(self, pos, button):
@apply_events
def on_mouse_down(self, pos, button):
@@
-81,29
+91,53
@@
class ChangeSceneEvent(Event):
ENGINE_METHOD = "change_scene"
ENGINE_METHOD = "change_scene"
+class WorldEvent(Event):
+ """ Be a hero. Change the world. """
+
+ ENGINE_METHOD = "change_world"
+
+
class QuitEvent(Event):
""" Quit the game. """
ENGINE_METHOD = "quit_game"
class QuitEvent(Event):
""" Quit the game. """
ENGINE_METHOD = "quit_game"
+class MoveViewportEvent(Event):
+ """ Change to a new scene. """
+
+ ENGINE_METHOD = "move_screen"
+
+
class Actors:
class Actors:
- """ A list of actors. """
+ """ A list of actors.
+
+ Actors may be rendered in different layers. Layers with lower levels
+ are rendered lower than layers with higher ones.
+ """
def __init__(self):
def __init__(self):
- self._actors = []
+ self._layer_order = []
+ self._layers = {}
+ self.add_layer("default", 0)
- def add(self, actor):
- self._actors.append(actor)
+ def add_layer(self, name, level):
+ self._layer_order.append((level, name))
+ self._layer_order.sort()
+ self._layers[name] = []
+
+ def add(self, actor, layer="default"):
+ self._layers[layer].append(actor)
return actor
return actor
- def remove(self, actor):
- self._
actors
.remove(actor)
+ def remove(self, actor
, layer="default"
):
+ self._
layers[layer]
.remove(actor)
return actor
def draw(self, screen):
return actor
def draw(self, screen):
- for actor in self._actors:
- actor.draw() # TODO: allow an option screen to be passed in
+ for lvl, layer in self._layer_order:
+ for actor in self._layers[layer]:
+ actor.draw() # TODO: allow an option screen to be passed in
class Scene:
class Scene:
@@
-112,16
+146,16
@@
class Scene:
def __init__(self):
self.actors = Actors()
def __init__(self):
self.actors = Actors()
- def enter(self):
+ def enter(self
, world
):
pass
pass
- def exit(self):
+ def exit(self
, world
):
pass
pass
- def update(self, dt):
+ def update(self,
world,
dt):
pass
pass
- def draw(self, screen):
+ def draw(self, screen
, viewport
):
screen.clear()
self.actors.draw(screen)
screen.clear()
self.actors.draw(screen)