ya2 · news · projects · code · about

instructions: exit button
authorFlavio Calva <f.calva@gmail.com>
Sun, 16 Jan 2022 17:31:48 +0000 (18:31 +0100)
committerFlavio Calva <f.calva@gmail.com>
Sun, 16 Jan 2022 17:31:48 +0000 (18:31 +0100)
pmachines/items/box.py
pmachines/scene.py
prj.org

index 2e65777442d2971631254bed99365e22cb878543..900b9cff4dbcf5b1d4c847d3fc80078d38b20cb5 100644 (file)
@@ -10,6 +10,7 @@ class Box:
         self._plane_node = plane_node
         self._count = count
         self._cb_inst = cb_inst
+        self._paused = False
         self._shape = BulletBoxShape((.5, .5, .5))
         self.node = BulletGhostNode('box')
         self.node.add_shape(self._shape)
@@ -90,6 +91,7 @@ class Box:
         self._world.attach_rigid_body(self.node)
 
     def on_click_l(self, pos):
+        if self._paused: return
         self._start_drag_pos = pos, self._np.get_pos()
         loader.load_sfx('assets/audio/sfx/grab.ogg').play()
         if not self._instantiated:
@@ -111,6 +113,7 @@ class Box:
                 self._cb_inst(box)
 
     def on_click_r(self, pos):
+        if self._paused: return
         self._prev_rot_info = pos, self._np.get_pos(), self._np.get_r()
         loader.load_sfx('assets/audio/sfx/grab.ogg').play()
 
@@ -120,7 +123,8 @@ class Box:
         self._start_drag_pos = self._prev_rot_info = None
 
     def on_mouse_on(self):
-        self._outline_model.show()
+        if not self._paused:
+            self._outline_model.show()
 
     def on_mouse_off(self):
         if self._start_drag_pos or self._prev_rot_info: return
@@ -140,3 +144,14 @@ class Box:
     def on_aspect_ratio_changed(self):
         if not self._instantiated:
             self._repos()
+
+    def store_state(self):
+        self._paused = True
+        self._model.set_transparency(True)
+        self._model.set_alpha_scale(.3)
+        self._txt.set_alpha_scale(.3)
+
+    def restore_state(self):
+        self._paused = False
+        self._model.set_alpha_scale(1)
+        self._txt.set_alpha_scale(1)
index 72dc4237103a198437442672c40987069f546529..4b3ee7e907cc222d5067820f5c9145d09c9bc701 100644 (file)
@@ -26,9 +26,11 @@ class Scene(DirectObject):
         self._set_lights()
         self._set_input()
         self._set_mouse_plane()
+        self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)]
+        self._paused = True
+        self.__store_state()
         self._set_instructions()
         Background()
-        self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)]
         self._side_panel = SidePanel(world, self._mouse_plane_node, (-5, 4), (-3, 1), 1)
         taskMgr.add(self.on_frame, 'on_frame')
 
@@ -36,13 +38,14 @@ class Scene(DirectObject):
         base.camera.set_pos(0, -20, 0)
         base.camera.look_at(0, 0, 0)
 
+    def __load_img_btn(self, path, col):
+        img = OnscreenImage('assets/buttons/%s.png' % path)
+        img.set_transparency(True)
+        img.set_color(col)
+        img.detach_node()
+        return img
+
     def _set_gui(self):
-        def load_img_btn(path, col):
-            img = OnscreenImage('assets/buttons/%s.png' % path)
-            img.set_transparency(True)
-            img.set_color(col)
-            img.detach_node()
-            return img
         def load_images_btn(path, col):
             colors = {
                 'gray': [
@@ -55,7 +58,7 @@ class Scene(DirectObject):
                     (.1, 1, .1, 1),
                     (.1, .84, .1, 1),
                     (.4, .1, .1, .4)]}[col]
-            return [load_img_btn(path, col) for col in colors]
+            return [self.__load_img_btn(path, col) for col in colors]
         abl, abr = base.a2dBottomLeft, base.a2dBottomRight
         btn_info = [
             ('home', self.on_home, DISABLED, abl, 'gray'),
@@ -65,6 +68,7 @@ class Scene(DirectObject):
             ('previous', self.on_prev, DISABLED, abr, 'gray'),
             ('rewind', self.on_rewind, DISABLED, abr, 'gray')]
         num_l = num_r = 0
+        btns = []
         for binfo in btn_info:
             imgs = load_images_btn(binfo[0], binfo[4])
             if binfo[3] == base.a2dBottomLeft:
@@ -81,6 +85,9 @@ class Scene(DirectObject):
                 rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
                 clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
             btn.set_transparency(True)
+            btns += [btn]
+        self.__home_btn, self.__info_btn, self.__right_btn, self.__next_btn, \
+            self.__prev_btn, self.__rewind_btn = btns
 
     def _set_directional_light(self, name, hpr, color):
         light = DirectionalLight(name)
@@ -121,6 +128,8 @@ class Scene(DirectObject):
         return self._world.ray_test_all(p_from, p_to).get_hits()
 
     def _on_click(self, method):
+        if self._paused:
+            return
         for hit in self._get_hits():
             if hit.get_node() == self._mouse_plane_node:
                 pos = hit.get_hit_pos()
@@ -206,10 +215,49 @@ class Scene(DirectObject):
         u_l = self._txt.textNode.get_upper_left_3d()
         l_r = self._txt.textNode.get_lower_right_3d()
         w, h = l_r[0] - u_l[0], u_l[2] - l_r[2]
+        btn_scale = .05
+        mar = .06  # margin
         z = h / 2 - font.get_line_height() * self._txt['scale'][1]
+        z += (btn_scale + 2 * mar) / 2
         self._txt['pos'] = -w / 2, z
         u_l = self._txt.textNode.get_upper_left_3d()
         l_r = self._txt.textNode.get_lower_right_3d()
-        mar = .06  # margin
-        fsz = u_l[0] - mar, l_r[0] + mar, l_r[2] - mar, u_l[2] + mar
+        c_l_r = l_r[0], l_r[1], l_r[2] - 2 * mar - btn_scale
+        fsz = u_l[0] - mar, l_r[0] + mar, c_l_r[2] - mar, u_l[2] + mar
         frm['frameSize'] = fsz
+        colors = [
+            (.6, .6, .6, 1),  # ready
+            (1, 1, 1, 1), # press
+            (.8, .8, .8, 1), # rollover
+            (.4, .4, .4, .4)]
+        imgs = [self.__load_img_btn('exitRight', col) for col in colors]
+        btn = DirectButton(
+            image=imgs, scale=btn_scale,
+            pos=(l_r[0] - btn_scale, 1, l_r[2] - mar - btn_scale),
+            parent=frm, command=self.__on_close_instructions, extraArgs=[frm],
+            relief=FLAT, frameColor=(.6, .6, .6, .08),
+            rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
+            clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
+        btn.set_transparency(True)
+
+    def __store_state(self):
+        btns = [
+            self.__home_btn, self.__info_btn, self.__right_btn,
+            self.__next_btn, self.__prev_btn, self.__rewind_btn]
+        self.__btn_state = [btn['state'] for btn in btns]
+        for btn in btns:
+            btn['state'] = DISABLED
+        [itm.store_state() for itm in self.items]
+
+    def __restore_state(self):
+        btns = [
+            self.__home_btn, self.__info_btn, self.__right_btn,
+            self.__next_btn, self.__prev_btn, self.__rewind_btn]
+        for btn, state in zip(btns, self.__btn_state):
+            btn['state'] = state
+        [itm.restore_state() for itm in self.items]
+        self._paused = False
+
+    def __on_close_instructions(self, frm):
+        frm.remove_node()
+        self.__restore_state()
diff --git a/prj.org b/prj.org
index 83bec887c7fdcdb249efcedeae856dc460939480..b5746dd96ac04448c87e9b8cd6a73c8ba0baa879 100644 (file)
--- a/prj.org
+++ b/prj.org
@@ -5,6 +5,7 @@
 ** implement the operations of the buttons
 ** create one level per item, then levels with more items
 *** e.g. item1, item2, item1+2, item3, item1+2+3, ...
+** android build
 ** build pipeline
 ** version 0.0.yymmdd
 ** do intro video with moviepy