X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=koperkapel%2Fscenes%2Fbase.py;h=623eb42a977276e506449831be35956d83758d32;hb=55653b221b6c5ca3c12cdb27412a6773f87c4448;hp=ade4d8bfddede638919ab9eb884423d38a9e55c6;hpb=ac587543218e5179289e18a147e7118f10348dfe;p=koperkapel.git diff --git a/koperkapel/scenes/base.py b/koperkapel/scenes/base.py index ade4d8b..623eb42 100644 --- a/koperkapel/scenes/base.py +++ b/koperkapel/scenes/base.py @@ -20,7 +20,7 @@ class Engine: self._app = app self._scene = scene self._world = world - self._viewport = (0, 0) + self._update_vehicle = False def _apply_events(self, events): if not events: @@ -41,19 +41,14 @@ class Engine: exit() def move_screen(self, offset): - self._viewport = (self._viewport[0] + offset[0], - self._viewport[1] + offset[1]) - - def calc_offset(self, x, y): - """Return a position offset by the viewport""" - return x - self._viewport[0], y - self._viewport[1] + self._scene.move_screen(offset) @apply_events def update(self, dt): return self._scene.update(self._world.proxy(), self, dt) def draw(self): - self._scene.draw(self._app.screen, self._viewport) + self._scene.draw(self._app.screen) @apply_events def on_mouse_down(self, pos, button): @@ -171,7 +166,17 @@ class Actors: def draw(self, screen): for lvl, name in self._ordered_layers: for actor in self._layers[name]: - actor.draw() # TODO: allow an option screen to be passed in + # actor.draw doesn't allow blitting to anything other than + # the game scene + screen.blit(actor._surf, actor.topleft) + + +def defer_to_update(f): + """ Defers a function until the next update run. """ + @functools.wraps(f) + def wrapper(self, *args, **kw): + self._deferred_updates.append((f, args, kw)) + return wrapper class Scene: @@ -179,6 +184,16 @@ class Scene: def __init__(self): self.actors = Actors() + self.viewport = (0, 0) + self._deferred_updates = [] + + def move_screen(self, offset): + self.viewport = (self.viewport[0] + offset[0], + self.viewport[1] + offset[1]) + + def calc_offset(self, x, y): + """ Return a position offset by the viewport. """ + return x - self.viewport[0], y - self.viewport[1] def enter(self, world): pass @@ -187,9 +202,11 @@ class Scene: pass def update(self, world, engine, dt): - pass + deferred_updates, self._deferred_updates = self._deferred_updates, [] + for f, args, kw in deferred_updates: + f(self, world, *args, **kw) - def draw(self, screen, viewport): + def draw(self, screen): screen.clear() self.actors.draw(screen)