ya2 · news · projects · code · about

instantiation
[pmachines.git] / pmachines / scene.py
index 490ec327f87b345891be0e2a3a9c5357717b880a..5d046e9b925b15b50b30d140e1562d75f43590cb 100644 (file)
@@ -6,6 +6,7 @@ from direct.gui.DirectGuiGlobals import FLAT, DISABLED, NORMAL
 from direct.showbase.DirectObject import DirectObject
 from pmachines.items.background import Background
 from pmachines.items.box import Box
+from lib.engine.gui.cursor import MouseCursor
 
 
 class Scene(DirectObject):
@@ -14,12 +15,15 @@ class Scene(DirectObject):
         super().__init__()
         self._world = world
         self._set_camera()
+        self._cursor = MouseCursor(
+            'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+            (.01, .01))
         self._set_gui()
         self._set_lights()
         self._set_input()
         self._set_mouse_plane()
         Background()
-        self.items = [Box(world)]
+        self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)]
         taskMgr.add(self.on_frame, 'on_frame')
 
     def _set_camera(self):
@@ -33,24 +37,30 @@ class Scene(DirectObject):
             img.set_color(col)
             img.detach_node()
             return img
-        def load_images_btn(path):
-            colors = [
-                (.6, .6, .6, 1),  # ready
-                (1, 1, 1, 1), # press
-                (.8, .8, .8, 1), # rollover
-                (.4, .4, .4, .4)]  # disabled
+        def load_images_btn(path, col):
+            colors = {
+                'gray': [
+                    (.6, .6, .6, 1),  # ready
+                    (1, 1, 1, 1), # press
+                    (.8, .8, .8, 1), # rollover
+                    (.4, .4, .4, .4)],
+                'green': [
+                    (.1, .68, .1, 1),
+                    (.1, 1, .1, 1),
+                    (.1, .84, .1, 1),
+                    (.4, .1, .1, .4)]}[col]
             return [load_img_btn(path, col) for col in colors]
         abl, abr = base.a2dBottomLeft, base.a2dBottomRight
         btn_info = [
-            ('home', self.on_home, DISABLED, abl),
-            ('information', self.on_information, DISABLED, abl),
-            ('right', self.on_play, NORMAL, abr),
-            ('next', self.on_next, DISABLED, abr),
-            ('previous', self.on_prev, DISABLED, abr),
-            ('rewind', self.on_rewind, DISABLED, abr)]
+            ('home', self.on_home, DISABLED, abl, 'gray'),
+            ('information', self.on_information, DISABLED, abl, 'gray'),
+            ('right', self.on_play, NORMAL, abr, 'green'),
+            ('next', self.on_next, DISABLED, abr, 'gray'),
+            ('previous', self.on_prev, DISABLED, abr, 'gray'),
+            ('rewind', self.on_rewind, DISABLED, abr, 'gray')]
         num_l = num_r = 0
         for binfo in btn_info:
-            imgs = load_images_btn(binfo[0])
+            imgs = load_images_btn(binfo[0], binfo[4])
             if binfo[3] == base.a2dBottomLeft:
                 sign, num = 1, num_l
                 num_l += 1
@@ -61,7 +71,9 @@ class Scene(DirectObject):
             btn = DirectButton(
                 image=imgs, scale=.05, pos=(sign * (.06 + .11 * num), 1, .06),
                 parent=binfo[3], command=binfo[1], state=binfo[2], relief=FLAT,
-                frameColor=fcols[0] if binfo[2] == NORMAL else fcols[1])
+                frameColor=fcols[0] if binfo[2] == NORMAL else fcols[1],
+                rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
+                clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
             btn.set_transparency(True)
 
     def _set_directional_light(self, name, hpr, color):
@@ -99,8 +111,7 @@ class Scene(DirectObject):
 
     def _get_hits(self):
         if not base.mouseWatcherNode.has_mouse(): return []
-        p_from = Point3()  # in camera coordinates
-        p_to = Point3()    # in camera coordinates
+        p_from, p_to = Point3(), Point3()    # in camera coordinates
         base.camLens.extrude(base.mouseWatcherNode.get_mouse(), p_from, p_to)
         p_from = render.get_relative_point(base.cam, p_from)  # global coords
         p_to = render.get_relative_point(base.cam, p_to)  # global coords
@@ -113,6 +124,8 @@ class Scene(DirectObject):
         for hit in self._get_hits():
             for item in [i for i in self.items if hit.get_node() == i.node]:
                 getattr(item, method)(pos)
+                img = 'move' if method == 'on_click_l' else 'rotate'
+                self._cursor.set_image('assets/buttons/%s.png' % img)
 
     def on_click_l(self):
         self._on_click('on_click_l')
@@ -122,6 +135,7 @@ class Scene(DirectObject):
 
     def on_release(self):
         [item.on_release() for item in self.items]
+        self._cursor.set_image('assets/buttons/arrowUpLeft.png')
 
     def on_frame(self, task):
         hits = self._get_hits()
@@ -138,6 +152,9 @@ class Scene(DirectObject):
             [itm.on_mouse_move(pos) for itm in self.items]
         return task.cont
 
+    def cb_inst(self, item):
+        self.items += [item]
+
     def on_play(self):
         [itm.play() for itm in self.items]