ya2 · news · projects · code · about

basketball scene
authorFlavio Calva <f.calva@gmail.com>
Tue, 1 Mar 2022 18:54:52 +0000 (19:54 +0100)
committerFlavio Calva <f.calva@gmail.com>
Tue, 1 Mar 2022 18:54:52 +0000 (19:54 +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/menu.py
pmachines/scenes/scene_basketball.py [new file with mode: 0644]
prj.org

index a2ed26b7ba99c043fb6d6a24700b2f38e9ee3ac7..80cc3deb10d292554869e922c16488d85166dd77 100644 (file)
@@ -4,8 +4,8 @@ from pmachines.items.item import Item
 
 class Basketball(Item):
 
-    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/basketball/basketball.gltf', .4, mass=mass, pos=pos, r=r, count=count)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.92):
+        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)
 
     def _set_shape(self):
         self.node.add_shape(BulletSphereShape(1))
index e9a33c0aee7e334f5f20098484a6c47f0e15e986..859f70106978e0197ea731bfb8375b2b1ddc2a7e 100644 (file)
@@ -4,8 +4,8 @@ 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):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/box/box.gltf', mass=mass, pos=pos, r=r, count=count)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5):
+        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)
 
     def _set_shape(self):
         self.node.add_shape(BulletBoxShape((.5, .5, .5)))
index d43e73c68164345cc25094ac108347d9af37a032..c037602ee26ca5debf4a173258bd8b3454c7ae17 100644 (file)
@@ -4,8 +4,8 @@ from pmachines.items.item import Item, StillStrategy
 
 class Domino(Item):
 
-    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/domino/domino.gltf', mass=mass, pos=pos, r=r, count=count)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5):
+        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)
 
     def _set_shape(self):
         self.node.add_shape(BulletBoxShape((.1, .25, .5)))
index 38a5d960012dbe8ed875095564a56f6f1eaacb55..5a5cc322bb1729cda92645c53dcb1e6570531caf 100644 (file)
@@ -48,7 +48,7 @@ class StillStrategy:
 
 class Item:
 
-    def __init__(self, world, plane_node, cb_inst, curr_bottom, scene_repos, model_path, model_scale=1, exp_num_contacts=1, mass=1, pos=(0, 0, 0), r=0, count=0):
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, scene_repos, model_path, model_scale=1, exp_num_contacts=1, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5):
         self._world = world
         self._plane_node = plane_node
         self._count = count
@@ -68,6 +68,7 @@ class Item:
         self._model_path = model_path
         self._commands = []
         self._command_idx = -1
+        self._restitution = restitution
         self._positions = []
         self._rotations = []
         if count:
@@ -195,6 +196,7 @@ class Item:
         self._world.remove_rigid_body(self.node)
         self.node.set_mass(self._mass)
         self._world.attach_rigid_body(self.node)
+        self.node.set_restitution(self._restitution)
 
     def on_click_l(self, pos):
         if self._paused: return
index 558ad25688a8bbc083ca59a88a98ec665c7fff1b..fb7b944700be5b49ad22f23e178c3a87a02ac7a0 100644 (file)
@@ -4,8 +4,8 @@ from pmachines.items.item import Item
 
 class Shelf(Item):
 
-    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
-        super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/shelf/shelf.gltf', mass=mass, pos=pos, r=r, count=count)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.5):
+        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)
 
     def _set_shape(self):
         self.node.add_shape(BulletBoxShape((1, .5, .05)))
index cf0cf238006c18b438b742b388e57d2c75157ceb..da14627b12f6ba285e891036466c4aa40c2a5b45 100644 (file)
@@ -5,8 +5,8 @@ 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):
-        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)
+    def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, restitution=.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)
 
     def _set_shape(self):
         self.node.add_shape(
index 9dd67e5679e7d1e1f71d7a0a188c8238b5686d61..190c372796fb46a2b77361aa255382991eba7b9e 100644 (file)
@@ -160,7 +160,7 @@ class Menu:
             text=_('Website'), pos=(-.6, 1, .29), command=self.on_website,
             **self._common_btn | {'scale': .08})]
         self._widgets += [OnscreenText(
-            _('Supporters\n  \1scale\1rdb\2\n  \1scale\1Luisa Tenuta\2\n  \1scale\1Damiana Ercolani\2'),
+            _('Special thanks to:\n  \1scale\1rdb\2\n  \1scale\1Luisa Tenuta\2\n  \1scale\1Damiana Ercolani\2'),
             pos=(.1, .55), font=self._common['text_font'],
             scale=self._common['scale'], fg=self._common['text_fg'],
             align=TextNode.A_left)]
diff --git a/pmachines/scenes/scene_basketball.py b/pmachines/scenes/scene_basketball.py
new file mode 100644 (file)
index 0000000..03053f9
--- /dev/null
@@ -0,0 +1,61 @@
+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 SceneBasketBall(Scene):
+
+    sorting = 3
+
+    @staticmethod
+    def name():
+        return _('Basket ball')
+
+    def _set_items(self):
+        self.items = []
+        #self.items += [Box(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, count=9)]
+        self.items += [Basketball(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=1)]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-.56, 0, .21))]
+        self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(1.67, 0, .21))]
+        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=(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=(-4.45, 0, -3.18), r=27, restitution=1)]
+        #self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-5.45, 0, -3.18), restitution=1)]
+        #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 += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=9)]
+        self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(-.61, 0, -.94))]
+        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=(-.06, 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=(0.91, 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=(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, 30))
+        #self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(-.61, 0, .73), r=37)]
+        #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=(-.06, 0, .78))]
+        #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=(0.91, 0, .78))]
+        #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=(1.73, 0, .78))]
+        #self.items[-1].set_strategy(UpStrategy(self.items[-1]._np, 30))
+        #self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(2.57, 0, .78))]
+        #self.items[-1].set_strategy(UpStrategy(self.items[-1]._np, 30))
+        #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 11826f91222145d8111be72cf72adede4bfe7af1..98a8f3e6f87508588db17173ccaedd3c881d987c 100644 (file)
--- a/prj.org
+++ b/prj.org
@@ -1,10 +1,12 @@
 * issues
 * todo
-** level basketball
+** unstable physics computations
+** menu: (two rows)
 ** level domino + box + basketball
 ** level teetertooter
 ** level domino + box + basketball + teetertooter
 ** 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
 ** refactoring