self._reload_cb = reload_cb
self._set_camera()
self._cursor = MouseCursor(
- 'assets/buttons/arrowUpLeft.png', (.04, 1, .04), (.5, .5, .5, 1),
+ 'assets/images/buttons/arrowUpLeft.dds', (.04, 1, .04), (.5, .5, .5, 1),
(.01, .01))
self._set_gui()
self._set_lights()
self._set_mouse_plane()
self.items = []
self.reset()
+ self._state = 'init'
self._paused = False
self._item_active = None
if auto_close_instr:
base.graphicsEngine.renderFrame()
base.graphicsEngine.renderFrame()
fname = self.__class__.__name__
+ if not exists('assets/images/scenes'):
+ makedirs('assets/images/scenes')
buffer.save_screenshot('assets/images/scenes/%s.png' % fname)
# img = DirectButton(
# frameTexture=buffer.get_texture(), relief=FLAT,
def reset(self):
[itm.destroy() for itm in self.items]
self._set_items()
+ self._state = 'init'
self._commands = []
self._command_idx = 0
if hasattr(self, '_success_txt'):
base.camera.look_at(0, 0, 0)
def __load_img_btn(self, path, col):
- img = OnscreenImage('assets/buttons/%s.png' % path)
+ img = OnscreenImage('assets/images/buttons/%s.dds' % path)
img.set_transparency(True)
img.set_color(col)
img.detach_node()
getattr(item, method)(pos)
img = 'move' if method == 'on_click_l' else 'rotate'
if not (img == 'rotate' and not item._instantiated):
- self._cursor.set_image('assets/buttons/%s.png' % img)
+ self._cursor.set_image('assets/images/buttons/%s.dds' % img)
def on_click_l(self):
self._on_click('on_click_l')
self.__next_btn['frameColor'] = fcols[1]
self._item_active = None
[item.on_release() for item in self.items]
- self._cursor.set_image('assets/buttons/arrowUpLeft.png')
+ self._cursor.set_image('assets/images/buttons/arrowUpLeft.dds')
def repos(self):
for item in self.items:
def on_aspect_ratio_changed(self):
self.repos()
+ def _win_condition(self):
+ pass
+
+ def _fail_condition(self):
+ return all(itm.fail_condition() for itm in self.items) and not self._paused and self._state == 'playing'
+
def on_frame(self, task):
hits = self._get_hits()
pos = None
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 self._paused:
- self._set_end()
+ if self._win_condition():
+ self._set_win()
+ elif self._state == 'playing' and self._fail_condition():
+ self._set_fail()
+ if any(itm._overlapping for itm in self.items):
+ self._cursor.cursor_img.img.set_color(.9, .1, .1, 1)
+ else:
+ self._cursor.cursor_img.img.set_color(.9, .9, .9, 1)
return task.cont
def cb_inst(self, item):
self.items += [item]
def on_play(self):
+ self._state = 'playing'
self.__prev_btn['state'] = DISABLED
self.__next_btn['state'] = DISABLED
self.__right_btn['state'] = DISABLED
self.__store_state()
mgr = TextPropertiesManager.get_global_ptr()
for name in ['mouse_l', 'mouse_r']:
- graphic = OnscreenImage('assets/buttons/%s.png' % name)
+ graphic = OnscreenImage('assets/images/buttons/%s.dds' % name)
graphic.set_scale(.5)
graphic.get_texture().set_minfilter(Texture.FTLinearMipmapLinear)
graphic.get_texture().set_anisotropic_degree(2)
clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
btn.set_transparency(True)
- def _set_end(self):
+ def _set_win(self):
loader.load_sfx('assets/audio/sfx/success.ogg').play()
self._paused = True
self.__store_state()
btn['state'] = NORMAL if enabled else DISABLED
btn.set_transparency(True)
+ def _set_fail(self):
+ loader.load_sfx('assets/audio/sfx/success.ogg').play()
+ self._paused = True
+ self.__store_state()
+ frm = DirectFrame(frameColor=(.4, .4, .4, .06),
+ frameSize=(-.6, .6, -.3, .3))
+ 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._txt = OnscreenText(
+ _('You have failed!'),
+ parent=frm,
+ font=font, scale=0.2,
+ fg=(.9, .9, .9, 1))
+ 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'] = 0, z
+ u_l = self._txt.textNode.get_upper_left_3d()
+ l_r = self._txt.textNode.get_lower_right_3d()
+ 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('home', col) for col in colors]
+ btn = DirectButton(
+ image=imgs, scale=btn_scale,
+ pos=(-2.8 * btn_scale, 1, l_r[2] - mar - btn_scale),
+ parent=frm, command=self._on_end_home, 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)
+ imgs = [self.__load_img_btn('rewind', col) for col in colors]
+ btn = DirectButton(
+ image=imgs, scale=btn_scale,
+ pos=(0, 1, l_r[2] - mar - btn_scale),
+ parent=frm, command=self._on_restart, 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 _on_restart(self, frm):
self.__on_close_instructions(frm)
self.reset()