# HG changeset patch # User Stefano Rivera # Date 1378237644 -7200 # Node ID e080fcd07fa995de2bd528e2128ef6f70f7cf1a6 # Parent 97627a999042fa39be242e49d9a53e5faa48ad60 Overlay notes diff -r 97627a999042 -r e080fcd07fa9 data/levels/level1 --- 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] diff -r 97627a999042 -r e080fcd07fa9 nagslang/game_object.py --- 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 diff -r 97627a999042 -r e080fcd07fa9 nagslang/level.py --- 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] diff -r 97627a999042 -r e080fcd07fa9 nagslang/screens/area.py --- 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()