changeset 107:b90d01e4d9d4

Layered drawing.
author Jeremy Thurgood <firxen@gmail.com>
date Mon, 02 Sep 2013 14:01:55 +0200
parents bce9cd8a4a8c
children dde91f8c4335
files nagslang/constants.py nagslang/game_object.py nagslang/protagonist.py nagslang/screens/area.py
diffstat 4 files changed, 37 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/constants.py	Mon Sep 02 13:48:24 2013 +0200
+++ b/nagslang/constants.py	Mon Sep 02 14:01:55 2013 +0200
@@ -15,3 +15,8 @@
 COLLISION_TYPE_BOX = 4
 
 SWITCH_PUSHERS = [COLLISION_TYPE_PLAYER, COLLISION_TYPE_BOX]
+
+ZORDER_FLOOR = 0
+ZORDER_LOW = 1
+ZORDER_MID = 2
+ZORDER_HIGH = 3
--- a/nagslang/game_object.py	Mon Sep 02 13:48:24 2013 +0200
+++ b/nagslang/game_object.py	Mon Sep 02 14:01:55 2013 +0200
@@ -4,7 +4,8 @@
 import pymunk
 import pymunk.pygame_util
 
-from nagslang.constants import SWITCH_PUSHERS, COLLISION_TYPE_SWITCH
+from nagslang.constants import (
+    SWITCH_PUSHERS, COLLISION_TYPE_SWITCH, ZORDER_LOW)
 from nagslang.options import options
 
 
@@ -177,6 +178,7 @@
         self.physicser.add_to_space()
         self.renderer = renderer
         self.puzzler = puzzler
+        self.zorder = ZORDER_LOW
 
     def get_render_position(self, surface):
         return self.physicser.get_render_position(surface)
--- a/nagslang/protagonist.py	Mon Sep 02 13:48:24 2013 +0200
+++ b/nagslang/protagonist.py	Mon Sep 02 14:01:55 2013 +0200
@@ -1,7 +1,7 @@
 import pymunk
 import pymunk.pygame_util
 
-from nagslang.constants import COLLISION_TYPE_PLAYER
+from nagslang.constants import COLLISION_TYPE_PLAYER, ZORDER_MID
 from nagslang.game_object import (
     GameObject, SingleShapePhysicser, FacingImageRenderer)
 from nagslang.mutators import FLIP_H
@@ -25,6 +25,7 @@
 
         super(Protagonist, self).__init__(
             self._physicsers[self.form], self._renderers[self.form])
+        self.zorder = ZORDER_MID
 
         self.go_human()
 
--- 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: