def set_ranking(self): items = game.logic.season.logic.ranking.logic.ranking.items() sorted_ranking = reversed(sorted(items, key=lambda el: el[1])) txt = OnscreenText(text=_('Ranking'), scale=.1, pos=(0, .3), font=self.font, fg=self.text_bg) self.widgets += [txt] for i, car in enumerate(sorted_ranking): idx, name, _car, skills = next(driver for driver in self.props.drivers if driver[3] == car[0]) is_car = car[0] == self.props.car_path txt = OnscreenText(text=str(car[1]) + ' ' + name, align=TextNode.A_left, scale=.072, pos=(-.2, .1 - i * .16), font=self.font, fg=self.text_fg if is_car else self.text_bg) self.widgets += [txt] img = OnscreenImage(self.props.cars_path % car[0], pos=(-.36, 1, .12 - i * .16), scale=.074) self.widgets += [img] with open(eng.curr_path + 'yyagl/assets/shaders/filter.vert') as ffilter: vert = ffilter.read() with open(eng.curr_path + 'yyagl/assets/shaders/drv_car.frag') as ffilter: frag = ffilter.read() shader = Shader.make(Shader.SL_GLSL, vert, frag) img.setShader(shader) img.setTransparency(True) ts = TextureStage('ts') ts.setMode(TextureStage.MDecal) txt_path = self.props.drivers_path % idx img.setTexture(ts, loader.loadTexture(txt_path))
def set_grid(self): txt = OnscreenText(text=_('Starting grid'), scale=.1, pos=(-1.0, .3), font=self.font, fg=self.text_bg) self.widgets += [txt] for i, car in enumerate(self.props.grid): idx, name, _car, skills = next(driver for driver in self.props.drivers if driver[3] == car) is_car = car == self.props.car_path txt = OnscreenText(text=str(i + 1) + '. ' + name, align=TextNode.A_left, scale=.072, pos=(-1.28, .1 - i * .16), font=self.font, fg=self.text_fg if is_car else self.text_bg) self.widgets += [txt] img = OnscreenImage(self.props.cars_path % car, pos=(-1.42, 1, .12 - i * .16), scale=.074) self.widgets += [img] with open(eng.curr_path + 'yyagl/assets/shaders/filter.vert') as ffilter: vert = ffilter.read() with open(eng.curr_path + 'yyagl/assets/shaders/drv_car.frag') as f: frag = f.read() shader = Shader.make(Shader.SL_GLSL, vert, frag) img.setShader(shader) img.setTransparency(True) ts = TextureStage('ts') ts.setMode(TextureStage.MDecal) txt_path = self.props.drivers_path % idx img.setTexture(ts, loader.loadTexture(txt_path))
def show(self, race_ranking, lap_times, drivers, player_car_name): track = self.props.track_path self.result_frm = DirectFrame(frameColor=(.8, .8, .8, .64), frameSize=(-2, 2, -1, 1)) laps = len(lap_times) text_bg = self.props.menu_args.text_bg pars = {'scale': .1, 'fg': text_bg, 'font': self.props.menu_args.font} # ref into race self.__res_txts = [ OnscreenText(str(round(lap_times[i], 2)), pos=(0, .47 - .2 * (i + 1)), **pars) for i in range(laps) ] self.__res_txts += [OnscreenText(_('LAP'), pos=(-.6, .6), **pars)] self.__res_txts += [OnscreenText(_('TIME'), pos=(0, .6), **pars)] self.__res_txts += [ OnscreenText(_('RANKING'), pos=(.5, .6), align=TextNode.A_left, **pars) ] self.__res_txts += [ OnscreenText(str(i), pos=(-.6, .47 - .2 * i), **pars) for i in range(1, 4) ] race_ranking_sorted = sorted(race_ranking.items(), key=lambda x: x[1]) race_ranking_sorted = reversed([el[0] for el in race_ranking_sorted]) for i, car in enumerate(race_ranking_sorted): carinfo = next(drv for drv in drivers if drv[3] == car) idx, name, skills, _car = carinfo is_car = car == player_car_name fgc = self.props.menu_args.text_fg if is_car else text_bg txt = OnscreenText(text=str(i + 1) + '. ' + name, align=TextNode.A_left, scale=.072, pos=(.68, .44 - .16 * (i + 1)), font=self.props.menu_args.font, fg=fgc) img = OnscreenImage(self.props.cars_imgs % car, pos=(.58, 1, .47 - (i + 1) * .16), scale=.074) with open(eng.curr_path + 'yyagl/assets/shaders/filter.vert') as f: vert = f.read() with open(eng.curr_path + 'yyagl/assets/shaders/drv_car.frag') as f: frag = f.read() shader = Shader.make(Shader.SL_GLSL, vert, frag) img.setShader(shader) img.setTransparency(True) ts = TextureStage('ts') ts.setMode(TextureStage.MDecal) txt_path = self.props.drivers_imgs % idx img.setTexture(ts, loader.loadTexture(txt_path)) self.__res_txts += [txt, img] self.__res_txts += [ OnscreenText(_('share:'), pos=(-.1, -.82), align=TextNode.A_right, **pars) ] self.__buttons = [] curr_time = min(game.player_car.logic.lap_times or [0]) facebook_url = self.props.share_urls[0] #TODO: find a way to share the time on Facebook twitter_url = self.props.share_urls[1] twitter_url = twitter_url.format(time=round(curr_time, 2), track=track) plus_url = self.props.share_urls[2] #TODO: find a way to share the time on Google Plus tumblr_url = self.props.share_urls[3] #TODO: find a way to share the time on Tumblr sites = [('facebook', facebook_url), ('twitter', twitter_url), ('google_plus', plus_url), ('tumblr', tumblr_url)] self.__buttons += [ ImageButton(scale=.078, pos=(.02 + i * .18, 1, -.79), frameColor=(0, 0, 0, 0), image=self.props.share_imgs % site[0], command=eng.open_browser, extraArgs=[site[1]], rolloverSound=self.props.menu_args.rollover, clickSound=self.props.menu_args.click) for i, site in enumerate(sites) ] def step(): self.notify('on_race_step', race_ranking) self.destroy() Subject.destroy(self) cont_btn = DirectButton(text=_('Continue'), pos=(0, 1, -.6), command=step, **self.props.menu_args.btn_args) self.__buttons += [cont_btn]
class DriverPageGui(ThanksPageGui): def __init__(self, mdt, menu_args, driverpage_props): self.props = driverpage_props ThanksPageGui.__init__(self, mdt, menu_args) def bld_page(self): self.skills = [drv[2] for drv in self.props.drivers] menu_gui = self.mdt.menu.gui menu_args = self.mdt.menu.gui.menu_args widgets = [ OnscreenText(text=_('Select the driver'), pos=(0, .8), **menu_gui.menu_args.text_args) ] self.track_path = self.mdt.menu.track t_a = self.mdt.menu.gui.menu_args.text_args.copy() del t_a['scale'] name = OnscreenText(_('Write your name:'), pos=(-.1, .6), scale=.06, align=TextNode.A_right, **t_a) self.ent = DirectEntry(scale=.08, pos=(0, 1, .6), entryFont=menu_args.font, width=12, frameColor=menu_args.btn_color, initialText=self.props.player_name or _('your name')) self.ent.onscreenText['fg'] = menu_args.text_fg self.drivers = [] for row, col in product(range(2), range(4)): idx = (col + 1) + row * 4 widgets += [ ImgBtn(scale=.24, pos=(-.75 + col * .5, 1, .25 - row * .5), frameColor=(0, 0, 0, 0), image=self.props.drivers_img[0] % idx, command=self.on_click, extraArgs=[idx], **self.mdt.menu.gui.menu_args.imgbtn_args) ] self.drivers += [widgets[-1]] sign = lambda x: '\1green\1+\2' if x > 0 else '' psign = lambda x: '+' if x == 0 else sign(x) def ppcol(x): return '\1green\1%s\2' % x if x > 0 else '\1red\1%s\2' % x pcol = lambda x: x if x == 0 else ppcol(x) def add_lab(txt, pos_z): return OnscreenText(txt + ':', pos=(-.95 + col * .5, pos_z - row * .5), scale=.046, align=TextNode.A_left, **t_a) def add_txt(val, pos_z): return OnscreenText('%s%s%%' % (psign(val), pcol(val)), pos=(-.55 + col * .5, pos_z - row * .5), scale=.052, align=TextNode.A_right, **t_a) lab_lst = [(_('adherence'), .04), (_('speed'), .16), (_('stability'), .1)] widgets += map(lambda lab_def: add_lab(*lab_def), lab_lst) txt_lst = [(self.skills[idx - 1][1], .04), (self.skills[idx - 1][0], .16), (self.skills[idx - 1][2], .1)] widgets += map(lambda txt_def: add_txt(*txt_def), txt_lst) self.img = OnscreenImage(self.props.cars_img % self.mdt.car, parent=base.a2dBottomRight, pos=(-.38, 1, .38), scale=.32) widgets += [self.img, name, self.ent] map(self.add_widget, widgets) fpath = eng.curr_path + 'yyagl/assets/shaders/filter.vert' with open(fpath) as ffilter: vert = ffilter.read() shader = Shader.make(Shader.SL_GLSL, vert, frag) self.img.setShader(shader) self.img.setTransparency(True) self.t_s = TextureStage('ts') self.t_s.setMode(TextureStage.MDecal) empty_img = PNMImage(1, 1) empty_img.add_alpha() empty_img.alpha_fill(0) tex = Texture() tex.load(empty_img) self.img.setTexture(self.t_s, tex) ThanksPageGui.bld_page(self) self.update_tsk = taskMgr.add(self.update_text, 'update text') self.enable_buttons(False) def enable_buttons(self, enable): for drv in self.drivers: drv['state'] = NORMAL if enable else DISABLED drv.setShaderInput('enable', 1 if enable else .2) # do wdg.enable, wdg.disable def update_text(self, task): has_name = self.ent.get() != _('your name') if has_name and self.ent.get().startswith(_('your name')): self.ent.enterText(self.ent.get()[len(_('your name')):]) self.enable_buttons(True) elif self.ent.get() in [_('your name')[:-1], '']: self.ent.enterText('') self.enable_buttons(False) elif self.ent.get() not in [_('your name'), '']: self.enable_buttons(True) return task.cont # don't do a task, attach to modifications events def on_click(self, i): txt_path = self.props.drivers_img[1] self.img.setTexture(self.t_s, loader.loadTexture(txt_path % i)) self.widgets[-1]['state'] = DISABLED self.enable_buttons(False) taskMgr.remove(self.update_tsk) names = Utils().get_thanks(6) cars = self.props.cars[:] cars.remove(self.mdt.car) shuffle(cars) drv_idx = range(1, 9) drv_idx.remove(i) shuffle(drv_idx) drivers = [(i, self.ent.get(), self.skills[i - 1], self.mdt.car)] drivers += [(drv_idx[j], names[j], self.skills[j - 1], cars[j]) for j in range(6)] self.mdt.menu.gui.notify('on_driver_selected', self.ent.get(), drivers, self.mdt.track, self.mdt.car) def destroy(self): self.img = None taskMgr.remove(self.update_tsk) PageGui.destroy(self)