diff nagslang/screens/area.py @ 107:b90d01e4d9d4

Layered drawing.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 02 Sep 2013 14:01:55 +0200
parents bce9cd8a4a8c
children fe1f0bb4ecf0
line wrap: on
line diff
--- a/nagslang/screens/area.py	Mon Sep 02 13:48:24 2013 +0200
+++ b/nagslang/screens/area.py	Mon Sep 02 14:01:55 2013 +0200
@@ -4,6 +4,7 @@
 import pymunk
 import pymunk.pygame_util
 
+from nagslang.constants import ZORDER_HIGH
 from nagslang.events import ScreenChange
 from nagslang.game_object import FloorSwitch, FloorLight, PuzzleGlue
 from nagslang.level import Level
@@ -43,23 +44,45 @@
         return (dx, dy)
 
 
+class Drawables(object):
+    def __init__(self):
+        self._drawables = {}
+
+    def add(self, drawable):
+        self._drawables.setdefault(drawable.zorder, []).append(drawable)
+
+    def remove(self, drawable):
+        self._drawables[drawable.zorder].remove(drawable)
+
+    def get_drawables(self):
+        for zorder in sorted(self._drawables):
+            for drawable in self._drawables[zorder]:
+                yield drawable
+
+    __iter__ = get_drawables
+
+
 class AreaScreen(Screen):
 
     def setup(self):
         self.keys = ControlKeys()
         self._level = Level(self.name)
         self._level.load()
-        self._drawables = []
+        self._drawables = Drawables()
         self.add_walls()
         self.add_protagonist()
         # TODO: Put this in a level instead:
         glue = PuzzleGlue()
         switch = FloorSwitch(self.space, (300, 400))
         light = FloorLight(self.space, (300, 500), 'switch')
+        light2 = FloorLight(self.space, (250, 500), 'switch')
+        light2.zorder = ZORDER_HIGH
         glue.add_component('switch', switch.puzzler)
         glue.add_component('light', light.puzzler)
-        self._drawables.append(switch)
-        self._drawables.append(light)
+        glue.add_component('light2', light2.puzzler)
+        self._drawables.add(switch)
+        self._drawables.add(light)
+        self._drawables.add(light2)
 
     def add_walls(self):
         self.walls = []
@@ -78,7 +101,7 @@
 
     def add_protagonist(self):
         self.protagonist = Protagonist(self.space, (350, 300))
-        self._drawables.append(self.protagonist)
+        self._drawables.add(self.protagonist)
 
     def handle_event(self, ev):
         if ev.type == pygame.locals.KEYDOWN: