ya2 · news · projects · code · about

scene: teeter tooter
authorFlavio Calva <f.calva@gmail.com>
Thu, 3 Mar 2022 17:58:15 +0000 (18:58 +0100)
committerFlavio Calva <f.calva@gmail.com>
Thu, 3 Mar 2022 17:58:15 +0000 (18:58 +0100)
pmachines/items/basketball.py
pmachines/items/box.py
pmachines/items/domino.py
pmachines/items/item.py
pmachines/items/shelf.py
pmachines/items/teetertooter.py
pmachines/scenes/scene_teeter_tooter.py [new file with mode: 0644]
prj.org

index 97fd680a835c3c4b99e5581848b6b8ea804cd877..0bbf26e54a3a3b1a912b62b30832c63d93d370ef 100644 (file)
@@ -7,5 +7,5 @@ class Basketball(Item):
     def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.92, friction=.6):
         super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/basketball/basketball.gltf', .4, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
         self.node.add_shape(BulletSphereShape(1))
index 15f95acf55f37e0f13ed647df0832e074837d8d1..60f51b174d19cfc1579bc5257a83ab2a1733f6d7 100644 (file)
@@ -4,10 +4,10 @@ from pmachines.items.item import Item
 
 class Box(Item):
 
-    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.8):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/box/box.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.8, model_scale=1):
+        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/box/box.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=model_scale)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
         self.node.add_shape(BulletBoxShape((.5, .5, .5)))
 
 
index cc370ae76e01426b81eb83c6bc8b1f5fec44e368..c654e4826e849d4052d9221782293762b3ad22d3 100644 (file)
@@ -7,7 +7,7 @@ class Domino(Item):
     def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.6):
         super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/domino/domino.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
         self.node.add_shape(BulletBoxShape((.1, .25, .5)))
 
 
index 8077cafb33679476d2efbfb2203137b43dd70880..fabd391d1bef5ca639b08ab95f089d67b561c88e 100644 (file)
@@ -76,7 +76,7 @@ class Item:
             self.node = BulletGhostNode(self.__class__.__name__)
         else:
             self.node = BulletRigidBodyNode(self.__class__.__name__)
-        self._set_shape()
+        self._set_shape(count)
         self._np = render.attach_new_node(self.node)
         if count:
             world.attach_ghost(self.node)
@@ -87,6 +87,7 @@ class Item:
         self._model.flatten_light()
         self._model.reparent_to(self._np)
         self._np.set_scale(model_scale)
+        self._np.flatten_strong()
         if count:
             self._set_outline_model()
             set_srgb(self._outline_model)
@@ -105,7 +106,7 @@ class Item:
             self._np.set_pos(pos)
             self._np.set_r(r)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
         pass
 
     def set_strategy(self, strategy):
index af175f98fbb9140180c4ac0c6d981ab883e9cb8e..357ca09ff2346109440e2c4220b2aff6f5ab07bb 100644 (file)
@@ -7,5 +7,5 @@ class Shelf(Item):
     def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.6):
         super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/shelf/shelf.gltf', mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
         self.node.add_shape(BulletBoxShape((1, .5, .05)))
index 60f9e7b93d385bc506fbfa5d10781a67953cd89a..d63741d5a61e3cb0d29798698a7c1371121a631f 100644 (file)
@@ -6,15 +6,16 @@ from pmachines.items.item import Item
 class TeeterTooter(Item):
 
     def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5, friction=.5):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/teeter_tooter/teeter_tooter.gltf', exp_num_contacts=2, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=restitution, friction=friction)
+        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/teeter_tooter/teeter_tooter.gltf', exp_num_contacts=2, mass=mass, pos=pos, r=r, count=count, restitution=restitution, friction=friction, model_scale=.5)
 
-    def _set_shape(self):
+    def _set_shape(self, apply_scale=True):
+        scale = self._model_scale if apply_scale else 1
         self.node.add_shape(
             BulletCylinderShape(.1, 1.6, YUp),
-            TransformState.makePos((0, 0, .36)))
+            TransformState.makePos((0, 0, scale * .36)))
         self.node.add_shape(
             BulletCylinderShape(.1, .7, ZUp),
-            TransformState.makePos((0, .8, -.1)))
+            TransformState.makePos((0, scale * .8, scale * -.1)))
         self.node.add_shape(
             BulletCylinderShape(.1, .7, ZUp),
-            TransformState.makePos((0, -.8, -.1)))
+            TransformState.makePos((0, scale * -.8, scale * -.1)))
diff --git a/pmachines/scenes/scene_teeter_tooter.py b/pmachines/scenes/scene_teeter_tooter.py
new file mode 100644 (file)
index 0000000..2ed320b
--- /dev/null
@@ -0,0 +1,48 @@
+from pmachines.scene import Scene
+from pmachines.items.box import Box
+from pmachines.items.shelf import Shelf
+from pmachines.items.domino import Domino, UpStrategy, DownStrategy
+from pmachines.items.basketball import Basketball
+from pmachines.items.teetertooter import TeeterTooter
+
+
+class SceneTeeterTooter(Scene):
+
+    sorting = 5
+
+    @staticmethod
+    def name():
+        return _('Teeter tooter')
+
+    def _set_items(self):
+        self.items = []
+        self.items += [Box(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=3, count=1, friction=1)]
+        #self.items += [TeeterTooter(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=5, count=2)]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-2.76, 0, -1.45))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-.56, 0, -1.45))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(2.27, 0, -.28))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(4.38, 0, -.28))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(1.67, 0, -1.45))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(3.78, 0, -1.45))]
+        self.items += [TeeterTooter(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-2.74, 0, -1.20))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=1, r=-25.30, friction=1, pos=(-2.78, 0, -.93))]
+        self.items += [Box(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=.2, friction=1, model_scale=.5, pos=(-3.61, 0, -.99), r=-25.30)]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-.25, 0, -.57), r=52)]
+        self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(1.73, 0, -.89))]
+        self.items[-1].set_strategy(DownStrategy(self.items[-1]._np, 35))
+        self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(2.57, 0, -.89))]
+        self.items[-1].set_strategy(DownStrategy(self.items[-1]._np, 35))
+        self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(3.50, 0, -.89))]
+        self.items[-1].set_strategy(DownStrategy(self.items[-1]._np, 35))
+        #self.items += [Basketball(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=3)]
+        #self.items += [TeeterTooter(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=3)]
+
+    def _instr_txt(self):
+        txt = _('Scene: ') + self.name() + '\n\n'
+        txt += _('Goal: you must hit every domino piece\n\n')
+        txt += _('keep \5mouse_l\5 pressed to drag an item\n\n'
+                'keep \5mouse_r\5 pressed to rotate an item')
+        return txt
+
+    def _win_condition(self):
+        return all(itm.strategy.win_condition() for itm in self.items) and not self._paused
diff --git a/prj.org b/prj.org
index d979cedcd6e08748f4b000d09390360e41508685..b11e6edc61f305d93125ab04d1bf457cfe7aad94 100644 (file)
--- a/prj.org
+++ b/prj.org
@@ -1,12 +1,6 @@
 * issues
 * todo
-** level teetertooter
 ** level domino + box + basketball + teetertooter
-** buttons of the scenes with played indications
-*** each scene has a last-modification
-*** when you win save the id + last-modification
-*** put a check if id is saved and last-modifications are equal
-** intro animation (from target item to start position)
 ** optimize images creation (python setup.py images)
 ** use dds files in place of png/jpg
 ** use bam files
@@ -15,6 +9,11 @@
 ** version 0.0.yymmdd
 ** do intro video with moviepy
 ** android build
+** intro animation (from target item to start position)
+** buttons of the scenes with played indications
+*** each scene has a last-modification
+*** when you win save the id + last-modification
+*** put a check if id is saved and last-modifications are equal
 ** magnet, road cone, bucket
 *  waiting
 ** itch.io's client works with wine: functional tests for windows-itch.io