changeset 191:e080fcd07fa9

Overlay notes
author Stefano Rivera <stefano@rivera.za.net>
date Tue, 03 Sep 2013 21:47:24 +0200
parents 97627a999042
children 3dc2b6290e66
files data/levels/level1 nagslang/game_object.py nagslang/level.py nagslang/screens/area.py
diffstat 4 files changed, 54 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/data/levels/level1	Tue Sep 03 21:44:55 2013 +0200
+++ b/data/levels/level1	Tue Sep 03 21:47:24 2013 +0200
@@ -46,6 +46,10 @@
   - door_switch
   classname: FloorLight
   name: door_light
+- args:
+  - [290, 160]
+  - Run around, press some buttons, have fun!
+  classname: Note
 polygons:
   1:
   - [60, 780]
--- a/nagslang/game_object.py	Tue Sep 03 21:44:55 2013 +0200
+++ b/nagslang/game_object.py	Tue Sep 03 21:47:24 2013 +0200
@@ -10,6 +10,7 @@
 from nagslang.options import options
 from nagslang.resources import resources
 from nagslang.events import DoorEvent
+from nagslang.widgets.text import TextWidget
 
 
 class PuzzleGlue(object):
@@ -320,6 +321,26 @@
     return body
 
 
+class Overlay(object):
+    def set_game_object(self, game_object):
+        self.game_object = game_object
+
+    def render(self, surface):
+        pass
+
+    def is_visible(self):
+        return self.game_object.puzzler.get_state()
+
+
+class TextOverlay(Overlay):
+    def __init__(self, text):
+        self.text = text
+        self.widget = TextWidget((20, 20), self.text)
+
+    def render(self, surface):
+        self.widget.draw(surface)
+
+
 class GameObject(object):
     """A representation of a thing in the game world.
 
@@ -328,7 +349,7 @@
 
     zorder = ZORDER_LOW
 
-    def __init__(self, physicser, renderer, puzzler=None):
+    def __init__(self, physicser, renderer, puzzler=None, overlay=None):
         self.physicser = physicser
         physicser.set_game_object(self)
         self.physicser.add_to_space()
@@ -337,6 +358,9 @@
         self.puzzler = puzzler
         if puzzler is not None:
             puzzler.set_game_object(self)
+        self.overlay = overlay
+        if overlay is not None:
+            self.overlay.set_game_object(self)
 
     def get_space(self):
         return self.physicser.get_space()
@@ -383,6 +407,21 @@
         )
 
 
+class Note(GameObject):
+    zorder = ZORDER_FLOOR
+
+    def __init__(self, space, position, message):
+        body = make_body(None, None, position)
+        self.shape = pymunk.Circle(body, 30)
+        self.shape.sensor = True
+        super(Note, self).__init__(
+            SingleShapePhysicser(space, self.shape),
+            ImageRenderer(resources.get_image('objects', 'note.png')),
+            CollidePuzzler(),
+            TextOverlay(message),
+        )
+
+
 class FloorLight(GameObject):
     zorder = ZORDER_FLOOR
 
--- a/nagslang/level.py	Tue Sep 03 21:44:55 2013 +0200
+++ b/nagslang/level.py	Tue Sep 03 21:47:24 2013 +0200
@@ -29,7 +29,8 @@
         self._surface = None
         self._exterior = False
         self._glue = go.PuzzleGlue()
-        self._drawables = []
+        self.drawables = []
+        self.overlay_drawables = []
         self._game_objects = []
         self._enemies = []
 
@@ -71,7 +72,9 @@
             gobj = cls(*args)
         elif issubclass(cls, go.GameObject):
             gobj = cls(space, *args)
-            self._drawables.append(gobj)
+            self.drawables.append(gobj)
+            if gobj.overlay:
+                self.overlay_drawables.append(gobj.overlay)
         else:
             raise TypeError(
                 "Expected a subclass of Puzzler or GameObject, got %s" % (
@@ -83,7 +86,7 @@
         cls = getattr(enemies, classname)
         if issubclass(cls, go.GameObject):
             gobj = cls(space, *args)
-            self._drawables.append(gobj)
+            self.drawables.append(gobj)
         else:
             raise TypeError(
                 "Expected a subclass of GameObject, got %s" % (
@@ -130,9 +133,6 @@
     def get_walls(self):
         return self.polygons.values()
 
-    def get_drawables(self):
-        return self._drawables
-
     def _draw_walls(self):
         for index, polygon in self.polygons.items():
             color = POLY_COLORS[index]
--- a/nagslang/screens/area.py	Tue Sep 03 21:44:55 2013 +0200
+++ b/nagslang/screens/area.py	Tue Sep 03 21:47:24 2013 +0200
@@ -110,7 +110,7 @@
         self.space.add(*self.walls)
 
     def add_game_objects(self):
-        for drawable in self._level.get_drawables():
+        for drawable in self._level.drawables:
             self._drawables.add(drawable)
 
     def add_protagonist(self):
@@ -168,6 +168,9 @@
             drawable.render(mysurface)
         render_rect = self._calc_viewport(mysurface, surface)
         surface.blit(mysurface, (0, 0), render_rect)
+        for overlay in self._level.overlay_drawables:
+            if overlay.is_visible():
+                overlay.render(surface)
 
     def tick_protagonist(self):
         dx, dy = self.keys.get_direction()