self._plane_node = plane_node
self._count = count
self._cb_inst = cb_inst
+ self._paused = False
self._shape = BulletBoxShape((.5, .5, .5))
self.node = BulletGhostNode('box')
self.node.add_shape(self._shape)
self._world.attach_rigid_body(self.node)
def on_click_l(self, pos):
+ if self._paused: return
self._start_drag_pos = pos, self._np.get_pos()
loader.load_sfx('assets/audio/sfx/grab.ogg').play()
if not self._instantiated:
self._cb_inst(box)
def on_click_r(self, pos):
+ if self._paused: return
self._prev_rot_info = pos, self._np.get_pos(), self._np.get_r()
loader.load_sfx('assets/audio/sfx/grab.ogg').play()
self._start_drag_pos = self._prev_rot_info = None
def on_mouse_on(self):
- self._outline_model.show()
+ if not self._paused:
+ self._outline_model.show()
def on_mouse_off(self):
if self._start_drag_pos or self._prev_rot_info: return
def on_aspect_ratio_changed(self):
if not self._instantiated:
self._repos()
+
+ def store_state(self):
+ self._paused = True
+ self._model.set_transparency(True)
+ self._model.set_alpha_scale(.3)
+ self._txt.set_alpha_scale(.3)
+
+ def restore_state(self):
+ self._paused = False
+ self._model.set_alpha_scale(1)
+ self._txt.set_alpha_scale(1)
self._set_lights()
self._set_input()
self._set_mouse_plane()
+ self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)]
+ self._paused = True
+ self.__store_state()
self._set_instructions()
Background()
- self.items = [Box(world, self._mouse_plane_node, 3, self.cb_inst)]
self._side_panel = SidePanel(world, self._mouse_plane_node, (-5, 4), (-3, 1), 1)
taskMgr.add(self.on_frame, 'on_frame')
base.camera.set_pos(0, -20, 0)
base.camera.look_at(0, 0, 0)
+ def __load_img_btn(self, path, col):
+ img = OnscreenImage('assets/buttons/%s.png' % path)
+ img.set_transparency(True)
+ img.set_color(col)
+ img.detach_node()
+ return img
+
def _set_gui(self):
- def load_img_btn(path, col):
- img = OnscreenImage('assets/buttons/%s.png' % path)
- img.set_transparency(True)
- img.set_color(col)
- img.detach_node()
- return img
def load_images_btn(path, col):
colors = {
'gray': [
(.1, 1, .1, 1),
(.1, .84, .1, 1),
(.4, .1, .1, .4)]}[col]
- return [load_img_btn(path, col) for col in colors]
+ return [self.__load_img_btn(path, col) for col in colors]
abl, abr = base.a2dBottomLeft, base.a2dBottomRight
btn_info = [
('home', self.on_home, DISABLED, abl, 'gray'),
('previous', self.on_prev, DISABLED, abr, 'gray'),
('rewind', self.on_rewind, DISABLED, abr, 'gray')]
num_l = num_r = 0
+ btns = []
for binfo in btn_info:
imgs = load_images_btn(binfo[0], binfo[4])
if binfo[3] == base.a2dBottomLeft:
rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
btn.set_transparency(True)
+ btns += [btn]
+ self.__home_btn, self.__info_btn, self.__right_btn, self.__next_btn, \
+ self.__prev_btn, self.__rewind_btn = btns
def _set_directional_light(self, name, hpr, color):
light = DirectionalLight(name)
return self._world.ray_test_all(p_from, p_to).get_hits()
def _on_click(self, method):
+ if self._paused:
+ return
for hit in self._get_hits():
if hit.get_node() == self._mouse_plane_node:
pos = hit.get_hit_pos()
u_l = self._txt.textNode.get_upper_left_3d()
l_r = self._txt.textNode.get_lower_right_3d()
w, h = l_r[0] - u_l[0], u_l[2] - l_r[2]
+ btn_scale = .05
+ mar = .06 # margin
z = h / 2 - font.get_line_height() * self._txt['scale'][1]
+ z += (btn_scale + 2 * mar) / 2
self._txt['pos'] = -w / 2, z
u_l = self._txt.textNode.get_upper_left_3d()
l_r = self._txt.textNode.get_lower_right_3d()
- mar = .06 # margin
- fsz = u_l[0] - mar, l_r[0] + mar, l_r[2] - mar, u_l[2] + mar
+ c_l_r = l_r[0], l_r[1], l_r[2] - 2 * mar - btn_scale
+ fsz = u_l[0] - mar, l_r[0] + mar, c_l_r[2] - mar, u_l[2] + mar
frm['frameSize'] = fsz
+ colors = [
+ (.6, .6, .6, 1), # ready
+ (1, 1, 1, 1), # press
+ (.8, .8, .8, 1), # rollover
+ (.4, .4, .4, .4)]
+ imgs = [self.__load_img_btn('exitRight', col) for col in colors]
+ btn = DirectButton(
+ image=imgs, scale=btn_scale,
+ pos=(l_r[0] - btn_scale, 1, l_r[2] - mar - btn_scale),
+ parent=frm, command=self.__on_close_instructions, extraArgs=[frm],
+ relief=FLAT, frameColor=(.6, .6, .6, .08),
+ rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
+ clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
+ btn.set_transparency(True)
+
+ def __store_state(self):
+ btns = [
+ self.__home_btn, self.__info_btn, self.__right_btn,
+ self.__next_btn, self.__prev_btn, self.__rewind_btn]
+ self.__btn_state = [btn['state'] for btn in btns]
+ for btn in btns:
+ btn['state'] = DISABLED
+ [itm.store_state() for itm in self.items]
+
+ def __restore_state(self):
+ btns = [
+ self.__home_btn, self.__info_btn, self.__right_btn,
+ self.__next_btn, self.__prev_btn, self.__rewind_btn]
+ for btn, state in zip(btns, self.__btn_state):
+ btn['state'] = state
+ [itm.restore_state() for itm in self.items]
+ self._paused = False
+
+ def __on_close_instructions(self, frm):
+ frm.remove_node()
+ self.__restore_state()