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))
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)))
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)))
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)
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)
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):
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)))
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)))
--- /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 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
* 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
** 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