class Basketball(Item):
- def __init__(self, world, plane_node, count, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
- super().__init__(world, plane_node, count, 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):
+ 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 _set_shape(self):
self.node.add_shape(BulletSphereShape(1))
class Box(Item):
- def __init__(self, world, plane_node, count, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
- super().__init__(world, plane_node, count, 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):
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/box/box.gltf', mass=mass, pos=pos, r=r, count=count)
def _set_shape(self):
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):
super().__init__(world, plane_node, cb_inst, curr_bottom, repos, 'assets/gltf/domino/domino.gltf', mass=mass, pos=pos, r=r, count=count)
-
def _set_shape(self):
self.node.add_shape(BulletBoxShape((.1, .25, .5)))
+
+
+class TargetDomino(Domino):
+
+ def __init__(self, world, plane_node, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0, tgt_degrees=0):
+ self._tgt_degrees = tgt_degrees
+ super().__init__(world, plane_node, cb_inst, curr_bottom, repos, mass=mass, pos=pos, r=r, count=count)
+
+ def end_condition(self):
+ return abs(self._np.get_r()) >= self._tgt_degrees
if hasattr(self, '_txt') and not self._txt.is_empty():
self._txt.set_alpha_scale(1)
+ def end_condition(self):
+ return True
+
def destroy(self):
self._np.remove_node()
taskMgr.remove(self._box_tsk)
class TeeterTooter(Item):
- def __init__(self, world, plane_node, count, cb_inst, curr_bottom, repos, mass=1, pos=(0, 0, 0), r=0, count=0):
- super().__init__(world, plane_node, count, 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):
+ 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 _set_shape(self):
self.node.add_shape(
'auto_start': 0,
'auto_close_instructions': 0,
'show_buffers': 0,
- 'debug_items': 0}}
+ 'debug_items': 0,
+ 'fps': 0}}
opt_path = LibP3d.fixpath(data_path + '/' + optfile) if data_path else optfile
opt_exists = exists(opt_path)
self._options = DctFile(
self.base.disable_mouse()
if self._options['development']['show_buffers']:
base.bufferViewer.toggleEnable()
+ if self._options['development']['fps']:
+ base.set_frame_rate_meter(True)
#self.base.accept('window-event', self._on_win_evt)
self.base.accept('aspectRatioChanged', self._on_aspect_ratio_changed)
from pmachines.items.background import Background
from pmachines.items.box import Box
from pmachines.items.shelf import Shelf
-from pmachines.items.domino import Domino
+from pmachines.items.domino import Domino, TargetDomino
from pmachines.items.basketball import Basketball
from pmachines.items.teetertooter import TeeterTooter
from pmachines.sidepanel import SidePanel
self.items = []
#self.items += [Box(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=3)]
#self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=3)]
- self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-1.2, 0, 1), r=10)]
- self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(1.2, 0, 1), r=-10)]
- self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=3)]
+ self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(-1.2, 0, -.6))]
+ self.items += [Shelf(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, mass=0, pos=(1.2, 0, -.6))]
+ self.items += [Domino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, count=2)]
+ self.items += [TargetDomino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(-1.14, 0, -.04), tgt_degrees=60)]
+ self.items += [TargetDomino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(-.49, 0, -.04), tgt_degrees=60)]
+ self.items += [TargetDomino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(0.94, 0, -.04), tgt_degrees=60)]
+ self.items += [TargetDomino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(1.55, 0, -.04), tgt_degrees=60)]
+ self.items += [TargetDomino(self._world, self._mouse_plane_node, self.cb_inst, self.current_bottom, self.repos, pos=(2.09, 0, -.04), tgt_degrees=88)]
#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)]
self._commands = []
self._command_idx = 0
+ if hasattr(self, '_success_txt'):
+ self._success_txt.destroy()
+ del self._success_txt
+ self.__right_btn['state'] = NORMAL
def destroy(self):
self._unset_gui()
self._item_active.on_mouse_move(pos)
if self._dbg_items:
self._update_info(items_hit[0] if items_hit else None)
+ if all(itm.end_condition() for itm in self.items) and not hasattr(self, '_success_txt'):
+ loader.load_sfx('assets/audio/sfx/success.ogg').play()
+ font = base.loader.load_font('assets/fonts/Hanken-Book.ttf')
+ font.clear()
+ font.set_pixels_per_unit(60)
+ font.set_minfilter(Texture.FTLinearMipmapLinear)
+ font.set_outline((0, 0, 0, 1), .8, .2)
+ self._success_txt = OnscreenText(
+ _('You win!'), font=font, scale=0.2, fg=(.9, .9, .9, 1))
return task.cont
def cb_inst(self, item):
self.items += [item]
def on_play(self):
+ self.__prev_btn['state'] = DISABLED
+ self.__next_btn['state'] = DISABLED
+ self.__right_btn['state'] = DISABLED
[itm.play() for itm in self.items]
def on_next(self):
* issues
* todo
-** ending condition
+** fix side panel
** script for creating a screenshot of the level
** second level (box + shelf)
** level menu