changeset 86:593bddfacf18

Refactor Things a bit to render images.
author Simon Cross <hodgestar+bzr@gmail.com>
date Tue, 24 Aug 2010 00:14:23 +0200
parents 5a7c35f4de8d
children 4c6fea1b242b
files gamelib/scenes/cryo.py gamelib/state.py
diffstat 2 files changed, 84 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/scenes/cryo.py	Tue Aug 24 00:11:23 2010 +0200
+++ b/gamelib/scenes/cryo.py	Tue Aug 24 00:14:23 2010 +0200
@@ -2,7 +2,8 @@
 
 import random
 
-from gamelib.state import Scene, Item, Thing, Result
+from gamelib.state import Scene, Item, Thing, Result, \
+                          InteractImage, InteractNoImage
 
 
 class Cryo(Scene):
@@ -18,8 +19,8 @@
         super(Cryo, self).__init__(state)
         self.add_item(Triangle("triangle"))
         self.add_item(TitaniumLeg("titanium_leg"))
-        self.add_thing(CryoUnitAlpha("cryo.unit.1", (20, 20, 200, 200)))
-        self.add_thing(CryoRoomDoor("cryo.door", (200, 200, 400, 300)))
+        self.add_thing(CryoUnitAlpha())
+        self.add_thing(CryoRoomDoor())
 
 
 class Triangle(Item):
@@ -37,8 +38,13 @@
 class CryoUnitAlpha(Thing):
     "Cryo unit containing titanium leg."
 
-    FOLDER = "cryo"
-    IMAGE = "cryo_unit_alpha"
+    NAME = "cryo.unit.1"
+
+    INTERACTS = {
+        "unit": InteractNoImage(100, 300, 100, 100),
+    }
+
+    INITIAL = "unit"
 
     INITIAL_DATA = {
         'contains_titanium_leg': True,
@@ -56,8 +62,14 @@
 class CryoRoomDoor(Thing):
     "Door to the cryo room."
 
-    FOLDER = "cryo"
-    IMAGE = "cryo_door_closed"
+    NAME = "cryo.door"
+
+    INTERACTS = {
+        "ajar": InteractImage(200, 200, "door_ajar.png"),
+        "open": InteractImage(200, 200, "door_open.png"),
+        }
+
+    INITIAL = "ajar"
 
     INITIAL_DATA = {
         'open': False,
@@ -82,6 +94,7 @@
 
     def open_door(self):
         self.set_data('open', True)
+        self.set_interact("open")
         self.state.scenes['bridge'].set_data('accessible', True)
         self.state.remove_inventory_item('titanium_leg')
 
--- a/gamelib/state.py	Tue Aug 24 00:11:23 2010 +0200
+++ b/gamelib/state.py	Tue Aug 24 00:14:23 2010 +0200
@@ -201,14 +201,54 @@
                 break
 
 
+class Interact(object):
+
+    def __init__(self, image, rect, interact_rect):
+        self.image = image
+        self.rect = rect
+        self.interact_rect = interact_rect
+
+    def set_thing(self, thing):
+        pass
+
+    def draw(self, surface):
+        if self.image is not None:
+            surface.blit(self.image, self.rect, None, BLEND_ADD)
+
+
+class InteractNoImage(Interact):
+
+    def __init__(self, x, y, w, h):
+        super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h))
+
+
+class InteractImage(Interact):
+
+    def __init__(self, x, y, image_name):
+        super(InteractImage, self).__init__(None, None, None)
+        self._pos = (x, y)
+        self._image_name = image_name
+
+    def set_thing(self, thing):
+        self.image = get_image(thing.folder, self._image_name)
+        self.rect = Rect(self._pos, self.image.get_size())
+        self.interact_rect = self.rect
+
+
 class Thing(StatefulGizmo):
     """Base class for things in a scene that you can interact with."""
 
-    # sub-folder to look for resources in
+    # name of thing
+    NAME = None
+
+    # sub-folder to look for resources in (defaults to scenes folder)
     FOLDER = None
 
-    # name of image resource
-    IMAGE = None
+    # list of Interact objects
+    INTERACTS = {}
+
+    # name first interact
+    INITIAL = None
 
     # Interact rectangle hi-light color (for debugging)
     # (set to None to turn off)
@@ -217,23 +257,35 @@
     else:
         _interact_hilight_color = None
 
-    def __init__(self, name, rect):
+    def __init__(self):
         StatefulGizmo.__init__(self)
-        self.name = name
-        # area within scene to render to
-        self.rect = Rect(rect)
-        # area within scene that triggers calls to interact
-        self.interact_rect = Rect(rect)
+        # name of the thing
+        self.name = self.NAME
+        # folder for resource (None is overridden by scene folder)
+        self.folder = self.FOLDER
+        # interacts
+        self.interacts = self.INTERACTS
         # these are set by set_scene
         self.scene = None
         self.state = None
+        self.current_interact = None
+        self.rect = None
         # TODO: add masks
-        # TODO: add images
 
     def set_scene(self, scene):
         assert self.scene is None
         self.scene = scene
+        if self.folder is None:
+            self.folder = scene.FOLDER
         self.state = scene.state
+        for interact in self.interacts.itervalues():
+            interact.set_thing(self)
+        self.set_interact(self.INITIAL)
+
+    def set_interact(self, name):
+        self.current_interact = self.interacts[name]
+        self.rect = self.current_interact.interact_rect
+        assert self.rect is not None, name
 
     def get_description(self):
         return None
@@ -268,10 +320,10 @@
         return Result("It doesn't work.")
 
     def draw(self, surface):
+        self.current_interact.draw(surface)
         if self._interact_hilight_color is not None:
             frame_rect(surface, self._interact_hilight_color,
-                self.interact_rect.inflate(1, 1), 1)
-        # TODO: draw image if there is one
+                self.rect.inflate(1, 1), 1)
 
 
 class Item(object):