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))
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)))
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)))
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
self._model_path = model_path
self._commands = []
self._command_idx = -1
+ self._restitution = restitution
self._positions = []
self._rotations = []
if count:
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
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)))
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(
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)]
--- /dev/null
+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
* 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