diff gamelib/state.py @ 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 d7c0a702a0b4
children 053bc8e167fc
line wrap: on
line diff
--- 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):