class ScreenDecorationManager: def __init__(self): self.tex_judgements = {} for i in ["PERFECT","GOOD","OK","BAD","MISS"]: self.tex_judgements[i] = loader.loadTexture("image/j_%s.png" % i.lower()) ## Judgement message self.image_judgement = OnscreenImage(image=self.tex_judgements["OK"],pos=(0, 0, 0), scale=(256.0/base.win.getXSize(),1,32.0/base.win.getYSize()), parent=render2d) self.image_judgement.setTransparency(TransparencyAttrib.MAlpha) #self.image_judgement.setPos(-0.7, 1, 0.6) self.image_judgement.setAlphaScale(0) interval_pos = LerpPosInterval(self.image_judgement, duration=0.1, startPos=VBase3(-1.2, 1, 0.5), pos=VBase3(-0.7, 1, 0.5), blendType='easeOut') interval_alpha = LerpFunc(self.image_judgement.setAlphaScale, duration=0.1, blendType='easeOut') interval_fade = LerpFunc(self.image_judgement.setAlphaScale, fromData=1, toData=0, duration=1.0, blendType='easeOut') self.judgement_enters = Sequence(Parallel(interval_pos, interval_alpha), Wait(1.0), interval_fade) ## Chain message text_node = TextNode('chain_msg') text_node.setAlign(TextNode.ACenter) text_node.setFont(babelfish_font) text_node.setTextColor(1, 1, 0.16, .9) text_node.setShadow(0.05, 0.05) text_node.setShadowColor(0.05, 0, 0.43, .9) self.chain_msg = aspect2d.attachNewNode(text_node) self.chain_msg.setPos(-.9, 1, 0.35) self.chain_msg.setScale(0.11) def judgement_msg(self, msg, chain): if self.judgement_enters.isPlaying(): self.judgement_enters.clearToInitial() self.image_judgement.setTexture(self.tex_judgements[msg]) self.judgement_enters.start() if chain > 1: self.chain_msg.node().setText("%d CHAIN" % chain) taskMgr.add(self.task_ClearJudgementTask, "clear-judgement") def task_ClearJudgementTask(self, task): if task.time < 1.5: return Task.cont self.chain_msg.node().clearText() def __del__(self): self.judgement_enters.finish() self.image_judgement.destroy() self.chain_msg.removeNode()
class Minimap(object): def __init__(self, lrtb, track_img, handle_img, col_dct, cars, player_car): self.lrtb = lrtb self.minimap = OnscreenImage(track_img, pos=(-.25, 1, .25), scale=.2, parent=eng.base.a2dBottomRight) self.minimap.setTransparency(True) self.minimap.setAlphaScale(.64) self.car_handles = {} cars = cars[:] cars.remove(player_car) cars += [player_car] for car_name in cars: scale = .015 if car_name == player_car else .01 self.car_handles[car_name] = OnscreenImage( handle_img, pos=(-.25, 1, .25), scale=scale, parent=eng.base.a2dBottomRight) col = col_dct[car_name] self.car_handles[car_name].set_color_scale(col) map(lambda car: car.setTransparency(True), self.car_handles.values()) self.width = self.minimap.getScale()[0] * 2.0 self.height = self.minimap.getScale()[2] * 2.0 center_x, center_y = self.minimap.getX(), self.minimap.getZ() self.left_img = center_x - self.width / 2.0 self.bottom_img = center_y - self.height / 2.0 def update(self, car_info): left, right, top, bottom = self.lrtb for car_i in car_info: car_name, car_pos = car_i pos_x_norm = (car_pos.getX() - left) / (right - left) pos_y_norm = (car_pos.getY() - bottom) / (top - bottom) pos_x = self.left_img + pos_x_norm * self.width pos_y = self.bottom_img + pos_y_norm * self.height self.car_handles[car_name].set_pos(pos_x, 1, pos_y) def destroy(self): des = lambda wdg: wdg.destroy() map(des, [self.minimap] + self.car_handles.values())
class IntroScene(Scene): ''' A subclass of the Scene class to handle the main menu and all of it's required tasks + events ''' def __init__(self, app): ''' Initialise and run any events BEFORE loading the scene ''' self.app = app self.isPlayerControlled = False self.models = {} self.loader = app.loader self.renderTree = deepcopy(app.emptyRenderTree) # Add the ground model self.addObject("ground.bam", scale=(3.6,3.6,2), key="ground") # Add the barn barnModel = self.addObject("barn.bam", scale=(1, 1, 1)) # Create a corn model and add it in the bottom corner self.addObject("corn.egg", pos=(-62, -62, 0), scale=(1, 1, 1.3), key="corn") # Iterate a 25x25 square for the corn for x in range(25): for z in range(25): # Use basic maths to create a 'lollypop' shape cutout if (x-12)**2+(z-12)**2 > 25 and (abs(x-12) > 1 or z > 12): # Add a corn instance to the scene self.addObject("corn.egg", (x*5, z*5, 0), instanceTo="corn") # Add the AI World self.AIworld = AIWorld(self.renderTree) # Add generic linear fog on super-low quality mode if app.quality == 'super-low': fog = Fog("corn_fog") # Set the fog colour fog.setColor(0.8,0.8, 0.8) # Set the density of the fog fog.setExpDensity(0.005) # Add the fog to the scene self.renderTree.setFog(fog) # Set the scene's background colour base.setBackgroundColor(0.635, 0.454, 0.494) # Create an empty ambient light alight = AmbientLight('alight') # Set the colour alight.setColor(VBase4(0.2, 0.2, 0.2, 0.2)) # Attach the node to the render tree alnp = render.attachNewNode(alight) # Set the light to illuminate the scene render.setLight(alnp) # Add the two chickens and set the maximum velocity (force) on them self.chickenOne = Chicken(self, (20, -50, 0)) self.chickenOne.aiChar.setMaxForce(70) self.chickenTwo = Chicken(self, (-20, -40, 0)) self.chickenTwo.aiChar.setMaxForce(70) # Add them to the AI World self.AIworld.addAiChar(self.chickenOne.aiChar) self.AIworld.addAiChar(self.chickenTwo.aiChar) # Enable the pursue behaviour self.chickenOne.aiBehaviour.pursue(self.app.camera) self.chickenTwo.aiBehaviour.pursue(self.app.camera) def eventRun(self, task): ''' Run any constant events for the scene ''' # If the movement controller has finished its path then if self.app.controller and self.app.controller.clock_obj.get_frame_time() > self.app.controller.curve_time_end: # delete the motion controller self.app.controller = None # Load the first scene of the gameplay self.app.sceneMgr.loadScene(SceneOne(self.app)) # Update the AI world self.AIworld.update() return Task.cont def initScene(self): ''' Set up the movement controller and begin the motion path. ''' # Make the motion path motionPath = ( (Vec3(0, -63, 4), Vec3(0, 0, 0)), (Vec3(0, -63, 4), Vec3(0, 0, 0)), (Vec3(0, -63, 4), Vec3(0, 0, 0)), (Vec3(0, -56, 4), Vec3(-90, -10, 0)), (Vec3(0, -52, 4), Vec3(0, -70, 0)), (Vec3(0, -46, 4), Vec3(90, 0, 20)), (Vec3(0, -40, 4), Vec3(0, 0, 0)), (Vec3(0, -30, 4), Vec3(0, 0, 0)), (Vec3(0, -20, 4), Vec3(0, 0, 0)), (Vec3(5, -10, 4), Vec3(-40, 0, -5)), (Vec3(5, -9, 4), Vec3(-190, 0, 0)), (Vec3(5, -4, 4), Vec3(-190, 0, -5)), (Vec3(4, 0, 0.5), Vec3(-190, 80, 0)) ) # Create the controller for movement self.app.controller = MovementController(self.app) # Set the initial position self.app.controller.set_initial_position(Vec3(0, -63, 4), Vec3(0, 0, 0)) # Run the setup on the movement controller self.app.controller.update_task = self.app.addTask(nullTask, 'meh') # Play the pre-defined motion path self.app.controller.play_motion_path(motionPath, 0.8) # Remove the player movement controls self.app.taskMgr.remove(self.app.controller.update_task) # Unhide the 2d overlay. self.app.aspect2d.show() self.app.render2d.show() # set up the black image self.fadeQuad = OnscreenImage(image='resources/generic/fade.png',pos=(-0.5, 0, 0), scale=(2, 1, 1)) self.fadeQuad.setTransparency(TransparencyAttrib.MAlpha) # Add the fadein transition self.app.taskMgr.add(self.fadeIn, 'fade-task') def fadeIn(self, task): ''' Fade in the scene by fading a black rectangle ''' # If more than 4 seconds have passed then finish the task if task.time > 4: self.fadeQuad.destroy() return # Get the alpha of the square alpha = task.time / 4 # set the alpha level on the rectangle self.fadeQuad.setAlphaScale(1-alpha) return Task.cont
class RightMenu: """ Add comment. """ def __init__(self): self.visible_x_np = None self.visible_y_np = None self.visible_z_np = None self.filter_label_np = None self.dims_parent_np = None # Dictionary for the tagset/dims self.dimensionCards = {} # Member variable for dimension/filter context menu. self.selected_tagset_id = None self.selected_hierarchy_id = None self.selected_filter_id = None # Create nodepath for the menu. self.right_menu_node_path = camera.attachNewNode( 'right_menu_node_path') self.right_menu_node_path.setY(3) # Flag for right menu visability. self.is_visable = True # Create background for the menu. self.bg = OnscreenImage(image='static/images/box.tif') self.bg.setTransparency(TransparencyAttrib.MAlpha) self.bg.setAlphaScale(0.24) self.bg.setScale(1, 2, 2) # start the placement task for menu placement. base.taskMgr.add(self.__placement, 'menuplacement_left_panel') # Collections of cards. Used for card highlighting. self.cards = dict() # How many dimensions should we show in the dimension list? self.max_dimension_visable_in_menu = 10 # Member variable for the dimensions scrollbar if needed. self.dimension_scrollbar = None # Create all the objects for this menu. self.__initalize_objects() self.__createTagsetAndHierarchyLabels() self.__register_view_menu_messages() # Create instance of filter menu. self.filter_menu = FilterMenu(np=self.right_menu_node_path, begin_pos=self.last_dim_pos) # Events that we are interested in. base.accept(CUBE_MENU_RELOAD_FILTERS, self.reload_filter2) base.accept(TAGSET_BTN_CLICK, self.btn_dimensions) base.accept(HIERARCHY_BTN_CLICK, self.btn_hierarchy) base.accept(SEARCH_BTN_CLICK, self.btn_search) base.accept(FILTER_BTN_CLICK, self.btn_filters) base.accept(CUBE_MENU_OVERVIEW_X_BUTTON_CLICK, self.btn_x_view) base.accept(CUBE_MENU_OVERVIEW_Y_BUTTON_CLICK, self.btn_y_view) base.accept(CUBE_MENU_OVERVIEW_Z_BUTTON_CLICK, self.btn_z_view) base.accept(CUBE_MENU_RELOAD_DIMENSIONS, self.reloadDimensionLabels) def reloadDimensionLabels(self): """ Function for reloading the tagset/hir list. This function is called when tagset/hir is changed or new are added. """ self.__createTagsetAndHierarchyLabels() #self.reload() def __createTagsetAndHierarchyLabels(self): if self.dims_parent_np is not None: self.dims_parent_np.remove() if self.dimension_scrollbar is not None: self.dimension_scrollbar.remove() # Create labels for each tagset and hirs. card_pos = -1.1 index = 0 # List that contains the dimension cards. Used for scrolling the cards. self.dimension_list = [] #self.cards = dict() self.dims_parent_np = self.right_menu_node_path.attachNewNode( 'parent_dim_np') for tagset in photocube.objectcube.objectCubeService.getAllTagsets(): if (tagset.typeId == 1 or tagset.typeId == 5) and ( tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:' ): #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION #print 'tagset.name: ' + tagset.name + 'tagset.typeId: ' + str(tagset.typeId) dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' + str(tagset.id)) # Create a card to make the dimension clickable card_np = dim_np.attachNewNode('card-tagset-' + tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the tagset cards clickable. base.accept( photocube.devices.mouse_handler.makeNPPickableRight( dim_np), self.on_tagset_right_click) base.accept( photocube.devices.mouse_handler.makeNPPickableLeft(dim_np), self.on_tagset_right_click) # Create a new node for the text label. t_node = card.attachNewNode('card-label' + tagset.name) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=tagset.name[0:43] + ' (tagset)', fg=(1, 1, 1, 1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if dim_np.__str__() not in self.cards.keys(): self.cards[dim_np.__str__()] = card self.dimension_list.append(dim_np) messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( dim_np) # When created, the menu is hided. dim_np.hide() # Accept the hover messages. base.accept(messageLeave, self.mouse_leave) base.accept(messageHover, self.mouse_over) """ dim_np = self.dims_parent_np.attachNewNode('dim;tagset;' + str(tagset.id)) # Create a card to make the dimension clickable card_np = dim_np.attachNewNode('card-tagset-'+ tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1,1.5,1.5) cm = CardMaker('card') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0,0,0) # Make the tagset cards clickable. base.accept(photocube.devices.mouse_handler.makeNPPickableRight(dim_np), self.on_tagset_right_click) base.accept(photocube.devices.mouse_handler.makeNPPickableLeft(dim_np), self.on_tagset_right_click) # Create a new node for the text label. t_node = card.attachNewNode( 'card-label' + tagset.name ) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=tagset.name[0:43] + ' (tagset)', fg=(1,1,1,1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if dim_np.__str__() not in self.cards.keys(): self.cards[ dim_np.__str__() ] = card self.dimension_list.append( dim_np ) messageHover,messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( dim_np ) # When created, the menu is hided. dim_np.hide() # Accept the hover messages. base.accept(messageLeave, self.mouse_leave) base.accept(messageHover, self.mouse_over) """ # show the hir if tagset.name[:5] != 'Rank:' and tagset.name[:5] != 'Dist:': #FOR MASTER PRESENTATION, NOT SHOWING SEARCH DIMENSION for hir in tagset.getPersistentDimensions(): hir_np = self.dims_parent_np.attachNewNode('dim;hir;' + tagset.name + ';' + str(hir.id) + ';' + str(tagset.id)) # Create a card to make the dimension clickable card_np = hir_np.attachNewNode('card-tagset-' + tagset.name) card_np = card_np.attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-hir') card = card_np.attachNewNode(cm.generate()) card.setScale(0.50, 1, 0.050) card.setPos(-2.045, -1.3, card_pos) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the hierachy card clickable. base.accept( photocube.devices.mouse_handler.makeNPPickableRight( hir_np), self.on_hierarchy_right_click) base.accept( photocube.devices.mouse_handler.makeNPPickableLeft( hir_np), self.on_hierarchy_right_click) # Make the hierachy card hoverable. messageHover, messageLeave = photocube.devices.mouse_handler.makeNPMouseHoverable( hir_np) base.accept(messageHover, self.mouse_over) base.accept(messageLeave, self.mouse_leave) # Create a new node for the text label. t_node = card.attachNewNode('card-label' + tagset.name) t_node.setY(-0.001) t_node.setZ(1.35) t_node.setX(0.03) t = OnscreenText(text=hir.getRoot().name + ' (hierarchy)', fg=(1, 1, 1, 1), parent=t_node, pos=(0, -1, -4), scale=(0.075, 0.73), align=TextNode.ALeft) # Make the dim button mouse over enabled. if hir_np.__str__() not in self.cards.keys(): self.cards[hir_np.__str__()] = card self.dimension_list.append(hir_np) photocube.devices.mouse_handler.makeNPMouseHoverable( hir_np) # Create label for filters if len(self.dimension_list) < self.max_dimension_visable_in_menu: self.last_dim_pos = -0.025 * len(self.dimension_list) else: self.last_dim_pos = -0.25 self.dimension_scrollbar = DirectScrollBar( range=(0, math.ceil(len(self.dimension_list))), orientation=DGG.VERTICAL, command=self.on_dimension_scroll_change, scrollSize=5, pageSize=len(self.dimension_list) / 5, value=0) self.dimension_scrollbar.setScale(0.5, 1, 0.69) self.dimension_scrollbar['frameColor'] = (0.6, 0.6, 0.6, 0.8) # disable the click sound for the scrollbar. self.dimension_scrollbar[ 'incButton_clickSound'] = button_mouseclick_sound self.dimension_scrollbar['incButton_rolloverSound'] = None self.dimension_scrollbar[ 'decButton_clickSound'] = button_mouseclick_sound self.dimension_scrollbar['decButton_rolloverSound'] = None self.dimension_scrollbar['thumb_clickSound'] = None self.dimension_scrollbar['thumb_rolloverSound'] = None self.dimension_scrollbar['incButton_relief'] = None self.dimension_scrollbar['decButton_relief'] = None self.dimension_scrollbar['decButton_text'] = '-' self.dimension_scrollbar['decButton_text_scale'] = 0.07 self.dimension_scrollbar['incButton_text'] = '+' self.dimension_scrollbar['incButton_text_scale'] = (0.07, 0.05) self.dimension_scrollbar['incButton_text_pos'] = (-0.005, -0.02) self.dimension_scrollbar['decButton_text_pos'] = (-0.005, -0.02) self.dimension_scrollbar['thumb_frameColor'] = (0, 0, 0, 0.2) self.dimenion_scroll_value = self.dimension_scrollbar['value'] self.text_dims = OnscreenText(mayChange=True, text='Filters:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, self.last_dim_pos, -10), scale=(0.040), align=TextNode.ALeft) # create nodepath for the filter labels self.filter_label_np = self.right_menu_node_path.attachNewNode( 'filter-label-np') self.current_dimension_index_left = 0 self.current_dimension_index_right = self.max_dimension_visable_in_menu - 1 self.show_dimension_tabs() def __initalize_objects(self): # refactored from the function for dims labels reload self.text_dims = OnscreenText(text='Dimensions:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, 0.45, -10), scale=0.040, align=TextNode.ALeft) # Create a label for the menu. self.text_dims = OnscreenText(mayChange=True, text='Visible:', fg=(1, 1, 1, 1), parent=self.right_menu_node_path, pos=(-1.10, 0.74, -10), scale=(0.040), align=TextNode.ALeft) self.visible_x_np = self.right_menu_node_path.attachNewNode( 'np_visiable_x') self.visible_x_np.setPos(-0.50, 0, 0.85) self.visible_x_np.setScale(0.6) self.text_x = OnscreenText(mayChange=True, text=EMPTY_ON_FRONT, fg=(1, 1, 1, 1), parent=self.visible_x_np, align=TextNode.ALeft, pos=(-0.95, -0.29, -0.21), scale=0.075) # Create clicable card for x. card_np = self.visible_x_np.attachNewNode( 'card-x-label-np').attachNewNode('card-x-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-x') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) # Make the x view nodepath clickable. self.curXDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_x_np) self.curXDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_x_np) # Make the x view nodepath mouseoverable and save the nodepath for making it glow. self.cards[self.visible_x_np.__str__()] = card leavemessage, hoverMessage = photocube.devices.mouse_handler.makeNPMouseHoverable( self.visible_x_np) base.accept(hoverMessage, self.mouse_leave) base.accept(leavemessage, self.mouse_over) # Create notepath for y self.visible_y_np = self.right_menu_node_path.attachNewNode( 'np_visiable_y') self.visible_y_np.setPos(-0.50, 0, 0.78) self.visible_y_np.setScale(0.6) self.text_y = OnscreenText(mayChange=True, text=EMPTY_ON_IN, fg=(1, 1, 1, 1), parent=self.visible_y_np, align=TextNode.ALeft, pos=(-0.95, -0.29, 0.21), scale=0.075) # Create clicable card for y. card_np = self.visible_y_np.attachNewNode( 'card-y-label-np').attachNewNode('card-y-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-y') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) card.setTransparency(TransparencyAttrib.MAlpha) self.curYDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_y_np) self.curYDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_y_np) # Make the y view nodepath mouseoverable. self.cards[self.visible_y_np.__str__()] = card #TODO: Here is a good place to refactor. photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_y_np) base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_y', self.mouse_leave) base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_y', self.mouse_over) # Create notepath for z self.visible_z_np = self.right_menu_node_path.attachNewNode( 'np_visiable_z') self.visible_z_np.setPos(-0.50, 0, 0.71) self.visible_z_np.setScale(0.6) self.text_z = OnscreenText(mayChange=True, text=EMPTY_ON_UP, fg=(1, 1, 1, 1), parent=self.visible_z_np, align=TextNode.ALeft, pos=(-0.95, -0.28, 0.21), scale=0.075) # Create clicable card for y. card_np = self.visible_z_np.attachNewNode( 'card-z-label-np').attachNewNode('card-z-label-np') card_np.setPos(1, 1.5, 1.5) cm = CardMaker('card-z') card = card_np.attachNewNode(cm.generate()) card.setScale(0.8, 1, 0.1) card.setPos(-1.93, -1.3, -1.78) card.setTwoSided(True) card.setColor(0, 0, 0) card.setTransparency(TransparencyAttrib.MAlpha) self.curZDimRightClickMessage = mouse_handler.makeNPPickableRight( self.visible_z_np) self.curZDimLeftClickMessage = mouse_handler.makeNPPickableLeft( self.visible_z_np) # Make the z view nodepath mouseoverable. self.cards[self.visible_z_np.__str__()] = card photocube.devices.mouse_handler.makeNPMouseHoverable(self.visible_z_np) base.accept('zoomout_render/camera/right_menu_node_path/np_visiable_z', self.mouse_leave) base.accept('zoomin_render/camera/right_menu_node_path/np_visiable_z', self.mouse_over) def on_dimension_scroll_change(self): val = int(self.dimension_scrollbar['value']) #print 'val', val if val == self.dimenion_scroll_value: return elif val < self.dimenion_scroll_value: for n in range(self.dimenion_scroll_value - val): self.dim_menu_move_up() else: for n in range(val - self.dimenion_scroll_value): self.dim_menu_move_down() #self.dimenion_scroll_value = self.dimension_scrollbar['value'] self.dimenion_scroll_value = val def show_dimension_tabs(self): card_pos = 0 i = 0 for card in self.dimension_list: card.hide() card.setX(100) for r in range(self.current_dimension_index_left, len(self.dimension_list)): self.dimension_list[r].show() self.dimension_list[r].setZ(card_pos) self.dimension_list[r].setX(0) card_pos -= 0.06 i += 1 if i is self.max_dimension_visable_in_menu: break def dim_menu_move_down(self): r = len(self.dimension_list) - self.current_dimension_index_right if r > 1: self.current_dimension_index_left += 1 self.current_dimension_index_right += 1 self.show_dimension_tabs() def dim_menu_move_up(self): if self.current_dimension_index_left > 0: self.current_dimension_index_left -= 1 self.current_dimension_index_right -= 1 self.show_dimension_tabs() def btn_filters(self, index): self.filter_menu.btn_filters(index) def mouse_over(self, p): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): #print 'here', p c = self.cards[p.__str__()] #print c self.current_glowing_card = c c.setColor(0.15, 0.15, 0.15) def mouse_leave(self, p): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): c = self.cards[p.__str__()] c.setColor(0, 0, 0) self.current_glowing_card = None def clear_glow(self, f=None): if not photocube.ui.coremenu.context_menu_handler.has_open_context(): #print 'clear' self.clear_all_glowings() def clear_all_glowings(self): for key in self.cards.keys(): card = self.cards[key] card.setColor(0, 0, 0) self.current_glowing_card = None def btn_x_view(self, index): self.clear_glow() if index == 'view up': x = photocube.cube.cubeService.coordinate.get_x() if x is not None: messenger.send('dim_move_to_axis', [X_AXIS, Z_AXIS]) action = ActionAxis(ACTION_MOVE, X_AXIS, Z_AXIS) actionManager.addAction(action) if index == 'view in': x = photocube.cube.cubeService.coordinate.get_x() if x is not None: messenger.send('dim_move_to_axis', [X_AXIS, Y_AXIS]) action = ActionAxis(ACTION_MOVE, X_AXIS, Y_AXIS) actionManager.addAction(action) if index == "swap with up": messenger.send('x_dim_action_swap', [Z_AXIS]) # create action for the swap. action = ActionAxis(ACTION_SWAP, X_AXIS, Z_AXIS) actionManager.addAction(action) if index == "swap with in": messenger.send('x_dim_action_swap', [Y_AXIS]) # create action for the swap. action = ActionAxis(ACTION_SWAP, X_AXIS, Y_AXIS) actionManager.addAction(action) if index is 'clear': messenger.send('dim_action_clear', [X_AXIS]) action = ActionAxis(ACTION_CLEAR, X_AXIS) actionManager.addAction(action) def btn_y_view(self, index): """ This function is called when we select buttons in the view y context menu. """ self.clear_glow() if index == 'clear': messenger.send('dim_action_clear', [Y_AXIS]) action = ActionAxis(ACTION_CLEAR, Y_AXIS) actionManager.addAction(action) if index == 'view front': y = photocube.cube.cubeService.coordinate.get_y() if y is not None: messenger.send('dim_move_to_axis', [Y_AXIS, X_AXIS]) action = ActionAxis(ACTION_MOVE, Y_AXIS, X_AXIS) actionManager.addAction(action) if index == 'view up': y = photocube.cube.cubeService.coordinate.get_y() if y is not None: messenger.send('dim_move_to_axis', [Y_AXIS, Z_AXIS]) action = ActionAxis(ACTION_MOVE, Y_AXIS, Z_AXIS) actionManager.addAction(action) if index == "swap with front": messenger.send('y_dim_action_swap', [X_AXIS]) action = ActionAxis(ACTION_SWAP, Y_AXIS, X_AXIS) actionManager.addAction(action) if index == "swap with up": messenger.send('y_dim_action_swap', [Z_AXIS]) action = ActionAxis(ACTION_SWAP, Y_AXIS, Z_AXIS) actionManager.addAction(action) def btn_z_view(self, index): self.clear_glow() if index == 'clear': messenger.send('dim_action_clear', [Z_AXIS]) action = ActionAxis(ACTION_CLEAR, Z_AXIS) actionManager.addAction(action) if index == 'view front': z = photocube.cube.cubeService.coordinate.get_z() if z is not None: messenger.send('dim_move_to_axis', [Z_AXIS, X_AXIS]) action = ActionAxis(ACTION_MOVE, Z_AXIS, X_AXIS) actionManager.addAction(action) if index == 'view in': z = photocube.cube.cubeService.coordinate.get_z() if z is not None: messenger.send('dim_move_to_axis', [Z_AXIS, Y_AXIS]) action = ActionAxis(ACTION_MOVE, Z_AXIS, Y_AXIS) actionManager.addAction(action) if index == "swap with front": messenger.send('z_dim_action_swap', [X_AXIS]) action = ActionAxis(ACTION_SWAP, Z_AXIS, X_AXIS) actionManager.addAction(action) if index == "swap with in": messenger.send('z_dim_action_swap', [Y_AXIS]) action = ActionAxis(ACTION_SWAP, Z_AXIS, Y_AXIS) actionManager.addAction(action) def btn_dimensions(self, index): self.clear_glow() tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) if index == 'view front': action = ActionTagset(ACTION_SET, tagset.id, X_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [X_AXIS, tagset]) if index == 'view in': action = ActionTagset(ACTION_SET, tagset.id, Y_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [Y_AXIS, tagset]) if index == 'view up': action = ActionTagset(ACTION_SET, tagset.id, Z_AXIS) actionManager.addAction(action) messenger.send('dim_view_tagset', [Z_AXIS, tagset]) if index == 'add dimension filter': dim_filter = ObjectCubePython.DimensionFilter( tagset.getDefaultDimension().getRoot(), tagset.id) filterManager.add_filter(dim_filter, True) # add action action = ActionFilter(ACTION_DIMENSIONFILTER, ACTION_ADD, tagsetId=tagset.id) actionManager.addAction(action) # reload filters menu. self.reload_filter2() if index == 'add tag filter': photocube.dialogs.dialogService.open_add_tagfilter(tagset) if index == 'add range filter': if tagset.typeId == 3: photocube.dialogs.dialogService.open_add_date_range(tagset) elif tagset.typeId == 4: photocube.dialogs.dialogService.open_add_time_range(tagset) else: photocube.dialogs.dialogService.open_add_numerical_range( tagset) if index == 'edit': photocube.dialogs.dialogService.openCreateNewTagsetDialog(tagset) def btn_hierarchy(self, index): # Get the tagset that the hir belongs to. tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) print 'selected_hierarchy_id: ' + str(self.selected_hierarchy_id) # Get the hirarchy from the tagset. dim = tagset.getDimension(int(self.selected_hierarchy_id)) print 'Dimension click' if index == 'view front': print 'DimId: ' + str(dim.id) print 'TagSetId: ' + str(tagset.id) print index + ': Begin' print 'ACTION_SET' print ACTION_SET print 'X_AXIS' print X_AXIS action = ActionHierachy(ACTION_SET, tagset.id, dim.id, X_AXIS) actionManager.addAction(action) print 'action' print action messenger.send('dim_view_hierarchy', [X_AXIS, dim]) print index + ': End' elif index == 'view in': action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Y_AXIS) actionManager.addAction(action) messenger.send('dim_view_hierarchy', [Y_AXIS, dim]) elif index == 'view up': action = ActionHierachy(ACTION_SET, tagset.id, dim.id, Z_AXIS) actionManager.addAction(action) messenger.send('dim_view_hierarchy', [Z_AXIS, dim]) elif index == 'add dimension filter': dim_filter = ObjectCubePython.DimensionFilter( dim.getRoot(), tagset.id) filterManager.add_filter(dim_filter, True) # add action action = ActionFilter(ACTION_DIMENSIONFILTER, ACTION_ADD, tagsetId=tagset.id, hirarchyId=int(self.selected_hierarchy_id)) actionManager.addAction(action) self.reload_filter2() else: raise Exception('btn_hierarchy: unknown index: ' + index) def btn_search(self, index): tagset = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id) if index == 'search': print 'Vuubidu' photocube.dialogs.dialogService.openSearchDialogWithTagSet(tagset) def reload_filter2(self): self.filter_menu.reload() def on_x_view_right_click(self, f): photocube.ui.coremenu.context_menu_handler.open_x_view_context() def open_context_view_y(self, f): photocube.ui.coremenu.context_menu_handler.open_y_view_context() def open_context_view_z(self, f): photocube.ui.coremenu.context_menu_handler.open_z_view_context() def on_hierarchy_right_click(self, f): split_list = f.__str__().split(';') self.selected_hierarchy_id = int(split_list[3]) self.selected_tagset_id = int(split_list[4]) photocube.ui.coremenu.context_menu_handler.open_context_hierarchy() def on_tagset_right_click(self, f): """ Function for opening dimension context. """ split_list = f.__str__().split(';') self.selected_tagset_id = int(split_list[len(split_list) - 1]) t_id = photocube.objectcube.objectCubeService.get_tagset_by_id( self.selected_tagset_id).typeId print 't_id' + str(t_id) if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL: print 'ALPHANUMERICAL' photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_alphanumerical( ) elif t_id == photocube.objectcube.framework.TagSet.TYPE.RGB: print 'RGB' photocube.ui.coremenu.context_menu_handler.open_context_tagset_search_rgb( ) ''' if t_id == photocube.objectcube.framework.TagSet.TYPE.ALPHANUMERICAL: photocube.ui.coremenu.context_menu_handler.open_context_tagset_alphanumerical() else: photocube.ui.coremenu.context_menu_handler.open_context_tagset_numerical() ''' def hide(self): #self.right_menu_node_path.hide() if self.dimension_scrollbar is not None: self.dimension_scrollbar.hide() self.filter_menu.hide() # hide the background image self.bg.hide() self.is_visable = False def show(self): #self.right_menu_node_path.show() if self.dimension_scrollbar is not None: self.dimension_scrollbar.show() #self.filter_menu.show() # hide the background image #self.bg.show() self.is_visable = True def setXViewText(self, text): self.text_x.setText('front: ' + text) def setYViewText(self, text): self.text_y.setText('in: ' + text) def setZViewText(self, text): self.text_z.setText('up: ' + text) def __register_view_menu_messages(self): # Click messages for dimensions. base.accept(self.curXDimRightClickMessage, self.on_x_view_right_click) base.accept(self.curXDimLeftClickMessage, self.on_x_view_right_click) base.accept(self.curYDimRightClickMessage, self.open_context_view_y) base.accept(self.curYDimLeftClickMessage, self.open_context_view_y) base.accept(self.curZDimRightClickMessage, self.open_context_view_z) base.accept(self.curZDimLeftClickMessage, self.open_context_view_z) base.accept('clear_glow', self.clear_glow) base.accept('zoomout_none', self.clear_glow) def __placement(self, task): """ Called to fix the size, location of object when the aspect changes. """ if self.is_visable: base.camLens.setAspectRatio(base.getAspectRatio()) wp = base.win.getProperties() base.camLens.setAspectRatio( (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0)) self.right_menu_node_path.show() self.right_menu_node_path.setX( (base.getAspectRatio() + (0.40 / base.getAspectRatio()))) # Fix the position of the menu background image. self.bg.setX(0.32 + base.getAspectRatio()) if self.dimension_scrollbar is not None: self.dimension_scrollbar.setX(base.getAspectRatio() - 0.04) self.dimension_scrollbar.setZ(0.18) else: # set the position for the dimensino buttons base.camLens.setAspectRatio(base.getAspectRatio()) wp = base.win.getProperties() base.camLens.setAspectRatio( (wp.getXSize() + 0.0) / (wp.getYSize() + 0.0)) #self.right_menu_node_path.setX( (base.getAspectRatio()+(0.3/base.getAspectRatio())) ) self.right_menu_node_path.hide() self.right_menu_node_path.setX(500) #THIS IS NOT ALLOWD, CLOSES CLUSTER MENUS AS WELL! #messenger.send('CLOSE_ALL_CONTEXT') # Fix the position of the menu background image. self.bg.setX(0.95 + base.getAspectRatio()) self.bg.show() return task.cont
class AbstractDialog(): def __init__(self, np): self.close_message = 'dialog_closing' # Set the np for the dialog self.np = np self.np.setPos(0, 0, 0) # Load sounds for dialogs. self.mouseclick_sound = loader.loadSfx("static/sounds/mouseclick.wav") self.mouseover_sound = loader.loadSfx("static/sounds/mouseover.wav") # Load the background image for dialogs. self.bg = OnscreenImage(image='static/images/box.tif', parent=self.np) self.bg.setTransparency(TransparencyAttrib.MAlpha) self.bg.setAlphaScale(0.85) # Member variables self.btn_ok = None self.btn_cancel = None def create_ok_cancel_buttons(self, ok_caption='ok', cancel_caption='cancel'): # Create the ok button. self.btn_ok = DirectButton(text_fg=(1, 1, 1, 1), frameColor=(0.5, 0.5, 0.5, 1), relief=DGG.RAISED, text=(ok_caption, ok_caption, ok_caption, ok_caption), pressEffect=1, scale=0.030, frameSize=(-2, 2, -0.5, 1.0), parent=self.np, rolloverSound=None, clickSound=None, command=self.click_ok_button) self.btn_cancel = DirectButton( text_fg=(1, 1, 1, 1), frameColor=(0.5, 0.5, 0.5, 1), #borderWidth=(0.0,0.0), relief=DGG.RAISED, text=(cancel_caption, cancel_caption, cancel_caption, cancel_caption), pressEffect=1, scale=0.030, frameSize=(-2, 2, -0.5, 1.0), command=self.click_cancel_button, parent=self.np, rolloverSound=None, clickSound=None) def create_ok_button(self): self.btn_ok = DirectButton( text_fg=(1, 1, 1, 1), frameColor=(0.5, 0.5, 0.5, 1), #borderWidth=(0.0,0.0), relief=DGG.RAISED, text=('ok', 'ok', 'ok', 'ok'), pressEffect=1, scale=0.030, frameSize=(-2, 2, -0.5, 1.0), parent=self.np, rolloverSound=None, clickSound=None, command=self.click_ok_button) def set_ok_button_pos(self, pos): self.btn_ok.setPos(pos) def set_cancel_button_pos(self, pos): self.btn_cancel.setPos(pos) def click_ok_button(self): print 'CALLING BASE VERSION!' self.np.remove() messenger.send('dialog_closing') def click_cancel_button(self): self.np.remove() messenger.send('dialog_closing')
class ScreenDecorationManager: def __init__(self): self.tex_judgements = {} for i in ["PERFECT", "GOOD", "OK", "BAD", "MISS"]: self.tex_judgements[i] = loader.loadTexture("image/j_%s.png" % i.lower()) ## Judgement message self.image_judgement = OnscreenImage( image=self.tex_judgements["OK"], pos=(0, 0, 0), scale=(256.0 / base.win.getXSize(), 1, 32.0 / base.win.getYSize()), parent=render2d) self.image_judgement.setTransparency(TransparencyAttrib.MAlpha) #self.image_judgement.setPos(-0.7, 1, 0.6) self.image_judgement.setAlphaScale(0) interval_pos = LerpPosInterval(self.image_judgement, duration=0.1, startPos=VBase3(-1.2, 1, 0.5), pos=VBase3(-0.7, 1, 0.5), blendType='easeOut') interval_alpha = LerpFunc(self.image_judgement.setAlphaScale, duration=0.1, blendType='easeOut') interval_fade = LerpFunc(self.image_judgement.setAlphaScale, fromData=1, toData=0, duration=1.0, blendType='easeOut') self.judgement_enters = Sequence( Parallel(interval_pos, interval_alpha), Wait(1.0), interval_fade) ## Chain message text_node = TextNode('chain_msg') text_node.setAlign(TextNode.ACenter) text_node.setFont(babelfish_font) text_node.setTextColor(1, 1, 0.16, .9) text_node.setShadow(0.05, 0.05) text_node.setShadowColor(0.05, 0, 0.43, .9) self.chain_msg = aspect2d.attachNewNode(text_node) self.chain_msg.setPos(-.9, 1, 0.35) self.chain_msg.setScale(0.11) def judgement_msg(self, msg, chain): if self.judgement_enters.isPlaying(): self.judgement_enters.clearToInitial() self.image_judgement.setTexture(self.tex_judgements[msg]) self.judgement_enters.start() if chain > 1: self.chain_msg.node().setText("%d CHAIN" % chain) taskMgr.add(self.task_ClearJudgementTask, "clear-judgement") def task_ClearJudgementTask(self, task): if task.time < 1.5: return Task.cont self.chain_msg.node().clearText() def __del__(self): self.judgement_enters.finish() self.image_judgement.destroy() self.chain_msg.removeNode()
class GuiButton2: def __init__(self, hugpos, offset, aspect, plane, name): self.enabled = True self.name = name self.frame = DirectFrame( relief = DGG.FLAT , frameColor = (0, 0, 0, 0) , scale = 1 , frameSize = (-0.3, 0.3, -0.3, 0.3) ) #32/600=0.05333 self.frame.setScale(0.0533) self.imageObject = OnscreenImage(image = name+".png", pos = (0, 0, 0)) self.imageObject.setTransparency(TransparencyAttrib.MAlpha) self.imageObject.setAlphaScale(1) self.imageObject.reparentTo(self.frame) self.hugpos = hugpos self.offset = offset self.redraw(aspect) def redraw(self, aspect, flag="wide"): if self.hugpos == "top": p = base.a2dTopLeft.getPos()#@UndefinedVariable p.setX(p.getX() + self.offset.getX() + 0.05) p.setZ(p.getZ() + self.offset.getZ() - GUI_TOP_OFFSET - 0.05) elif self.hugpos == "bottom": p = base.a2dBottomLeft.getPos()#@UndefinedVariable p.setX(p.getX() + self.offset.getX() + 0.05) p.setZ(p.getZ() + self.offset.getZ() + GUI_BOTTOM_OFFSET - 0.05) elif self.hugpos == "right": p = base.a2dBottomRight.getPos()#@UndefinedVariable p.setX(p.getX() + self.offset.getX() + 0.05) p.setZ(p.getZ() + self.offset.getZ() + GUI_BOTTOM_OFFSET - 0.05) self.frame.setPos(p) if flag == "wide": posx, posy = self.frame.getTightBounds() self.pos_min_x = posx.getX() / aspect self.pos_min_y = posx.getZ() self.pos_max_x = posy.getX() / aspect self.pos_max_y = posy.getZ() elif flag == "tall": posx, posy = self.frame.getTightBounds() self.pos_min_x = posx.getX() self.pos_min_y = posx.getZ() / aspect self.pos_max_x = posy.getX() self.pos_max_y = posy.getZ() / aspect def turnOn(self): self.imageObject.setImage(self.name+"_on.png")#@UndefinedVariable self.imageObject.setTransparency(TransparencyAttrib.MAlpha) def turnOff(self): self.imageObject.setImage(self.name+".png")#@UndefinedVariable self.imageObject.setTransparency(TransparencyAttrib.MAlpha) def enable(self): self.imageObject.setImage(self.name+".png")#@UndefinedVariable self.imageObject.setTransparency(TransparencyAttrib.MAlpha) self.enabled = True def disable(self): self.imageObject.setImage("empty.png")#@UndefinedVariable self.imageObject.setTransparency(TransparencyAttrib.MAlpha) self.enabled = False def removeNode(self): self.frame.removeNode() def setAbility(self, ability): self.name = ability self.imageObject.setImage(self.name+".png") self.imageObject.setTransparency(TransparencyAttrib.MAlpha) self.imageObject.setAlphaScale(1)
class LevelSelectScreen: def __init__(self, game_opts): self.ITEM_SPACING = 1.7 self.game_opts = game_opts self.title = OnscreenText(text = 'Select Level', pos = (0.0, 0.7), scale = 0.3, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) self.bg = OnscreenImage(image='./image/bg.png', pos = (0.0, -1.0, 0.0), parent=render2d) self.bg.setTransparency(TransparencyAttrib.MAlpha) self.curr_option = 0 self.levels = [] self.arrow_left = OnscreenImage(image='./image/arrow_left.png', scale=(64.0/base.win.getXSize(), 1 ,64.0/base.win.getYSize()), pos = (-.8, -3.0, 0.0), parent=aspect2d) self.arrow_left.setTransparency(TransparencyAttrib.MAlpha) self.arrow_right = OnscreenImage(image='./image/arrow_right.png', scale=(64.0/base.win.getXSize(), 1 ,64.0/base.win.getYSize()), pos = (.8, -3.0, 0.0), parent=aspect2d) self.arrow_right.setTransparency(TransparencyAttrib.MAlpha) level_list = parse.level_list() level_list.sort() self.item_list_node = aspect2d.attachNewNode("ItemList") self.initial_x = self.item_list_node.getX() for i, lvl in enumerate(level_list): header = parse.level_header(lvl) level_item = self.make_level_item(header) level_item.setX(self.ITEM_SPACING*i) level_item.setZ(-0.1) level_item.setScale(.8) level_item.reparentTo(self.item_list_node) self.levels.append(header['NAME']) self.cur_interval = None self.update() def create_cur_interval(self): return Sequence(LerpScaleInterval(self.item_list_node.getChild(self.curr_option), duration=0.4, startScale=.8, scale=.85), LerpScaleInterval(self.item_list_node.getChild(self.curr_option), duration=0.4, startScale=.85, scale=.8)) def option_changed(self, command): changed = False if command=='left' and self.curr_option > 0: self.curr_option = (self.curr_option - 1) changed = True elif command=='right' and self.curr_option < len(self.levels)-1: self.curr_option = (self.curr_option + 1) changed = True if changed: interval = Parallel(LerpPosInterval(self.item_list_node, duration=.2, startPos=VBase3(self.item_list_node.getX(),.0,.0), pos=VBase3(-self.ITEM_SPACING*self.curr_option,.0,.0)), SoundInterval(menuSfx)) interval.start() self.update() def update(self): if self.curr_option < 1: self.arrow_left.setAlphaScale(.0) else: self.arrow_left.setAlphaScale(1) if self.curr_option >= len(self.levels)-1: self.arrow_right.setAlphaScale(.0) else: self.arrow_right.setAlphaScale(1) if self.cur_interval: self.cur_interval.finish() del self.cur_interval self.cur_interval = self.create_cur_interval() self.cur_interval.loop() def option_pressed(self): return self.levels[self.curr_option] def clear(self): self.bg.destroy() self.arrow_left.destroy() self.arrow_right.destroy() self.title.destroy() self.item_list_node.removeNode() def make_level_item(self, level_header): level_name = level_header['NAME'] level_item = aspect2d.attachNewNode(level_name) level_img = OnscreenImage(image='./levels/%s/image.png' % level_name, scale=(512.0/base.win.getXSize(), 1 ,362.0/base.win.getYSize()), pos = (0.0, 0.0, 0.3), parent=level_item) level_img.setTransparency(TransparencyAttrib.MAlpha) level_img.reparentTo(level_item) if level_header.has_key("TITLE"): title_str = "%s" % level_header["TITLE"] else: title_str = "%s" % level_header["NAME"] artist_str = "" if level_header.has_key("ARTIST"): artist_str = "by %s" % level_header["ARTIST"] title_text = OnscreenText(text = title_str, pos = (0.0, 0.-0.3), scale = 0.2, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) title_text.reparentTo(level_item) next_y = -0.50 if artist_str: next_y -= 0.05 artist_text = OnscreenText(text = artist_str, pos = (0.0, 0.-0.4), scale = 0.15, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) artist_text.reparentTo(level_item) bpm_text = OnscreenText(text = "BPM %.2f" % level_header["BPM"], pos = (0.0, next_y), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) bpm_text.reparentTo(level_item) if self.game_opts.has_option('hiscores', level_name): his = self.game_opts.get('hiscores', level_name).split(',') maxrank = OnscreenText(text = "max rank %s" % his[0].upper(), pos = (0.0, next_y-0.15), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) hiscore = OnscreenText(text = "hiscore %s" % his[1], pos = (0.0, next_y-0.25), scale = 0.18, font=babelfish_font, align=TextNode.ACenter, fg=(1,1,1,1)) maxrank.reparentTo(level_item) hiscore.reparentTo(level_item) return level_item
class MyApp(ShowBase): gameMode = "Intro" def __init__(self): ShowBase.__init__(self) #self.cameraSetup() self.setupKeyboard() self.initIntro() def gameChangeMode(self): if base.gameMode == "Intro": self.initIntro() elif base.gameMode == "Convo": self.initConvo() def initIntro(self): self.fadeAlpha = 0.0 self.fadeTime = 30.0 self.fadeInc = 1.0 / self.fadeTime self.fadeDir = "up" self.sceneImage = OnscreenImage(image="images/scene.png", scale=(1920.0 / 1080.0, 1, 1)) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) self.imageNumber = 0 self.sceneImageList = ["images/scene.png", "images/image1.jpg"] #self.texty = OnscreenText(str(self.fadeAlpha)) taskMgr.add(self.gameIntroUpdate, "GameIntroUpdate") def gameIntroUpdate(self, task): self.slideManager() if (base.gameMode != "Intro"): self.gameChangeMode() return Task.done return Task.cont def cameraSetup(self): base.camLens.setAspectRatio(1920.0 / 1080.0) def slideManager(self): if self.fadeDir == "up" and self.fadeAlpha < 1: self.fadeAlpha += self.fadeInc self.sceneImage.setAlphaScale(self.fadeAlpha) #self.texty.setText(str(self.fadeAlpha)) if self.fadeDir == "down" and self.fadeAlpha > 0: self.fadeAlpha -= self.fadeInc self.sceneImage.setAlphaScale(self.fadeAlpha) if self.fadeDir == "up" and self.fadeAlpha >= 1: self.fadeDir = "down" if self.fadeDir == "down" and self.fadeAlpha <= 0: if self.imageNumber < 1: self.fadeDir = "up" self.sceneImage.setImage(self.nextImage()) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) else: self.fadeDir = "up" base.gameMode = "Convo" self.sceneImage.setImage(self.sceneImageList[self.imageNumber]) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) def nextImage(self): self.imageNumber += 1 return self.sceneImageList[self.imageNumber] def initConvo(self): self.textToType = "This will be used for talking\nThis is a good conversation box" self.textVisible = "" self.strOptionA = "Yes" self.strOptionB = "No" self.strOptionC = "Maybe" self.convoResponseSelected = False self.convoDepth = "1" self.intOptionCount = 3 #self.txtConvo = OnscreenText(self.textVisible, align = TextNode.ALeft) self.txtConvo = TextNode("Texty Bastard") self.txtConvo.setText(self.textToType) self.txtReply = TextNode("reply") self.txtReply.setText("") self.intHover = 0 #self.txtConvo.setFrameColor(0, 0, 1, 1) #self.txtConvo.setFrameAsMargin(0.2, 0.2, 0.1, 0.1) myFrame = DirectFrame(frameColor=(0.8, 0.8, 0.8, 0.4), frameSize=(-1, 0, -1, 0)) nodePathConvo = aspect2d.attachNewNode(self.txtConvo) nodePathConvo.setScale(0.07) nodePathConvo.setPos(-1, 0, -0.1) self.i = 0 self.indent = 0.0 self.selectedResponse = 0 self.txtOptionA = OnscreenText(text="", pos=(-1, -0.6), align=TextNode.ALeft) self.txtOptionB = OnscreenText(text="", pos=(-1, -0.7), align=TextNode.ALeft) self.txtOptionC = OnscreenText(text="", pos=(-1, -0.8), align=TextNode.ALeft) taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate") def gameConvoUpdate(self, task): if (len(self.textVisible) != len(self.textToType)): task.delayTime = 0.001 while (self.i < len(self.textToType)): self.textVisible += self.textToType[self.i] self.txtConvo.setText(self.textVisible) self.i += 1 return Task.again else: taskMgr.add(self.gameConvoOptions, "ConvoOptions") return Task.done def gameConvoOptions(self, task): self.txtOptionA.setText(self.strOptionA) self.txtOptionB.setText(self.strOptionB) self.txtOptionC.setText(self.strOptionC) if self.convoResponseSelected == True: if self.convoCheckBranch("01", self.convoDepth): #self.txtConvo.setText(self.convoGetStrings("01", self.convoDepth)) self.convoNextDialogue("01", self.convoDepth) else: #self.txtConvo.setText("It DIDn't worked") self.convoDepth = "1" self.convoNextDialogue("01", self.convoDepth) return Task.done elif self.selectedResponse == 0: if self.intOptionCount > 0: self.txtOptionA.setX(-1 + self.indent) self.txtOptionA.setFg(fg=(1, 0, 0, 1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1) self.txtOptionB.setFg(fg=(0, 0, 0, 1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1) self.txtOptionC.setFg(fg=(0, 0, 0, 1)) self.indent = self.getIndent(self.indent, 0.01, 0.1) return Task.again elif self.selectedResponse == 1: if self.intOptionCount > 0: self.txtOptionA.setX(-1) self.txtOptionA.setFg(fg=(0, 0, 0, 1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1 + self.indent) self.txtOptionB.setFg(fg=(1, 0, 0, 1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1) self.txtOptionC.setFg(fg=(0, 0, 0, 1)) self.indent = self.getIndent(self.indent, 0.01, 0.1) return Task.again elif self.selectedResponse == 2: if self.intOptionCount > 0: self.txtOptionA.setX(-1) self.txtOptionA.setFg(fg=(0, 0, 0, 1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1) self.txtOptionB.setFg(fg=(0, 0, 0, 1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1 + self.indent) self.txtOptionC.setFg(fg=(1, 0, 0, 1)) self.indent = self.getIndent(self.indent, 0.01, 0.1) return Task.again def convoGetStrings(self, npcId, depth): if self.convoCheckBranch(npcId, depth) != True: return "#Error# String Not Found\nLooking for: " + "(" + str( npcId) + ")." + depth + ":" char = "" line = "" feed = "" path = os.path.abspath(os.getcwd()) f = open(path + "\\text\\stringsConvo.txt", "r") while line != "(" + str(npcId) + ")." + depth + ":": while char != ":": char = f.readline(1) line += char feed += "\n" + line if line != "(" + str(npcId) + ")." + depth + ":": char = "" line = "" f.readline() print(feed + " Selected") f.readline(1) line = f.readline() line = line.replace("##", "\n") f.close() return line def convoCheckBranch(self, npcId, depth): path = os.path.abspath(os.getcwd()) f = open(path + "\\text\\stringsConvo.txt", "r") char = "" line = "" branchFound = False while line != "<END>:": char = "" line = "" while char != ":": char = f.readline(1) line += char if line == "<END>:": f.close() return False elif line == "(" + str(npcId) + ")." + str(depth) + ":": f.close() return True else: f.readline() def convoNextDialogue(self, npcId, depth): self.textToType = self.convoGetStrings(npcId, depth) self.intOptionCount = self.convoGetOptionCount(npcId, depth) if self.intOptionCount == 1: self.strOptionA = self.convoGetStrings(npcId, depth + ".A") self.strOptionB = "" self.strOptionC = "" elif self.intOptionCount == 2: self.strOptionA = self.convoGetStrings(npcId, depth + ".A") self.strOptionB = self.convoGetStrings(npcId, depth + ".B") self.strOptionC = "" elif self.intOptionCount == 3: self.strOptionA = self.convoGetStrings(npcId, depth + ".A") self.strOptionB = self.convoGetStrings(npcId, depth + ".B") self.strOptionC = self.convoGetStrings(npcId, depth + ".C") else: self.strOptionA = "" self.strOptionB = "" self.strOptionC = "" self.textVisible = "" self.txtOptionA.setText("") self.txtOptionB.setText("") self.txtOptionC.setText("") self.txtConvo.setText(self.textVisible) #self.intOptionCount = 2 self.selectedResponse = 0 self.i = 0 self.convoResponseSelected = False taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate") def convoGetOptionCount(self, npcId, depth): if self.convoCheckBranch( npcId, depth + ".A") and self.convoCheckBranch( npcId, depth + ".B") and self.convoCheckBranch( npcId, depth + ".C"): return 3 elif self.convoCheckBranch(npcId, depth + ".A") and self.convoCheckBranch( npcId, depth + ".B"): return 2 elif self.convoCheckBranch(npcId, depth + ".A"): return 1 else: return 0 def getIndent(self, value, increment, limit): if (value + increment >= limit): return limit else: return value + increment def setupKeyboard(self): self.accept("arrow_down", self.convoOptionDown) self.accept("arrow_up", self.convoOptionUp) self.accept("enter", self.convoOptionSelect) def convoOptionUp(self): self.indent = 0.0 if self.selectedResponse == 0: self.selectedResponse = self.intOptionCount - 1 elif self.selectedResponse > 0: self.selectedResponse -= 1 def convoOptionDown(self): self.indent = 0.0 if self.selectedResponse < self.intOptionCount - 1: self.selectedResponse += 1 elif self.selectedResponse == self.intOptionCount - 1: self.selectedResponse = 0 def convoOptionSelect(self): if self.selectedResponse == 0: self.convoDepth += ".A.1" elif self.selectedResponse == 1: self.convoDepth += ".B.1" elif self.selectedResponse == 2: self.convoDepth += ".C.1" self.convoResponseSelected = True
class MyApp(ShowBase): gameMode = "Intro" def __init__(self): ShowBase.__init__(self) #self.cameraSetup() self.setupKeyboard() self.initIntro() def gameChangeMode(self): if base.gameMode == "Intro": self.initIntro() elif base.gameMode == "Convo": self.initConvo() def initIntro(self): self.fadeAlpha = 0.0 self.fadeTime = 30.0 self.fadeInc = 1.0/self.fadeTime self.fadeDir = "up" self.sceneImage = OnscreenImage(image = "images/scene.png", scale = (1920.0/1080.0,1,1)) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) self.imageNumber = 0 self.sceneImageList = ["images/scene.png","images/image1.jpg"] #self.texty = OnscreenText(str(self.fadeAlpha)) taskMgr.add(self.gameIntroUpdate, "GameIntroUpdate") def gameIntroUpdate(self, task): self.slideManager() if (base.gameMode != "Intro"): self.gameChangeMode() return Task.done return Task.cont def cameraSetup(self): base.camLens.setAspectRatio(1920.0/1080.0) def slideManager(self): if self.fadeDir == "up" and self.fadeAlpha<1: self.fadeAlpha += self.fadeInc self.sceneImage.setAlphaScale(self.fadeAlpha) #self.texty.setText(str(self.fadeAlpha)) if self.fadeDir == "down" and self.fadeAlpha > 0: self.fadeAlpha -= self.fadeInc self.sceneImage.setAlphaScale(self.fadeAlpha) if self.fadeDir == "up" and self.fadeAlpha >= 1: self.fadeDir = "down" if self.fadeDir == "down" and self.fadeAlpha <= 0: if self.imageNumber < 1: self.fadeDir = "up" self.sceneImage.setImage(self.nextImage()) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) else: self.fadeDir = "up" base.gameMode = "Convo" self.sceneImage.setImage(self.sceneImageList[self.imageNumber]) self.sceneImage.setTransparency(TransparencyAttrib.MAlpha) self.sceneImage.setAlphaScale(self.fadeAlpha) def nextImage(self): self.imageNumber += 1 return self.sceneImageList[self.imageNumber] def initConvo(self): self.textToType = "This will be used for talking\nThis is a good conversation box" self.textVisible = "" self.strOptionA = "Yes" self.strOptionB = "No" self.strOptionC = "Maybe" self.convoResponseSelected = False self.convoDepth = "1" self.intOptionCount = 3 #self.txtConvo = OnscreenText(self.textVisible, align = TextNode.ALeft) self.txtConvo = TextNode("Texty Bastard") self.txtConvo.setText(self.textToType) self.txtReply = TextNode("reply") self.txtReply.setText("") self.intHover = 0 #self.txtConvo.setFrameColor(0, 0, 1, 1) #self.txtConvo.setFrameAsMargin(0.2, 0.2, 0.1, 0.1) myFrame = DirectFrame(frameColor=(0.8, 0.8, 0.8, 0.4), frameSize=(-1, 0, -1, 0)) nodePathConvo = aspect2d.attachNewNode(self.txtConvo) nodePathConvo.setScale(0.07) nodePathConvo.setPos(-1, 0, -0.1) self.i = 0 self.indent = 0.0 self.selectedResponse = 0 self.txtOptionA = OnscreenText(text = "", pos = (-1,-0.6), align = TextNode.ALeft) self.txtOptionB = OnscreenText(text = "", pos = (-1,-0.7), align = TextNode.ALeft) self.txtOptionC = OnscreenText(text = "", pos = (-1,-0.8), align = TextNode.ALeft) taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate") def gameConvoUpdate(self, task): if (len(self.textVisible) != len(self.textToType)): task.delayTime = 0.001 while (self.i < len(self.textToType)): self.textVisible += self.textToType[self.i] self.txtConvo.setText(self.textVisible) self.i += 1 return Task.again else: taskMgr.add(self.gameConvoOptions, "ConvoOptions") return Task.done def gameConvoOptions(self, task): self.txtOptionA.setText(self.strOptionA) self.txtOptionB.setText(self.strOptionB) self.txtOptionC.setText(self.strOptionC) if self.convoResponseSelected == True: if self.convoCheckBranch("01", self.convoDepth): #self.txtConvo.setText(self.convoGetStrings("01", self.convoDepth)) self.convoNextDialogue("01", self.convoDepth) else: #self.txtConvo.setText("It DIDn't worked") self.convoDepth = "1" self.convoNextDialogue("01", self.convoDepth) return Task.done elif self.selectedResponse == 0: if self.intOptionCount > 0: self.txtOptionA.setX(-1+self.indent) self.txtOptionA.setFg(fg = (1,0,0,1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1) self.txtOptionB.setFg(fg = (0,0,0,1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1) self.txtOptionC.setFg(fg = (0,0,0,1)) self.indent = self.getIndent(self.indent,0.01,0.1) return Task.again elif self.selectedResponse == 1: if self.intOptionCount > 0: self.txtOptionA.setX(-1) self.txtOptionA.setFg(fg = (0,0,0,1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1+self.indent) self.txtOptionB.setFg(fg = (1,0,0,1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1) self.txtOptionC.setFg(fg = (0,0,0,1)) self.indent = self.getIndent(self.indent,0.01,0.1) return Task.again elif self.selectedResponse == 2: if self.intOptionCount > 0: self.txtOptionA.setX(-1) self.txtOptionA.setFg(fg = (0,0,0,1)) if self.intOptionCount > 1: self.txtOptionB.setX(-1) self.txtOptionB.setFg(fg = (0,0,0,1)) if self.intOptionCount > 2: self.txtOptionC.setX(-1+self.indent) self.txtOptionC.setFg(fg = (1,0,0,1)) self.indent = self.getIndent(self.indent,0.01,0.1) return Task.again def convoGetStrings(self,npcId,depth): if self.convoCheckBranch(npcId,depth) != True: return "#Error# String Not Found\nLooking for: "+"("+str(npcId)+")."+depth+":" char = "" line = "" feed = "" path = os.path.abspath(os.getcwd()) f = open(path+"\\text\\stringsConvo.txt","r") while line != "("+str(npcId)+")."+depth+":": while char != ":": char = f.readline(1) line += char feed += "\n"+line if line != "("+str(npcId)+")."+depth+":": char = "" line = "" f.readline() print(feed + " Selected") f.readline(1) line = f.readline() line = line.replace("##", "\n") f.close() return line def convoCheckBranch(self,npcId,depth): path = os.path.abspath(os.getcwd()) f = open(path+"\\text\\stringsConvo.txt","r") char = "" line = "" branchFound = False while line != "<END>:": char = "" line = "" while char != ":": char = f.readline(1) line += char if line == "<END>:": f.close() return False elif line == "("+str(npcId)+")."+str(depth)+":": f.close() return True else: f.readline() def convoNextDialogue(self,npcId,depth): self.textToType = self.convoGetStrings(npcId, depth) self.intOptionCount = self.convoGetOptionCount(npcId, depth) if self.intOptionCount == 1: self.strOptionA = self.convoGetStrings(npcId, depth+".A") self.strOptionB = "" self.strOptionC = "" elif self.intOptionCount == 2: self.strOptionA = self.convoGetStrings(npcId, depth+".A") self.strOptionB = self.convoGetStrings(npcId, depth+".B") self.strOptionC = "" elif self.intOptionCount == 3: self.strOptionA = self.convoGetStrings(npcId, depth+".A") self.strOptionB = self.convoGetStrings(npcId, depth+".B") self.strOptionC = self.convoGetStrings(npcId, depth+".C") else: self.strOptionA = "" self.strOptionB = "" self.strOptionC = "" self.textVisible = "" self.txtOptionA.setText("") self.txtOptionB.setText("") self.txtOptionC.setText("") self.txtConvo.setText(self.textVisible) #self.intOptionCount = 2 self.selectedResponse = 0 self.i = 0 self.convoResponseSelected = False taskMgr.add(self.gameConvoUpdate, "GameConvoUpdate") def convoGetOptionCount(self,npcId,depth): if self.convoCheckBranch(npcId,depth+".A") and self.convoCheckBranch(npcId,depth+".B") and self.convoCheckBranch(npcId,depth+".C"): return 3 elif self.convoCheckBranch(npcId,depth+".A") and self.convoCheckBranch(npcId,depth+".B"): return 2 elif self.convoCheckBranch(npcId,depth+".A"): return 1 else: return 0 def getIndent(self, value, increment, limit): if (value + increment >= limit): return limit else: return value+increment def setupKeyboard(self): self.accept("arrow_down", self.convoOptionDown) self.accept("arrow_up", self.convoOptionUp) self.accept("enter",self.convoOptionSelect) def convoOptionUp(self): self.indent = 0.0 if self.selectedResponse == 0: self.selectedResponse = self.intOptionCount-1 elif self.selectedResponse > 0: self.selectedResponse -= 1 def convoOptionDown(self): self.indent = 0.0 if self.selectedResponse < self.intOptionCount-1: self.selectedResponse += 1 elif self.selectedResponse == self.intOptionCount-1: self.selectedResponse = 0 def convoOptionSelect(self): if self.selectedResponse == 0: self.convoDepth += ".A.1" elif self.selectedResponse == 1: self.convoDepth += ".B.1" elif self.selectedResponse == 2: self.convoDepth += ".C.1" self.convoResponseSelected = True