class Instructions: def __init__(self): self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0)) self.frameMain.setTransparency(1) self.content = DirectLabel(scale = 0.1, pos = (0.0, 0.0, base.a2dTop - 0.25), frameColor = (0, 0, 0, 0), text="Place hand above leap motion to control the sword.\nPress 'o' to open chest.\nPress space to open door to next level.\nUse WSAD to control motion.\nTurn left and right using Q and E.\n You can only enter the next level when you have \n killed more than 15 enemies. Good luck!", text_fg=(1,1,1,1)) self.content.setTransparency(1) self.content.reparentTo(self.frameMain) self.btnStartGame = self.createButton("Start Game", -0.25, ["Instructions-startGame"]) self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"]) # background image from https://www.shutterstock.com/it/video/clip-5477162-dark-scary-dungeon-high-definition self.frameBackground = DirectFrame(image = ('models/startmenutest.jpg'), sortOrder = (-1), frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop)) self.frameBackground.reparentTo(render2d) self.hide() def createButton(self, text,verticalPos, eventArgs): btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send, extraArgs=eventArgs, rolloverSound=None, clickSound=None) btn.reparentTo(self.frameMain) def show(self): self.frameMain.show() self.frameBackground.show() def hide(self): self.frameMain.hide() self.frameBackground.hide()
class Win: def __init__(self): self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0)) self.frameMain.setTransparency(1) self.content = DirectLabel(scale = 0.1, pos = (0.0, 0.0, base.a2dTop - 1), frameColor = (0, 0, 0, 0), text="Congratulations, warrior! \n You successfully got OUT of that ugly place...", text_fg=(1,1,1,1)) self.content.setTransparency(1) self.content.reparentTo(self.frameMain) self.btnExit = self.createButton("Leave", -0.75, ["Menu-Quit"]) # background image from http://ajuntament.barcelona.cat/castelldemontjuic/en/activitats/noticies/we-open-dungeons-castle self.frameBackground = DirectFrame(image = ('models/winBackground.jpg'), sortOrder = (-1), frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop)) self.frameBackground.reparentTo(render2d) self.hide() def createButton(self, text,verticalPos, eventArgs): btn = DirectButton(text=text,scale=0.15, pos=(0,0,verticalPos), command=base.messenger.send, extraArgs=eventArgs, rolloverSound=None, clickSound=None) btn.reparentTo(self.frameMain) def show(self): self.frameMain.show() self.frameBackground.show() def hide(self): self.frameMain.hide() self.frameBackground.hide()
class EndMenu: def __init__(self): self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0)) self.frameMain.setTransparency(1) self.title = DirectLabel(scale = 0.25, pos = (0.0, 0.0, base.a2dTop - 0.25), frameColor = (0, 0, 0, 0), text="Unlucky...\nTry next time", text_fg=(1,1,1,1)) self.title.setTransparency(1) self.title.reparentTo(self.frameMain) # background image taken from http://www.leagueittous.com/2015/03/12/sorry-you-lose/ self.frameBackground = DirectFrame(image = ('models/game-over.png'), sortOrder = (-1), frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop)) self.frameBackground.reparentTo(render2d) self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"]) self.hide() def createButton(self, text,verticalPos, eventArgs): btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send, extraArgs=eventArgs, rolloverSound=None, clickSound=None) btn.reparentTo(self.frameMain) def show(self): self.frameMain.show() self.frameBackground.show() def hide(self): self.frameMain.hide() self.frameBackground.hide()
class StartMenu: def __init__(self): self.frameMain = DirectFrame(frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0,0,0,0)) self.frameMain.setTransparency(1) # background image from https://www.shutterstock.com/it/video/clip-5477162-dark-scary-dungeon-high-definition self.frameBackground = DirectFrame(image = ('models/startmenutest.jpg'), sortOrder = (-1), frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop)) self.frameBackground.reparentTo(render2d) self.title = DirectLabel(scale = 0.25, pos = (0.0, 0.0, base.a2dTop - 0.25), frameColor = (0, 0, 0, 0), text="OUT", text_fg=(1,1,1,1)) self.title.setTransparency(1) self.title.reparentTo(self.frameMain) self.btnStart = self.createButton("Start", 0.25, ["Menu-Start"]) self.btnInstr = self.createButton('Instructions', -0.25, ['Menu-Instructions']) self.btnExit = self.createButton("Quit", -0.75, ["Menu-Quit"]) self.hide() # create buttons def createButton(self, text,verticalPos, eventArgs): btn = DirectButton(text=text,scale=0.25, pos=(0,0,verticalPos), command=base.messenger.send, extraArgs=eventArgs, rolloverSound=None, clickSound=None) btn.reparentTo(self.frameMain) def show(self): self.frameMain.show() self.frameBackground.show() def hide(self): self.frameMain.hide() self.frameBackground.hide()
def getGuestItem(self, name, inviteStatus): label = DirectLabel(relief=None, text=name, text_scale=0.045, text_align=TextNode.ALeft, textMayChange=True) dot = DirectFrame(relief=None, geom=self.hostingGui.find('**/questionMark'), pos=(0.5, 0.0, 0.01)) if inviteStatus == PartyGlobals.InviteStatus.Accepted: dot['geom'] = (self.hostingGui.find('**/checkmark'),) elif inviteStatus == PartyGlobals.InviteStatus.Rejected: dot['geom'] = (self.hostingGui.find('**/x'),) PartyUtils.truncateTextOfLabelBasedOnWidth(label, name, PartyGlobals.EventsPageGuestNameMaxWidth) dot.reparentTo(label) return label
class AlertPopup(DirectObject): def __init__(self, title, message, okayFunction, cancelFunction): self.okayFunction = okayFunction self.cancelFunction = cancelFunction self.node = aspect2d.attachNewNode('alertPopup') self.frame = DirectFrame() self.LoadContent(title, message) self.frame.reparentTo(self.node) def LoadContent(self, title, message): bg = OnscreenImage(image = 'Assets/Images/Inventory/BlackScreen.png', scale = (2, 1, 1)) bg.setTransparency(TransparencyAttrib.MAlpha) bg.reparentTo(self.node) popup = OnscreenImage(image = 'Assets/Images/Menus/Popups/popup.png') popup.setTransparency(TransparencyAttrib.MAlpha) popup.reparentTo(self.node) titleText = OnscreenText(text = title, pos = (-0.29, 0.51), scale = 0.07, fg = (1, 1, 1, 1)) titleText.reparentTo(self.node) self.LoadButton('Button_Okay', 'okay', 'okay_over', -0.27, -0.13, self.OnButtonClicked, ['okay']) self.LoadButton('Button_Cancel', 'cancel', 'cancel_over', 0.27, -0.13, self.OnButtonClicked, ['cancel']) messageText = OnscreenText(text = message, pos = (0, 0.2), scale = 0.07, fg = (1, 1, 1, 1)) messageText.reparentTo(self.node) def LoadButton(self, egg, up, over, x, y, cmd, args): maps = loader.loadModel("Assets/Images/Menus/Popups/%s" % (egg)) b = DirectButton(geom = (maps.find('**/%s' % (up)), maps.find('**/%s' % (over)), maps.find('**/%s' % (over)), maps.find('**/%s' % (up))), command = cmd, extraArgs = args, pressEffect = 0, relief = None, rolloverSound = None, clickSound = None, pos = (x, 1, y), scale = (0.5, 1, 60.0/400.0)) b.reparentTo(self.frame) def Destroy(self): self.frame.destroy() self.node.removeNode() def OnButtonClicked(self, buttonText): if(buttonText == 'okay'): self.okayFunction(self) elif(buttonText == 'cancel'): self.cancelFunction(self)
class LoadingScreen(): """Show a directWaitbar to display the current loading state of the application""" def __init__(self): # a fill panel so the player doesn't see how everything # gets loaded in the background self.frameMain = DirectFrame( image="gui/MenuBackground.png", image_scale=(1.7778, 1, 1), #image_pos=(0, 0, 0.25), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.frameMain.setTransparency(True) self.frameMain.setBin("fixed", 6000) self.frameMain.setDepthWrite(False) self.logo = DirectFrame( image="Logo.png", image_scale=0.25, image_pos=(0, 0, 0.55), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.logo.reparentTo(self.frameMain) # the text Loading... self.lblLoading = DirectLabel( scale=0.10, pos=(0, 0, -0.15), frameColor=(0, 0, 0, 0), text=_("Loading..."), text_align=TextNode.ACenter, text_fg=(1, 1, 1, 1)) self.lblLoading.reparentTo(self.frameMain) self.stop() def start(self): self.frameMain.show() base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() def stop(self): self.frameMain.hide()
def getGuestItem(self, name, inviteStatus): label = DirectLabel(relief=None, text=name, text_scale=0.045, text_align=TextNode.ALeft, textMayChange=True) dot = DirectFrame(relief=None, geom=self.hostingGui.find('**/questionMark'), pos=(0.5, 0.0, 0.01)) if inviteStatus == PartyGlobals.InviteStatus.Accepted: dot['geom'] = (self.hostingGui.find('**/checkmark'), ) elif inviteStatus == PartyGlobals.InviteStatus.Rejected: dot['geom'] = (self.hostingGui.find('**/x'), ) PartyUtils.truncateTextOfLabelBasedOnWidth( label, name, PartyGlobals.EventsPageGuestNameMaxWidth) dot.reparentTo(label) return label
class Mainmenu(): def __init__(self): self.frameMain = DirectFrame( image="gui/MenuBackground.png", image_scale=(1.7778, 1, 1), #image_pos=(0, 0, 0.25), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.frameMain.setTransparency(True) self.logo = DirectFrame( image="Logo.png", image_scale=0.45, image_pos=(0, 0, 0.35), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.logo.reparentTo(self.frameMain) btnGeom = "gui/button" self.btnStart = menuHelper.createButton(_("Start"), btnGeom, 0, -0.7, ["menu_start"]) self.btnStart.reparentTo(self.frameMain) self.btnOptions = menuHelper.createButton(_("Options"), btnGeom, -1.0, -0.7, ["menu_options"]) self.btnOptions.reparentTo(self.frameMain) self.btnQuit = menuHelper.createButton(_("Quit"), btnGeom, 1.0, -0.7, ["menu_quit"]) self.btnQuit.reparentTo(self.frameMain) self.hide() def show(self): self.frameMain.show() def hide(self): self.frameMain.hide()
class CraftInventory(DirectObject): def __init__(self): self.itemFrame = DirectScrolledFrame( text="Inventory", text_scale=0.25, text_pos=(0, 0.75, 0), text_bg=(1, 1, 1, 1), # make the frame occupy the whole window frameSize=(-0.6, 0.6, -0.8, 0.8), pos=(-0.7, 0, 0), # make the canvas as big as the frame canvasSize=(-0.6, 0.6, -0.8, 0.8), # set the frames color to white frameColor=(1, 1, 1, 1), ) self.itemList = [] self.craftFrame = DirectFrame( text="Crafting", text_scale=0.25, text_pos=(0, 0.75, 0), text_bg=(1, 1, 1, 1), # make the frame occupy the whole window frameSize=(-0.6, 0.6, -0.8, 0.8), pos=(0.7, 0, 0), # set the frames color to white frameColor=(1, 1, 1, 1), ) self.craftDrop = DirectFrame( text="drop ore", text_scale=0.1, pos=(0, 0.4, 0), frameSize=(-0.25, 0.25, -0.25, 0.25), frameColor=(1, 0, 0, 1), ) self.craftDrop.reparentTo(self.craftFrame) def show(self): self.itemFrame.show() self.craftFrame.show() def hide(self): self.itemFrame.hide() self.craftFrame.hide() def __makeItem(self, item): obj = DirectLabel( text=str(item.giveLoot()) + "x " + item.giveType(), text_scale=0.5, text_pos=(0, -1, 0), image=("item.png", "item_hover.png", "item.png"), # normal, hover, disabled scale=0.16, numStates=2, state=DGG.NORMAL, relief=DGG.GROOVE, ) obj.setTransparency(True) obj["activeState"] = 0 obj.reparentTo(self.itemFrame.getCanvas()) obj.bind(DGG.B1PRESS, self.dragStart, [obj]) obj.bind(DGG.B1RELEASE, self.dragStop) obj.bind(DGG.ENTER, self.inObject, [obj]) obj.bind(DGG.EXIT, self.outObject, [obj]) return obj def updateList(self, items): for item in self.itemList: item.destroy() i = 1 j = 0 pad = 0.2 numItemsPerRow = 2 itemWidth = 0.32 itemHeight = 0.32 # left = -(itemWidth * (numItemsPerRow/2.0)) - 0.16 left = self.itemFrame.getX() # + (itemWidth + 0.16) xStep = itemWidth + 0.13 yStep = -(itemHeight + 0.13) top = 0.8 - (0.16 + pad) for item in items: self.itemList.append(self.__makeItem(item)) x = left + i * xStep y = top + j * yStep self.itemList[-1].setPos(x, 0.0, y) if i == numItemsPerRow: i = 0 j += 1 i += 1 if i == 1: j -= 1 height = ((j) * -yStep) - 0.16 # resize the canvas. This will make the scrollbars dis-/appear, # dependent on if the canvas is bigger than the frame size. self.itemFrame["canvasSize"] = (-0.6, 0.6, -height, 0.8) def inObject(self, element, event): # Can be used to highlight objects element["activeState"] = 1 element.setActiveState() # print "over object" def outObject(self, element, event): # Can be used to unhighlight objects # element["state"] = 0 element["activeState"] = 0 element.setActiveState() def dragStart(self, element, event): print "start drag" taskMgr.remove("dragDropTask") vWidget2render2d = element.getPos(render2d) vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1]) editVec = Vec3(vWidget2render2d - vMouse2render2d) t = taskMgr.add(self.dragTask, "dragDropTask") element.reparentTo(aspect2d) t.element = element t.editVec = editVec t.elementStartPos = element.getPos() def dragTask(self, state): mwn = base.mouseWatcherNode if mwn.hasMouse(): vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1]) newPos = vMouse2render2d + state.editVec state.element.setPos(render2d, newPos) return Task.cont def dragStop(self, event): print "stop drag with:", event isInArea = False t = taskMgr.getTasksNamed("dragDropTask")[0] # for dropArea in self.dropAreas: # if self.isInBounds(event.getMouse(), dropArea["frameSize"], dropArea.getPos(render)): # print "inside Area:", dropArea["text"], dropArea.getPos(render) # isInArea = True # t.element.setPos(dropArea.getPos(render)) # t.element.setX(t.element.getX() * self.ratio) # #t.element.setX(t.element.getX() - t.element.getWidth() / 2.0) # break if not isInArea: t.element.setPos(t.elementStartPos) t.element.reparentTo(self.itemFrame.getCanvas()) taskMgr.remove("dragDropTask") def isInBounds(self, location, bounds, posShift=None): x = 0 if posShift is None else posShift.getX() y = 0 if posShift is None else posShift.getZ() left = x + bounds[0] right = x + bounds[1] bottom = y + bounds[2] top = y + bounds[3] # are we outside of the bounding box from the left if location[0] < left: return False # are we outside of the bounding box from the right if location[0] > right: return False # are we outside of the bounding box from the bottom if location[1] < bottom: return False # are we outside of the bounding box from the top if location[1] > top: return False # the location is inside the bbox return True
class CIProgressScreen: Color = (118 / 255.0, 121 / 255.0, 127 / 255.0, 1.0) BarColor = (152 / 255.0, 129 / 255.0, 64 / 255.0, 1.0) def __init__(self): self.defaultLogoScale = 1 self.defaultLogoZ = 0.65 self.bgm = loader.loadModel( "phase_3/models/gui/progress-background.bam") self.bgm.find('**/logo').stash() self.barShadow = OnscreenImage(image=self.bgm.find("**/bar_shadow"), parent=hidden) self.bgm.find("**/bar_shadow").removeNode() self.bg = self.bgm.find('**/bg') self.defaultBgTexture = self.bg.findTexture('*') self.logoNode, self.logoImg = CIGlobals.getLogoImage( hidden, self.defaultLogoScale, (0, 0, self.defaultLogoZ)) self.bg_img = OnscreenImage(image=self.bg, parent=hidden) self.bg_img.setSx(1.35) self.bg_img.hide() self.progress_bar = DirectWaitBar(value=0, pos=(0, 0, -0.85), parent=hidden, text_pos=(0, 0, 0.2)) self.progress_bar.setSx(1.064) self.progress_bar.setSz(0.38) toontipgui = loader.loadModel( 'phase_3.5/models/gui/stickerbook_gui.bam') poster = toontipgui.find('**/questCard') self.toontipFrame = DirectFrame(image=poster, image_scale=(1.4, 1, 1), parent=hidden, relief=None, pos=(0, 0, -0.1), scale=0.85) self.toontipLbl = OnscreenText(text="", parent=self.toontipFrame, fg=(89.0 / 255, 95.0 / 255, 98.0 / 255, 1), font=CIGlobals.getToonFont(), wordwrap=13, pos=(-0.59, 0.25), align=TextNode.ALeft, scale=0.08) self.loading_lbl = DirectLabel(text="", relief=None, scale=0.08, pos=(-1.0725, 0, -0.79), text_align=TextNode.ALeft, sortOrder=100, text_fg=(1, 1, 1, 1), text_font=CIGlobals.getMinnieLogoFont(), parent=hidden, text_shadow=(0, 0, 0, 0)) # This is useful when the user has chosen to hide aspect2d before the loading screen. # However, we want to show the loading screen all the time, so we need to restore the # previous state after the loading screen ends. self.mustRestoreHiddenAspect2d = False def begin(self, hood, range, wantGui): render.hide() NametagGlobals.setWant2dNametags(False) if base.aspect2d.isHidden(): base.aspect2d.show() self.mustRestoreHiddenAspect2d = True self.renderFrames() base.setBackgroundColor(0, 0, 0) if hood == "localAvatarEnterGame": self.loading_lbl['text'] = "Entering..." elif hood == "init": self.loading_lbl['text'] = "Loading..." else: self.loading_lbl['text'] = "Heading to %s..." % hood self.progress_bar['barColor'] = self.BarColor self.progress_bar['range'] = range self.bgm.reparentTo(aspect2d) ZoneUtil.Hood2ZoneId.keys() # We only want to show special loading screens for actual in-game locations. if hood in ZoneUtil.Hood2ZoneId.keys(): abbr = ZoneUtil.ZoneId2HoodAbbr.get( ZoneUtil.Hood2ZoneId.get(hood)).lower() bgTexture = loader.loadTexture( 'phase_14/maps/{0}_loading.png'.format(abbr), okMissing=True) if bgTexture: self.bg.setTexture(bgTexture, 1) self.barShadow.reparentTo(aspect2d) self.bg.reparentTo(render2d) self.bg_img.reparentTo(hidden) self.loading_lbl.reparentTo(aspect2d) self.logoNode.reparentTo(aspect2d) self.progress_bar.reparentTo(aspect2d) tip = random.choice(CIGlobals.ToonTips) self.toontipLbl.setText("TOON TIP:\n" + tip) self.toontipFrame.reparentTo(aspect2d) self.__count = 0 self.__expectedCount = range self.progress_bar.update(self.__count) def renderFramesTask(self, task): self.renderFrames() return task.cont def end(self): base.setBackgroundColor(CIGlobals.DefaultBackgroundColor) taskMgr.remove("renderFrames") render.show() if self.mustRestoreHiddenAspect2d: base.aspect2d.hide() self.mustRestoreHiddenAspect2d = False self.progress_bar.finish() self.bg_img.reparentTo(hidden) self.logoNode.reparentTo(hidden) self.barShadow.reparentTo(hidden) self.bg.reparentTo(hidden) # Let's get rid of the extra texture stage. self.bg.setTexture(self.defaultBgTexture, 1) self.bgm.reparentTo(hidden) self.loading_lbl.reparentTo(hidden) self.progress_bar.reparentTo(hidden) self.toontipFrame.reparentTo(hidden) base.transitions.fadeScreen(1.0) NametagGlobals.setWant2dNametags(True) self.renderFrames() def destroy(self): self.bg.removeNode() del self.bg self.bgm.removeNode() del self.bgm self.bg_img.destroy() self.barShadow.destroy() del self.barShadow self.loading_lbl.destroy() self.progress_bar.destroy() self.bgm.destroy() self.mustRestoreHiddenAspect2d = False del self.bg_img del self.loading_lbl del self.progress_bar del self.bgm del self.defaultBgTexture del self.mustRestoreHiddenAspect2d def renderFrames(self): base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() def tick(self): self.__count += 1 self.progress_bar.update(self.__count)
class NameValueList(UIItem): """ A NameValueList is a list of name and value pairs. This is commonly used in the settings screen where the user has a list of items and can edit them at any point in time. This is just a generic UI element to keep all of the data and logic within the game subsystem """ def __init__(self, items=[], lines_to_show=5): # items is a tuple consisting of (text name of item, selection values, current selection) self._items = [] self._lines_to_show = lines_to_show self.__menuContainer = DirectFrame( #text_pos=(0,1), pos=(-0.6, 0, 0.3), text_scale=1.5, text_align=TextNode.ALeft, text_fg=(0, 0, 0, 0), relief=DGG.FLAT, frameColor=(1, 1, 1, 0), #left,right,bottom,top frameSize=(-0.5, 0.5, -0.5, 0.5)) self.__menuContainer.hide() self.selectedItem = 0 self.editing = False self.blink = False self.blinkTask = None for item in items: self.addItem(item[0], item[1], item[2]) def setPos(self, x, y, z): self.__menuContainer.setPos(x, y, z) def addItem(self, text_name, selection_values, current_selection_idx=-1): """ Adds an item to the list display. text_name - The string representation of the list item selection_values - A list of available values for selection in this field current_selection - The currently selected item """ pos_name = Vec3(-0.47, 0, 0.4 - (len(self._items) * 0.15)) pos_value = Vec3(1.0, 0, 0.4 - (len(self._items) * 0.15)) length = len(self._items) selection_text = "" if current_selection_idx != -1: selection_text = str(selection_values[current_selection_idx]) name_display = DirectButton( text=text_name, command=None, extraArgs=[len(self._items)], text_align=TextNode.ALeft, scale=0.1, #left/right, forward/back, up/down pos=pos_name, text_fg=(1, 1, 1, 1), rolloverSound=None, clickSound=None, pressEffect=0, relief=None, textMayChange=True #text_font=base.fontLoader.load('Arial Bold.ttf') ) name_display.reparentTo(self.__menuContainer) value_display = DirectButton( text=str(selection_text), command=None, extraArgs=[len(self._items)], text_align=TextNode.ALeft, scale=0.1, #left/right, forward/back, up/down pos=pos_value, text_fg=(1, 1, 1, 1), rolloverSound=None, clickSound=None, pressEffect=0, relief=None, textMayChange=True #text_font=base.fontLoader.load('Arial Bold.ttf') ) value_display.reparentTo(self.__menuContainer) v = {} v['name'] = text_name v['name_display'] = name_display v['value_display'] = value_display v['selection_values'] = selection_values v['current_selection_idx'] = current_selection_idx self._items.append(v) def up(self): """Move one item up in the menu.""" if self.editing: current_item = self._items[self.selectedItem] current_item['current_selection_idx'] = ( current_item['current_selection_idx'] + 1) % len( current_item['selection_values']) current_item['value_display']['text'] = current_item[ 'selection_values'][current_item['current_selection_idx']] else: newItem = self.selectedItem - 1 if (newItem < 0): newItem = len(self._items) - 1 self.select(newItem) UIItem.up(self) def down(self): """Move one item down in the menu.""" if self.editing: current_item = self._items[self.selectedItem] current_item['current_selection_idx'] = ( current_item['current_selection_idx'] - 1) % len( current_item['selection_values']) current_item['value_display']['text'] = current_item[ 'selection_values'][current_item['current_selection_idx']] else: newItem = self.selectedItem + 1 if (newItem >= len(self._items)): newItem = 0 self.select(newItem) UIItem.down(self) def show(self): if (self.__menuContainer.isHidden()): Sequence( Func(self.__menuContainer.setAlphaScale, 0.0), Func(self.__menuContainer.show), LerpFunctionInterval(self.__menuContainer.setAlphaScale, toData=1.0, fromData=0.0, duration=1.0)).start() def hide(self): self.ignoreAll() if (not self.__menuContainer.isHidden()): Sequence( LerpFunctionInterval(self.__menuContainer.setAlphaScale, toData=0.0, fromData=1.0, duration=1.0), Func(self.__menuContainer.hide), Func(self.__menuContainer.setAlphaScale, 1.0)).start() def setParent(self, parent): self.__menuContainer.reparentTo(parent) def select(self, item): self._items[self.selectedItem]['name_display']['text_fg'] = (1, 1, 1, 1) self._items[self.selectedItem]['name_display']['text_bg'] = (0, 0, 0, 0) self._items[self.selectedItem]['value_display']['text_fg'] = (1, 1, 1, 1) self._items[self.selectedItem]['value_display']['text_bg'] = (0, 0, 0, 0) self.selectedItem = item self._items[self.selectedItem]['name_display']['text_fg'] = (0, 0, 0.5, 1) self._items[self.selectedItem]['name_display']['text_bg'] = (1, 1, 1, 1) self._items[self.selectedItem]['value_display']['text_fg'] = (0, 0, 0.5, 1) self._items[self.selectedItem]['value_display']['text_bg'] = (1, 1, 1, 1) def toggleEdit(self): self.editing = not self.editing if self.editing: # Start blinking self.blinkTask = base.taskMgr.doMethodLater( 0.4, self._doBlink, 'nvBlinkTask') else: # Stop blinking if self.blinkTask != None: base.taskMgr.remove(self.blinkTask) def _doBlink(self, task): self.blink = not self.blink if self.blink: self._items[self.selectedItem]['value_display']['text_fg'] = (0, 0, 0, 1) self._items[self.selectedItem]['value_display']['text_bg'] = (1, 1, 1, 1) else: self._items[self.selectedItem]['value_display']['text_fg'] = (1, 1, 1, 1) self._items[self.selectedItem]['value_display']['text_bg'] = (0, 0, 0, 0) return Task.again
class ItemChooser(metaclass=abc.ABCMeta): """The base class for choose-one-of widgets. Args: is_shadowed (bool): Optional. If True, a shadowed font color will be used for this widget. """ def __init__(self, is_shadowed=False): font = (0, 0, 0, 0.3 if is_shadowed else 0) self._ind = 0 self._items = None self._chosen_item = None self._fr = DirectFrame(frameSize=(-0.11, 0.12, -0.025, 0.024), frameColor=font) self._name = DirectLabel( parent=self._fr, frameColor=(0, 0, 0, 0.3), text_fg=SILVER_COL, text_font=base.main_font, # noqa: F821 text="", text_scale=0.03, pos=(0, 0, -0.01), ) but_params = { "parent": self._fr, "text_fg": SILVER_COL, "frameColor": font, "scale": (0.075, 0, 0.075), } DirectButton(pos=(0.15, 0, -0.015), text=">", command=self._next, **but_params) DirectButton(pos=(-0.15, 0, -0.015), text="<", command=self._prev, **but_params) self._fr.hide() @abc.abstractmethod def _show_info(self): """Show the chosen item info.""" raise NotImplementedError("Chooser class must have _show_info() method.") @property def chosen_item(self): """The item chosen with this widget. Returns: object: The chosen object. """ return self._chosen_item def _next(self): """Choose the next item from the list.""" self._ind += 1 self._show_info() def _prev(self): """Choose the previous item from the list.""" self._ind -= 1 self._show_info() def destroy(self): """Clear this widget.""" self._fr.destroy() self._ind = 0 self._chosen_item = None self._items = None def prepare(self, parent, pos, items, init_ind=None): """Set this widget's parent and position. Args: parent (panda3d.core.NodePath): Parent widget. pos (tuple): New widget position. items (dict): Items to iterate through. init_ind (int): Index of the initial value. """ self._items = items self._fr.reparentTo(parent) self._fr.setPos(pos) self._fr.show() if init_ind is not None: self._ind = init_ind self._show_info()
class GUI: def __init__(self, mainClass): self.unitFrame = DirectFrame(frameColor=(0, 0, 0, 0.5), frameSize=(-0.25, 0.25, -1, 1), pos=(0.8, 0, 0)) self.unitFrame.reparentTo(render2d) self.unitFrame.hide() self.wallFrame = DirectFrame(frameColor=(0, 0, 0, 0.5), frameSize=(-0.25, 0.25, -1, 1), pos=(0.8, 0, 0)) self.wallFrame.reparentTo(render2d) # self.wallFrame.hide() # self.drillWall = DirectButton(text = ('drill wall'), scale = 0.1, command = mainClass.cameraClass.mineWall, extraArgs = [mainClass]) # self.drillWall.reparentTo(self.wallFrame) # self.drillWall.setPos(0,0,0.9) self.drillWall = DirectButton(text='Hi', scale=0.1, command=self.queueMine, extraArgs=[mainClass]) # self.drillWall.reparentTo(self.wallFrame) self.drillWall.setPos(0, 0, 0.5) self.drillWall.hide() def hi(self): print 'HIII' def showWall(self, wall, mainClass): if (wall.selectable == True): self.hideUIs() self.drillWall.show() # if (wall.dig != None): # self. # uButton1 = DirectButton(text = ('need'), scale = 0.1) # uButton1.reparentTo(self.unitFrame) # uButton1.setPos(0,0,0.9) # # uButton2 = DirectButton(text = ('to'), scale = 0.1) # uButton2.reparentTo(self.unitFrame) # uButton2.setPos(0,0,0.7) # # uButton3 = DirectButton(text = ('finish'), scale = 0.1) # uButton3.reparentTo(self.unitFrame) # uButton3.setPos(0,0,0.5) # # uButton4 = DirectButton(text = ('GUI'), scale = 0.1) # uButton4.reparentTo(self.unitFrame) # uButton4.setPos(0,0,0.3) def unitGUI(self, mainClass, unitnumber): self.hideUIs() self.unitFrame.show() # if (mainClass.parserClass.unit def wallGUI(self, mainClass, wallPos): pass # self.unitFrame.hide() # self.wallFrame.show() # if (mainClass.mapLoaderClass.tileArray[wallPos[1]][wallPos[0]].drillTime != None): # self.drillWall.show() def hideUIs(self): self.unitFrame.hide() def queueMine(self, mainClass): # mainClass.cameraClass.clearSelection(mainClass) mainClass.priorities.queueMine(mainClass.mouseClass.tileSelected)
class CraftInventory(DirectObject): def __init__(self): self.itemFrame = DirectScrolledFrame( text="Inventory", text_scale=0.25, text_pos=(0, 0.75, 0), text_bg=(1, 1, 1, 1), # make the frame occupy the whole window frameSize=(-0.6, 0.6, -0.8, 0.8), pos=(-0.7, 0, 0), # make the canvas as big as the frame canvasSize=(-0.6, 0.6, -0.8, 0.8), # set the frames color to white frameColor=(1, 1, 1, 1)) self.itemList = [] self.craftFrame = DirectFrame( text="Crafting", text_scale=0.25, text_pos=(0, 0.75, 0), text_bg=(1, 1, 1, 1), # make the frame occupy the whole window frameSize=(-0.6, 0.6, -0.8, 0.8), pos=(0.7, 0, 0), # set the frames color to white frameColor=(1, 1, 1, 1)) self.craftDrop = DirectFrame(text="drop ore", text_scale=0.1, pos=(0, 0.4, 0), frameSize=(-0.25, 0.25, -0.25, 0.25), frameColor=(1, 0, 0, 1)) self.craftDrop.reparentTo(self.craftFrame) def show(self): self.itemFrame.show() self.craftFrame.show() def hide(self): self.itemFrame.hide() self.craftFrame.hide() def __makeItem(self, item): obj = DirectLabel( text=str(item.giveLoot()) + "x " + item.giveType(), text_scale=0.5, text_pos=(0, -1, 0), image=("item.png", "item_hover.png", "item.png"), #normal, hover, disabled scale=0.16, numStates=2, state=DGG.NORMAL, relief=DGG.GROOVE) obj.setTransparency(True) obj["activeState"] = 0 obj.reparentTo(self.itemFrame.getCanvas()) obj.bind(DGG.B1PRESS, self.dragStart, [obj]) obj.bind(DGG.B1RELEASE, self.dragStop) obj.bind(DGG.ENTER, self.inObject, [obj]) obj.bind(DGG.EXIT, self.outObject, [obj]) return obj def updateList(self, items): for item in self.itemList: item.destroy() i = 1 j = 0 pad = 0.2 numItemsPerRow = 2 itemWidth = 0.32 itemHeight = 0.32 #left = -(itemWidth * (numItemsPerRow/2.0)) - 0.16 left = self.itemFrame.getX() # + (itemWidth + 0.16) xStep = itemWidth + 0.13 yStep = -(itemHeight + 0.13) top = 0.8 - (0.16 + pad) for item in items: self.itemList.append(self.__makeItem(item)) x = left + i * xStep y = top + j * yStep self.itemList[-1].setPos(x, 0.0, y) if i == numItemsPerRow: i = 0 j += 1 i += 1 if i == 1: j -= 1 height = ((j) * -yStep) - 0.16 # resize the canvas. This will make the scrollbars dis-/appear, # dependent on if the canvas is bigger than the frame size. self.itemFrame["canvasSize"] = (-0.6, 0.6, -height, 0.8) def inObject(self, element, event): # Can be used to highlight objects element["activeState"] = 1 element.setActiveState() #print "over object" def outObject(self, element, event): # Can be used to unhighlight objects #element["state"] = 0 element["activeState"] = 0 element.setActiveState() def dragStart(self, element, event): print "start drag" taskMgr.remove('dragDropTask') vWidget2render2d = element.getPos(render2d) vMouse2render2d = Point3(event.getMouse()[0], 0, event.getMouse()[1]) editVec = Vec3(vWidget2render2d - vMouse2render2d) t = taskMgr.add(self.dragTask, 'dragDropTask') element.reparentTo(aspect2d) t.element = element t.editVec = editVec t.elementStartPos = element.getPos() def dragTask(self, state): mwn = base.mouseWatcherNode if mwn.hasMouse(): vMouse2render2d = Point3(mwn.getMouse()[0], 0, mwn.getMouse()[1]) newPos = vMouse2render2d + state.editVec state.element.setPos(render2d, newPos) return Task.cont def dragStop(self, event): print "stop drag with:", event isInArea = False t = taskMgr.getTasksNamed('dragDropTask')[0] #for dropArea in self.dropAreas: # if self.isInBounds(event.getMouse(), dropArea["frameSize"], dropArea.getPos(render)): # print "inside Area:", dropArea["text"], dropArea.getPos(render) # isInArea = True # t.element.setPos(dropArea.getPos(render)) # t.element.setX(t.element.getX() * self.ratio) # #t.element.setX(t.element.getX() - t.element.getWidth() / 2.0) # break if not isInArea: t.element.setPos(t.elementStartPos) t.element.reparentTo(self.itemFrame.getCanvas()) taskMgr.remove('dragDropTask') def isInBounds(self, location, bounds, posShift=None): x = 0 if posShift is None else posShift.getX() y = 0 if posShift is None else posShift.getZ() left = x + bounds[0] right = x + bounds[1] bottom = y + bounds[2] top = y + bounds[3] # are we outside of the bounding box from the left if location[0] < left: return False # are we outside of the bounding box from the right if location[0] > right: return False # are we outside of the bounding box from the bottom if location[1] < bottom: return False # are we outside of the bounding box from the top if location[1] > top: return False # the location is inside the bbox return True
class Optionsmenu(): def __init__(self): self.frameMain = DirectFrame( image="gui/MenuBackground.png", image_scale=(1.7778, 1, 1), #image_pos=(0, 0, 0.25), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.frameMain.setTransparency(True) self.logo = DirectFrame( image="Logo.png", image_scale=0.25, image_pos=(0, 0, 0.55), frameSize=( base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor=(0,0,0,0)) self.logo.reparentTo(self.frameMain) btnGeom = "gui/button" self.btnBack = menuHelper.createButton(_("Back"), btnGeom, 0, -0.7, ["options_back"]) self.btnBack.reparentTo(self.frameMain) volume = base.musicManager.getVolume() self.sliderVolume = DirectSlider( scale=0.5, pos=(-0.5, 0, 0), range=(0, 1), scrollSize=0.01, text=_("Volume %d%%") % volume*100, text_scale=0.1, text_pos=(0, 0.15), text_fg=(1, 1, 1, 1), thumb_frameColor=(0,0.75, 0.25, 1), frameColor=(0.35, 0.15, 0.05, 1), value=volume, command=self.sliderVolume_ValueChanged) self.sliderVolume.reparentTo(self.frameMain) isChecked = not base.AppHasAudioFocus img = None imgON = "gui/AudioSwitch_on.png" imgOFF = "gui/AudioSwitch_off.png" if base.AppHasAudioFocus: img = imgON else: img = imgOFF self.cbVolumeMute = DirectCheckBox( text=_("Mute Audio"), text_scale=0.5, text_align=TextNode.ACenter, text_pos=(0, 0.65), text_fg=(1, 1, 1, 1), scale=0.105, pos=(0.5, 0, 0), command=self.cbVolumeMute_CheckedChanged, relief=None, pressEffect=False, isChecked=isChecked, image=img, image_scale=0.5, checkedImage=imgOFF, uncheckedImage=imgON) self.cbVolumeMute.setTransparency(True) self.cbVolumeMute.setImage() self.cbVolumeMute.reparentTo(self.frameMain) prcPath = os.path.join(basedir, "%s.prc"%appName) self.advancedOptions = DirectLabel( text=_("Advanced options can be made in the following text file\n%s")%prcPath, text_scale=0.5, text_fg=(1, 1, 1, 1), scale=0.1, pos=(0, 0, -0.25), frameColor=(0, 0, 0, 0)) self.advancedOptions.setTransparency(True) self.advancedOptions.reparentTo(self.frameMain) self.hide() def show(self): self.frameMain.show() def hide(self): self.frameMain.hide() def cbVolumeMute_CheckedChanged(self, checked): if checked: base.disableAllAudio() else: base.enableAllAudio() def sliderVolume_ValueChanged(self): volume = round(self.sliderVolume["value"], 2) self.sliderVolume["text"] = _("Volume %d%%") % int(volume * 100) base.sfxManagerList[0].setVolume(volume) base.musicManager.setVolume(volume)
class Transitions: # These may be reassigned before the fade or iris transitions are # actually invoked to change the models that will be used. IrisModelName = "models/misc/iris" FadeModelName = "models/misc/fade" def __init__(self, loader, model=None, scale=3.0, pos=Vec3(0, 0, 0)): self.transitionIval = None self.letterboxIval = None self.iris = None self.fade = None self.letterbox = None self.fadeModel = model self.imagePos = pos if model: self.alphaOff = Vec4(1, 1, 1, 0) self.alphaOn = Vec4(1, 1, 1, 1) model.setTransparency(1) self.lerpFunc = LerpColorScaleInterval else: self.alphaOff = Vec4(0, 0, 0, 0) self.alphaOn = Vec4(0, 0, 0, 1) self.lerpFunc = LerpColorInterval self.irisTaskName = "irisTask" self.fadeTaskName = "fadeTask" self.letterboxTaskName = "letterboxTask" def __del__(self): if self.fadeModel: self.fadeModel.removeNode() self.fadeModel = None ################################################## # Fade ################################################## # We can set a custom model for the fade before using it for the first time def setFadeModel(self, model, scale=1.0): self.fadeModel = model # We have to change some default parameters for a custom fadeModel self.alphaOn = Vec4(1, 1, 1, 1) # Reload fade if its already been created if self.fade: self.fade.destroy() self.fade = None self.loadFade() def loadFade(self): if self.fade is None: # We create a DirectFrame for the fade polygon, instead of # simply loading the polygon model and using it directly, # so that it will also obscure mouse events for objects # positioned behind it. self.fade = DirectFrame( parent=hidden, guiId='fade', relief=None, image=self.fadeModel, image_scale=(4, 2, 2), state=DGG.NORMAL, ) if not self.fadeModel: # No fade model was given, so we make this the fade model. self.fade["relief"] = DGG.FLAT self.fade["frameSize"] = (-2, 2, -1, 1) self.fade["frameColor"] = (0, 0, 0, 1) self.fade.setTransparency(TransparencyAttrib.MAlpha) self.fade.setBin('unsorted', 0) self.fade.setColor(0, 0, 0, 0) def getFadeInIval(self, t=0.5, finishIval=None): """ Returns an interval without starting it. This is particularly useful in cutscenes, so when the cutsceneIval is escaped out of we can finish the fade immediately """ #self.noTransitions() masad: this creates a one frame pop, is it necessary? self.loadFade() transitionIval = Sequence( Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX), Func(self.fade.showThrough ), # in case aspect2d is hidden for some reason self.lerpFunc( self.fade, t, self.alphaOff, # self.alphaOn, ), Func(self.fade.detachNode), name=self.fadeTaskName, ) if finishIval: transitionIval.append(finishIval) return transitionIval def getFadeOutIval(self, t=0.5, finishIval=None): """ Create a sequence that lerps the color out, then parents the fade to hidden """ self.noTransitions() self.loadFade() transitionIval = Sequence( Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX), Func(self.fade.showThrough ), # in case aspect2d is hidden for some reason self.lerpFunc( self.fade, t, self.alphaOn, # self.alphaOff, ), name=self.fadeTaskName, ) if finishIval: transitionIval.append(finishIval) return transitionIval def fadeIn(self, t=0.5, finishIval=None): """ Play a fade in transition over t seconds. Places a polygon on the aspect2d plane then lerps the color from black to transparent. When the color lerp is finished, it parents the fade polygon to hidden. """ gsg = base.win.getGsg() if gsg: # If we're about to fade in from black, go ahead and # preload all the textures etc. base.graphicsEngine.renderFrame() render.prepareScene(gsg) render2d.prepareScene(gsg) if (t == 0): # Fade in immediately with no lerp #print "transitiosn: fadeIn 0.0" self.noTransitions() self.loadFade() self.fade.detachNode() else: # Create a sequence that lerps the color out, then # parents the fade to hidden self.transitionIval = self.getFadeInIval(t, finishIval) self.transitionIval.start() def fadeOut(self, t=0.5, finishIval=None): """ Play a fade out transition over t seconds. Places a polygon on the aspect2d plane then lerps the color from transparent to full black. When the color lerp is finished, it leaves the fade polygon covering the aspect2d plane until you fadeIn or call noFade. lerp """ if (t == 0): # Fade out immediately with no lerp self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn) elif ConfigVariableBool('no-loading-screen', False): if finishIval: self.transitionIval = finishIval self.transitionIval.start() else: # Create a sequence that lerps the color out, then # parents the fade to hidden self.transitionIval = self.getFadeOutIval(t, finishIval) self.transitionIval.start() def fadeOutActive(self): return self.fade and self.fade.getColor()[3] > 0 def fadeScreen(self, alpha=0.5): """ Put a semitransparent screen over the camera plane to darken out the world. Useful for drawing attention to a dialog box for instance """ #print "transitiosn: fadeScreen" self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn[0], self.alphaOn[1], self.alphaOn[2], alpha) def fadeScreenColor(self, color): """ Put a semitransparent screen over the camera plane to darken out the world. Useful for drawing attention to a dialog box for instance """ #print "transitiosn: fadeScreenColor" self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(color) def noFade(self): """ Removes any current fade tasks and parents the fade polygon away """ #print "transitiosn: noFade" if self.transitionIval: self.transitionIval.pause() self.transitionIval = None if self.fade: # Make sure to reset the color, since fadeOutActive() is looking at it self.fade.setColor(self.alphaOff) self.fade.detachNode() def setFadeColor(self, r, g, b): self.alphaOn.set(r, g, b, 1) self.alphaOff.set(r, g, b, 0) ################################################## # Iris ################################################## def loadIris(self): if self.iris == None: self.iris = loader.loadModel(self.IrisModelName) self.iris.setPos(0, 0, 0) def irisIn(self, t=0.5, finishIval=None): """ Play an iris in transition over t seconds. Places a polygon on the aspect2d plane then lerps the scale of the iris polygon up so it looks like we iris in. When the scale lerp is finished, it parents the iris polygon to hidden. """ self.noTransitions() self.loadIris() if (t == 0): self.iris.detachNode() else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.transitionIval = Sequence( LerpScaleInterval(self.iris, t, scale=0.18, startScale=0.01), Func(self.iris.detachNode), name=self.irisTaskName, ) if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() def irisOut(self, t=0.5, finishIval=None): """ Play an iris out transition over t seconds. Places a polygon on the aspect2d plane then lerps the scale of the iris down so it looks like we iris out. When the scale lerp is finished, it leaves the iris polygon covering the aspect2d plane until you irisIn or call noIris. """ self.noTransitions() self.loadIris() self.loadFade() # we need this to cover up the hole. if (t == 0): self.iris.detachNode() self.fadeOut(0) else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.transitionIval = Sequence( LerpScaleInterval(self.iris, t, scale=0.01, startScale=0.18), Func(self.iris.detachNode), # Use the fade to cover up the hole that the iris would leave Func(self.fadeOut, 0), name=self.irisTaskName, ) if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() def noIris(self): """ Removes any current iris tasks and parents the iris polygon away """ if self.transitionIval: self.transitionIval.pause() self.transitionIval = None if self.iris != None: self.iris.detachNode() # Actually we need to remove the fade too, # because the iris effect uses it. self.noFade() def noTransitions(self): """ This call should immediately remove any and all transitions running """ self.noFade() self.noIris() # Letterbox is not really a transition, it is a screen overlay # self.noLetterbox() ################################################## # Letterbox ################################################## def loadLetterbox(self): if not self.letterbox: # We create a DirectFrame for the fade polygon, instead of # simply loading the polygon model and using it directly, # so that it will also obscure mouse events for objects # positioned behind it. self.letterbox = NodePath("letterbox") # Allow fade in and out of the bars self.letterbox.setTransparency(1) # Allow DirectLabels to be parented to the letterbox sensibly self.letterbox.setBin('unsorted', 0) # Allow a custom look to the letterbox graphic. # TODO: This model isn't available everywhere. We should # pass it in as a parameter. button = loader.loadModel('models/gui/toplevel_gui', okMissing=True) barImage = None if button: barImage = button.find('**/generic_button') self.letterboxTop = DirectFrame( parent=self.letterbox, guiId='letterboxTop', relief=DGG.FLAT, state=DGG.NORMAL, frameColor=(0, 0, 0, 1), borderWidth=(0, 0), frameSize=(-1, 1, 0, 0.2), pos=(0, 0, 0.8), image=barImage, image_scale=(2.25, 1, .5), image_pos=(0, 0, .1), image_color=(0.3, 0.3, 0.3, 1), sortOrder=0, ) self.letterboxBottom = DirectFrame( parent=self.letterbox, guiId='letterboxBottom', relief=DGG.FLAT, state=DGG.NORMAL, frameColor=(0, 0, 0, 1), borderWidth=(0, 0), frameSize=(-1, 1, 0, 0.2), pos=(0, 0, -1), image=barImage, image_scale=(2.25, 1, .5), image_pos=(0, 0, .1), image_color=(0.3, 0.3, 0.3, 1), sortOrder=0, ) # masad: always place these at the bottom of render self.letterboxTop.setBin('sorted', 0) self.letterboxBottom.setBin('sorted', 0) self.letterbox.reparentTo(render2d, -1) self.letterboxOff(0) def noLetterbox(self): """ Removes any current letterbox tasks and parents the letterbox polygon away """ if self.letterboxIval: self.letterboxIval.pause() self.letterboxIval = None if self.letterbox: self.letterbox.stash() def letterboxOn(self, t=0.25, finishIval=None): """ Move black bars in over t seconds. """ self.noLetterbox() self.loadLetterbox() self.letterbox.unstash() if (t == 0): self.letterboxBottom.setPos(0, 0, -1) self.letterboxTop.setPos(0, 0, 0.8) else: self.letterboxIval = Sequence( Parallel( LerpPosInterval( self.letterboxBottom, t, pos=Vec3(0, 0, -1), #startPos = Vec3(0, 0, -1.2), ), LerpPosInterval( self.letterboxTop, t, pos=Vec3(0, 0, 0.8), # startPos = Vec3(0, 0, 1), ), ), name=self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start() def letterboxOff(self, t=0.25, finishIval=None): """ Move black bars away over t seconds. """ self.noLetterbox() self.loadLetterbox() self.letterbox.unstash() if (t == 0): self.letterbox.stash() else: self.letterboxIval = Sequence( Parallel( LerpPosInterval( self.letterboxBottom, t, pos=Vec3(0, 0, -1.2), # startPos = Vec3(0, 0, -1), ), LerpPosInterval( self.letterboxTop, t, pos=Vec3(0, 0, 1), # startPos = Vec3(0, 0, 0.8), ), ), Func(self.letterbox.stash), Func(messenger.send, 'letterboxOff'), name=self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start()
class Hud(DirectObject): def __init__(self): self.frameCharStatus = DirectFrame( # size of the frame frameSize = (0, .8, -.20, 0), # bg color Transparent frameColor = (0, 0, 0, 0)) self.frameCharStatus.reparentTo(base.a2dTopLeft) self.statusHealth = OnscreenImage( image = "HUD_Life100.png", scale = (0.1, 1, 0.1), pos = (0.085, 0, -0.085)) self.statusHealth.setTransparency(True) self.statusHealth.reparentTo(self.frameCharStatus) self.statusWeapon = OnscreenImage( image = "WeaponMG.png", scale = (0.1, 1, 0.1), pos = (0.285, 0, -0.085)) self.statusWeapon.setTransparency(True) self.statusWeapon.reparentTo(self.frameCharStatus) self.highscore = DirectLabel( text = "0", text_fg = (0,0,0,1), text_align = TextNode.ALeft, frameColor = (0,0,0,0), pos = (0.4,0,-0.12), scale = 0.15) self.highscore.setTransparency(True) self.highscore.reparentTo(self.frameCharStatus) def show(self): self.frameCharStatus.show() self.accept("setHighscore", self.setHighscore) self.accept("setHealth", self.setHealth) def hide(self): self.frameCharStatus.hide() self.ignore("setHighscore") self.ignore("setHealth") def setHighscore(self, score): self.highscore["text"] = str(score) def setHealth(self, hp): if hp > 75.0: self.statusHealth.setImage("HUD_Life100.png") elif hp > 50.0: self.statusHealth.setImage("HUD_Life75.png") elif hp > 25.0: self.statusHealth.setImage("HUD_Life50.png") elif hp > 0: self.statusHealth.setImage("HUD_Life25.png") else: print "Your dead!" self.statusHealth.setImage("HUD_Life0.png") self.statusHealth.setTransparency(True) def setWeapon(self, weaponType): if weaponType == "Pistol": self.statusWeapon.setImage("WeaponPistol.png") else: self.statusWeapon.setImage("WeaponMG.png") self.statusWeapon.setTransparency(True)
class GUI: def __init__(self, mainClass): self.unitFrame = DirectFrame(frameColor = (0,0,0,0.5), frameSize = (-0.25, 0.25, -1, 1), pos = (0.8, 0, 0)) self.unitFrame.reparentTo(render2d) self.unitFrame.hide() self.wallFrame = DirectFrame(frameColor = (0,0,0,0.5), frameSize = (-0.25, 0.25, -1, 1), pos = (0.8, 0, 0)) self.wallFrame.reparentTo(render2d) # self.wallFrame.hide() # self.drillWall = DirectButton(text = ('drill wall'), scale = 0.1, command = mainClass.cameraClass.mineWall, extraArgs = [mainClass]) # self.drillWall.reparentTo(self.wallFrame) # self.drillWall.setPos(0,0,0.9) self.drillWall = DirectButton(text = 'Hi', scale = 0.1, command = self.queueMine, extraArgs = [mainClass]) # self.drillWall.reparentTo(self.wallFrame) self.drillWall.setPos(0,0,0.5) self.drillWall.hide() def hi(self): print 'HIII' def showWall(self, wall, mainClass): if (wall.selectable == True): self.hideUIs() self.drillWall.show() # if (wall.dig != None): # self. # uButton1 = DirectButton(text = ('need'), scale = 0.1) # uButton1.reparentTo(self.unitFrame) # uButton1.setPos(0,0,0.9) # # uButton2 = DirectButton(text = ('to'), scale = 0.1) # uButton2.reparentTo(self.unitFrame) # uButton2.setPos(0,0,0.7) # # uButton3 = DirectButton(text = ('finish'), scale = 0.1) # uButton3.reparentTo(self.unitFrame) # uButton3.setPos(0,0,0.5) # # uButton4 = DirectButton(text = ('GUI'), scale = 0.1) # uButton4.reparentTo(self.unitFrame) # uButton4.setPos(0,0,0.3) def unitGUI(self, mainClass, unitnumber): self.hideUIs() self.unitFrame.show() # if (mainClass.parserClass.unit def wallGUI(self, mainClass, wallPos): pass # self.unitFrame.hide() # self.wallFrame.show() # if (mainClass.mapLoaderClass.tileArray[wallPos[1]][wallPos[0]].drillTime != None): # self.drillWall.show() def hideUIs(self): self.unitFrame.hide() def queueMine(self, mainClass): # mainClass.cameraClass.clearSelection(mainClass) mainClass.priorities.queueMine(mainClass.mouseClass.tileSelected)
class ConfigMenu(IMenu): def __init__(self): frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 0, 0, 0.5)) IMenu.__init__(self, frame=frame) self.menuVerticalChoicesList = [{ "event": "*", "text": "Text Display Time" }, { "event": "*", "text": "Sound Effects Volume Level" }, { "event": "*", "text": "Music Volume Level" }, { "event": "*", "text": "Controls" }, { "event": "Back-Game", "text": "Resume Game" }, { "event": "Back-Start", "text": "Back to Start Menu" }] self.menuHorizontalChoices = [{ "event": "Chara-Sub", "text": "*" }, { "event": "Chara-Add", "text": "*" }] self.statsSheet = None self.createVerticalButtons() self.addTitle() self.config_stats() def createButton(self, text, index, eventArgs): btn = DirectRadioButton(text=text, text_align=TextNode.ALeft, scale=0.05, frameColor=(0, 0, 0, 0.0), pos=(base.a2dLeft + 0.7, 0, (0.5 - (index * .15))), variable=self.menuVerticalChoice, value=[index], text_fg=(1, 1, 1, 1), command=self.menuVerticalEvent) self.menuVerticalButtons.append(btn) btn.reparentTo(self.frameMain) def addTitle(self): self.title = OnscreenText('Configurations', 1, fg=(1, 0, 0, 1), pos=(base.a2dLeft + 0.7, 0.8), font=base.font_title, align=TextNode.ALeft, scale=.15, mayChange=1) self.title.reparentTo(self.frameMain) def cancelCommand(self): base.messenger.send("Back-Game") def change_config(self, value): index = self.menuVerticalChoice[0] stats = [ self.change_text_display_time, self.change_sfx_vol, self.change_bgm_vol, ] if index < len(stats): stats[index](value) self.config_stats() def change_text_display_time(self, value): payload = base.gameData.textDisplayTime + (value * 0.5) payload = max(payload, 0.5) payload = min(payload, 10.0) base.gameData.textDisplayTime = payload # send update by event later def change_bgm_vol(self, value): payload = base.gameData.bgm_vol + (value * 0.1) payload = max(payload, 0.0) payload = min(payload, 1.0) base.gameData.bgm_vol = payload # send update by event later def change_sfx_vol(self, value): payload = base.gameData.sfx_vol + (value * 0.1) payload = max(payload, 0.0) payload = min(payload, 1.0) base.gameData.sfx_vol = payload # send update by event later def config_stats(self): if self.statsSheet: self.statsSheet.detachNode() self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 1, 0, 0)) stats = [ '{} seconds'.format(base.gameData.textDisplayTime), '{} %'.format(int(base.gameData.sfx_vol * 100)), '{} %'.format(int(base.gameData.bgm_vol * 100)), ] self.add_controls(stats) i = 0 for stat in stats: self.add_stat(stat, i) i += 1 self.statsSheet.reparentTo(self.frameMain) def add_controls(self, arr): output = '' for ctrl in base.controlList: if ctrl[3] != base.control_type or not ctrl[4]: continue output += '{} - {}\n'.format(ctrl[2][0], ctrl[4]) arr.append(output) def add_stat(self, text, index): stat = DirectLabel(scale=0.05, text_align=TextNode.ALeft, pos=(0, 0, (0.5 - (index * .15))), pad=(0.5, 0.5), frameColor=(0, 0, 0, 0.0), text=text, text_fg=(1, 1, 1, 1)) stat.reparentTo(self.statsSheet) def readKeys(self, task): keysPressed = sum(base.directionMap.values()) if keysPressed == 0: self.isButtonUp = True if base.commandMap["confirm"]: self.menuVerticalEvent() base.messenger.send("playConfirm") elif base.commandMap["cancel"]: self.cancelCommand() base.messenger.send("playCancel") base.resetButtons() return task.cont if not self.isButtonUp: return task.cont if base.directionMap["up"]: self.navigateChoice(-1, self.menuVerticalChoice, self.menuVerticalChoicesList) self.isButtonUp = False elif base.directionMap["down"]: self.navigateChoice(1, self.menuVerticalChoice, self.menuVerticalChoicesList) self.isButtonUp = False elif base.directionMap["left"]: self.menuHorizontalChoice[0] = 0 self.isButtonUp = False self.menuHorizontalEvent() elif base.directionMap["right"]: self.menuHorizontalChoice[0] = 1 self.isButtonUp = False self.menuHorizontalEvent() base.resetButtons() return task.cont
class ToonPanel(DirectFrame): notify = directNotify.newCategory('ToonPanel') animal2HeadData = {'dog': (0.125, 0.04), 'duck': (0.1, 0.025), 'cat': (0.115, 0.04), 'rabbit': (0.115, 0.04), 'horse': (0.115, 0.06), 'monkey': (0.115, 0.06), 'pig': (0.115, 0.07), 'mouse': (0.09, 0.02), 'bear': (0.125, 0.05)} State2Text = {'status': ('Seeing if %s is available...', '%s is busy right now; try again later.'), 'teleport': ('Trying to go to %s...', 'Could not go to %s.'), 'friend': ('Asking %s to be your friend...', '%s said no, thank you.', 'You are now friends with %s!'), 'remove': ('Are you sure you want to remove %s from your friends list?', '%s left your friends list.')} def __init__(self): DirectFrame.__init__(self, scale=1.2) self['image'] = DGG.getDefaultDialogGeom() self['image_hpr'] = (0, 0, -90) self['image_scale'] = (0.62, 0.9, 0.325) self['image_color'] = (1, 1, 0.75, 1) self['image_pos'] = (0, 0, -0.065) self['relief'] = None self.reparentTo(base.a2dTopRight) self.setPos(-0.235, 0.0, -0.325) self.hide() self.head = None self.laffMeter = None self.exitButton = None self.friendButton = None self.teleportButton = None self.nameText = None self.actionFrame = None self.actionFrameText = None self.actionFrameButton = None self.actionFrameButton2 = None self.avatarInfo = None self.action = None self.fsm = ClassicFSM.ClassicFSM('ToonPanel', [State.State('off', self.enterOff, self.exitOff), State.State('waitOnAvatarInfoResponse', self.enterWaitOnAvatarInfoResponse, self.exitWaitOnAvatarInfoResponse, ['panel']), State.State('panel', self.enterPanel, self.exitPanel, ['off'])], 'off', 'off') self.fsm.enterInitialState() self.actionFSM = ClassicFSM.ClassicFSM('ToonPanelActionFSM', [State.State('off', self.enterOff, self.exitOff), State.State('waitOnAvatarStatusResponse', self.enterWaitOnAvatarStatusResponse, self.exitWaitOnAvatarStatusResponse, ['waitOnAvatarTeleportResponse', 'waitOnAvatarFriendListResponse', 'avatarBusy', 'off']), State.State('avatarBusy', self.enterAvatarBusy, self.exitAvatarBusy, ['off']), State.State('waitOnAvatarTeleportResponse', self.enterWaitOnAvatarTeleportResponse, self.exitWaitOnAvatarTeleportResponse, ['unableToTP']), State.State('unableToTP', self.enterUnableToTP, self.exitUnableToTP, ['off']), State.State('waitOnAvatarFriendListResponse', self.enterWaitOnAvatarFriendListResponse, self.exitWaitOnAvatarFriendListResponse, ['fRequestA', 'fRequestR']), State.State('fRequestA', self.enterFriendRequestAccepted, self.exitFriendRequestAccepted, ['off']), State.State('fRequestR', self.enterFriendRequestRejected, self.exitFriendRequestRejected, ['off']), State.State('removeFriendConfirm', self.enterRemoveFriendConfirm, self.exitRemoveFriendConfirm, ['off', 'removedFriend']), State.State('removedFriend', self.enterRemovedFriend, self.exitRemovedFriend, ['off'])], 'off', 'off') self.actionFSM.enterInitialState() return def maybeUpdateFriendButton(self): if self.friendButton: if self.avatarInfo: if self.avatarInfo[0] not in base.localAvatar.friends: self.friendButton['text'] = 'Add Friend' self.friendButton['extraArgs'] = ['waitOnAvatarFriendListResponse'] else: self.friendButton['text'] = 'Remove Friend' self.friendButton['extraArgs'] = ['removeFriendConfirm'] def enterOff(self): pass def exitOff(self): pass def enterUnableToTP(self): pass def exitUnableToTP(self): pass def enterWaitOnAvatarTeleportResponse(self): self.setActionText(self.State2Text['teleport'][0] % self.getAvatarName()) self.makeButtons('Cancel') self.acceptOnce('gotAvatarTeleportResponse', self.handleTeleportResponse) base.cr.friendsManager.d_iWantToTeleportToAvatar(self.avatarInfo[0]) def handleTeleportResponse(self, avatarId, shardId, zoneId): if self.avatarInfo[0] == avatarId: requestStatus = {} whereName = ZoneUtil.getWhereName(zoneId) loaderName = ZoneUtil.getLoaderName(zoneId) requestStatus['zoneId'] = zoneId if base.localAvatar.parentId == shardId: requestStatus['shardId'] = None else: requestStatus['shardId'] = shardId requestStatus['hoodId'] = ZoneUtil.getHoodId(zoneId, 1) requestStatus['where'] = whereName requestStatus['loader'] = loaderName requestStatus['how'] = 'teleportIn' requestStatus['avId'] = avatarId base.cr.playGame.getPlace().fsm.request('teleportOut', [requestStatus]) self.cleanup() return def exitWaitOnAvatarTeleportResponse(self): self.ignore('gotAvatarTeleportResponse') self.clearActionText() self.clearActionButtons() def setActionText(self, text): self.actionFrameText.setText(text) def clearActionText(self): self.actionFrameText.setText('') def makeButtons(self, button1, button2 = None): button2GeomFunc = {'Cancel': CIGlobals.getCancelBtnGeom, 'No': CIGlobals.getCancelBtnGeom, 'Okay': CIGlobals.getOkayBtnGeom, 'Yes': CIGlobals.getOkayBtnGeom} if button1 and not button2: button1Pos = (0, 0, -0.1) elif button1 and button2: button1Pos = (-0.1, 0, -0.1) button2Pos = (0.1, 0, -0.1) if button1: self.actionFrameButton = DirectButton(text=button1, geom=button2GeomFunc[button1](), parent=self.actionFrame, pos=button1Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[1], relief=None, geom_scale=0.75) if button2: self.actionFrameButton2 = DirectButton(text=button2, geom=button2GeomFunc[button2](), parent=self.actionFrame, pos=button2Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[2], relief=None, geom_scale=0.75) return def actionButtonPressed(self, buttonNum): currentState = self.actionFSM.getCurrentState().getName() if buttonNum == 1: if currentState in ('waitOnAvatarStatusResponse', 'waitOnAvatarTeleportResponse', 'waitOnAvatarFriendListResponse', 'avatarBusy', 'unableToTP', 'fRequestA', 'fRequestR', 'removeFriendConfirm', 'removedFriend'): if currentState == 'waitOnAvatarFriendListResponse': base.cr.friendsManager.d_iCancelledFriendRequest(self.avatarInfo[0]) elif currentState == 'removeFriendConfirm': self.actionFSM.request('removedFriend') return self.actionFSM.request('off') self.removeActionPanel() self.action = None elif buttonNum == 2: self.actionFSM.request('off') self.removeActionPanel() self.action = None return def clearActionButtons(self): if self.actionFrameButton2: self.actionFrameButton2.destroy() self.actionFrameButton2 = None if self.actionFrameButton: self.actionFrameButton.destroy() self.actionFrameButton = None return def enterAvatarBusy(self): self.setActionText(self.State2Text['status'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitAvatarBusy(self): self.clearActionText() self.clearActionButtons() def getAvatarName(self): if self.avatarInfo: return self.avatarInfo[1] def enterWaitOnAvatarStatusResponse(self): self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse) base.cr.friendsManager.d_requestAvatarStatus(self.avatarInfo[0]) self.setActionText(self.State2Text['status'][0] % self.getAvatarName()) self.makeButtons('Cancel') def handleAvatarStatusResponse(self, avatarId, status): if avatarId == self.avatarInfo[0]: if status == 1: self.actionFSM.request('avatarBusy') else: self.actionFSM.request(self.action) else: self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse) def exitWaitOnAvatarStatusResponse(self): self.ignore('gotAvatarStatus') self.clearActionText() self.clearActionButtons() def enterWaitOnAvatarFriendListResponse(self): self.acceptOnce('friendRequestAccepted', self.handleFriendRequestAccepted) self.acceptOnce('friendRequestRejected', self.handleFriendRequestRejected) base.cr.friendsManager.d_askAvatarToBeFriends(self.avatarInfo[0]) self.setActionText(self.State2Text['friend'][0] % self.getAvatarName()) self.makeButtons('Cancel') def handleFriendRequestAccepted(self): self.actionFSM.request('fRequestA') def handleFriendRequestRejected(self): self.actionFSM.request('fRequestR') def exitWaitOnAvatarFriendListResponse(self): self.ignore('friendRequestAccepted') self.ignore('friendRequestRejected') self.clearActionText() self.clearActionButtons() def enterFriendRequestAccepted(self): self.setActionText(self.State2Text['friend'][2] % self.getAvatarName()) self.makeButtons('Okay') def exitFriendRequestAccepted(self): self.clearActionText() self.clearActionButtons() def enterFriendRequestRejected(self): self.setActionText(self.State2Text['friend'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitFriendRequestRejected(self): self.clearActionText() self.clearActionButtons() def enterRemoveFriendConfirm(self): self.setActionText(self.State2Text['remove'][0] % self.getAvatarName()) self.makeButtons('Yes', 'No') def exitRemoveFriendConfirm(self): self.clearActionText() self.clearActionButtons() def enterRemovedFriend(self): base.cr.friendsManager.d_iRemovedFriend(self.avatarInfo[0]) self.setActionText(self.State2Text['remove'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitRemovedFriend(self): self.clearActionText() self.clearActionButtons() def makeActionPanel(self): self.actionFrame = DirectFrame(image=DGG.getDefaultDialogGeom(), image_scale=(0.7, 0.5, 0.45), image_color=(1, 1, 0.75, 1), relief=None) self.actionFrame.reparentTo(base.a2dTopRight) self.actionFrame.setPos(-0.815, 0, -0.31) self.actionFrameText = OnscreenText(text='', parent=self.actionFrame, scale=0.05, wordwrap=12, pos=(0, 0.1)) return def removeActionPanel(self): self.clearActionButtons() if self.actionFrameText: self.actionFrameText.destroy() self.actionFrameText = None if self.actionFrame: self.actionFrame.destroy() self.actionFrame = None return def doAction(self, action): self.action = action self.actionFSM.requestFinalState() self.removeActionPanel() self.makeActionPanel() if action != 'removeFriendConfirm': self.actionFSM.request('waitOnAvatarStatusResponse') else: self.actionFSM.request(action) def enterWaitOnAvatarInfoResponse(self): self.label = OnscreenText(text='Retrieving Toon\ndetails...', parent=self, scale=0.04) self.acceptOnce('avatarInfoResponse', self.handleAvatarInfoResponse) base.cr.friendsManager.d_requestAvatarInfo(self.avatarInfo[0]) def handleAvatarInfoResponse(self, name, dna, maxHealth, health): if self.avatarInfo: self.avatarInfo.append(name) self.avatarInfo.append(dna) self.avatarInfo.append(maxHealth) self.avatarInfo.append(health) self.fsm.request('panel') def exitWaitOnAvatarInfoResponse(self): self.label.destroy() del self.label self.ignore('avatarInfoResponse') def makePanel(self, avId): if self.avatarInfo: if self.avatarInfo[0] == avId: return self.cleanup() base.localAvatar.hideFriendButton() self.show() self.avatarInfo = [] self.avatarInfo.append(avId) self.fsm.request('waitOnAvatarInfoResponse') def exitClicked(self): self.cleanup() base.localAvatar.showFriendButton() def cleanup(self): self.actionFSM.requestFinalState() self.fsm.requestFinalState() self.avatarInfo = None return def enterPanel(self): self.nameText = OnscreenText(text=self.avatarInfo[1], parent=self, pos=(0, 0.2), scale=0.035, wordwrap=8) self.nameText.setBin('gui-popup', 60) dna = ToonDNA.ToonDNA() dna.setDNAStrand(self.avatarInfo[2]) self.head = ToonHead.ToonHead(base.cr) self.head.generateHead(dna.gender, dna.animal, dna.head, 1) self.head.setHeadColor(dna.headcolor) self.head.reparentTo(self) self.head.setDepthWrite(1) self.head.setDepthTest(1) self.head.setH(180) self.head.setScale(self.animal2HeadData[dna.animal][0]) self.head.setZ(self.animal2HeadData[dna.animal][1]) self.laffMeter = LaffOMeter() r, g, b, _ = dna.headcolor self.laffMeter.generate(r, g, b, dna.animal, self.avatarInfo[3], self.avatarInfo[4]) self.laffMeter.reparentTo(self) self.laffMeter.setBin('gui-popup', 60) self.laffMeter.setScale(0.045) self.laffMeter.setPos(0, 0, -0.1) self.friendButton = DirectButton(geom=CIGlobals.getDefaultBtnGeom(), text='Add Friend', scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarFriendListResponse']) self.friendButton.setPos(0, 0.0, -0.225) self.maybeUpdateFriendButton() self.teleportButton = DirectButton(geom=CIGlobals.getDefaultBtnGeom(), text='Teleport', scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarTeleportResponse']) self.teleportButton.setPos(0, 0, -0.275) self.exitButton = DirectButton(geom=CIGlobals.getCancelBtnGeom(), parent=self, relief=None, scale=0.6, pos=(-0.127, 0.0, -0.3425), command=self.exitClicked) return def exitPanel(self): if self.actionFSM.getCurrentState().getName() == 'waitOnAvatarFriendListResponse': if self.avatarInfo: base.cr.friendsManager.d_iCancelledFriendRequest(self.avatarInfo[0]) self.actionFSM.requestFinalState() self.action = None self.avatarInfo = None self.removeActionPanel() self.hide() if self.nameText: self.nameText.destroy() self.nameText = None if self.head: self.head.removeNode() self.head.delete() self.head = None if self.laffMeter: self.laffMeter.disable() self.laffMeter.delete() self.laffMeter = None if self.friendButton: self.friendButton.destroy() self.friendButton = None if self.teleportButton: self.teleportButton.destroy() self.teleportButton = None if self.exitButton: self.exitButton.destroy() self.exitButton = None return
class MenuOptions(Menu): def __init__(self, _engine): """ This function will initialise the main screen of the options and prepare the tabs with the various settings """ Menu.__init__(self) # Engine self.engine = _engine self.initGeneralTab() self.initControlTab() self.currentTab = [0] self.tabGroup = [ DirectRadioButton( text = _("General"), variable = self.currentTab, value = [0], scale = 0.05, pos = (-0.6, 0, 0.65), command = self.showGeneralTab), DirectRadioButton( text = _("Controls"), variable = self.currentTab, value = [1], scale = 0.05, pos = (0.6, 0, 0.65), command = self.showControlTab) ] for tab in self.tabGroup: tab.reparentTo(self.frameMain) tab.setOthers(self.tabGroup) # set the text of all GUI elements self.setText() self.hideBase() def initGeneralTab(self): """ This function will set up the content of the general tab """ self.frameGeneral = DirectFrame( # size of the frame frameSize = (base.a2dLeft, base.a2dRight, -0.6, 0.6), # position of the frame pos = (0, 0, 0), # tramsparent bg color frameColor = (0, 0, 0, 0.5)) yPos = 0.45 shiftY = 0.25 self.lblLanguage = DirectLabel( text = _("Language"), scale = 0.15, pos = (base.a2dLeft + 0.25, 0, yPos), frameColor = (0,0,0,0), text_fg = (1,1,1,1), #text_font = self.defaultFont, text_align = TextNode.ALeft) self.cmbLanguage = DirectOptionMenu( text = "languages", scale = 0.15, pos = (base.a2dRight - 1.5, 0, 0.45), items = ["Deutsch","English","русский", "français"], initialitem = 0, highlightColor = (0.65,0.65,0.65,1), #text_font = self.defaultFontRegular, #item_text_font = self.defaultFontRegular, command = self.cmbLanguage_SelectionChanged) yPos -= shiftY self.lblResolution = DirectLabel( text = _("Screen resolution"), scale = 0.15, pos = (base.a2dLeft + 0.25, 0, yPos), frameColor = (0,0,0,0), text_fg = (1,1,1,1), #text_font = self.defaultFont, text_align = TextNode.ALeft) # get the display resolutions di = base.pipe.getDisplayInformation() sizes = [] for index in range(di.getTotalDisplayModes()): tmptext = "{0}x{1}".format( di.getDisplayModeWidth(index), di.getDisplayModeHeight(index)) if not tmptext in sizes: sizes.append(tmptext) self.cmbResolution = DirectOptionMenu( text = "resolutions", scale = 0.15, pos = (base.a2dRight - 1.5, 0, yPos), items = sizes, initialitem = 0, highlightColor = (0.65, 0.65, 0.65, 1), #text_font = self.defaultFontRegular, #item_text_font = self.defaultFontRegular, command = self.cmbResolution_SelectionChanged) yPos -= shiftY self.lblGraphicQuality = DirectLabel( text = _("Graphic quality"), scale = 0.15, pos = (base.a2dLeft + 0.25, 0, yPos), frameColor = (0,0,0,0), text_fg = (1,1,1,1), #text_font = self.defaultFont, text_align = TextNode.ALeft) self.graphicqualityTextMap = { 0:_("Low"), 1:_("Medium"), 2:_("High")} self.sliderGraphicQuality = DirectSlider( scale = 0.5, pos = (base.a2dRight - 1, 0, yPos + 0.05), range = (0,2), scrollSize = 1, text = self.graphicqualityTextMap[self.engine.settings.graphicquality], text_scale = 0.25, text_align = TextNode.ALeft, text_pos = (1.1, -0.1), text_fg = (1,1,1,1), #text_font = self.defaultFont, value = self.engine.settings.graphicquality, command = self.sliderGraphicQuality_ValueChanged) yPos -= shiftY self.lblVolume = DirectLabel( text = _("Volume"), scale = 0.15, pos = (base.a2dLeft + 0.25, 0, yPos), frameColor = (0,0,0,0), text_fg = (1,1,1,1), #text_font = self.defaultFont, text_align = TextNode.ALeft) self.sliderVolume = DirectSlider( scale = 0.5, pos = (base.a2dRight - 1, 0, yPos + 0.05), range = (0,1), scrollSize = 0.01, text = str(int(self.engine.settings.volume * 100)) + "%", text_scale = 0.25, text_align = TextNode.ALeft, text_pos = (1.1, -0.1), text_fg = (1,1,1,1), #text_font = self.defaultFont, value = self.engine.settings.volume, command = self.sliderVolume_ValueChanged) yPos -= shiftY self.lblVolumeMute = DirectLabel( text = _("Mute"), scale = 0.15, pos = (base.a2dLeft + 0.25, 0, yPos), frameColor = (0,0,0,0), text_fg = (1,1,1,1), #text_font = self.defaultFont, text_align = TextNode.ALeft) self.cbVolumeMute = DirectCheckBox( text = "X", pos = (base.a2dRight - 1, 0, yPos), scale = (0.25, 0.25, 0.25), command = self.cbVolumeMute_CheckedChanged, rolloverSound = None, clickSound = None, relief = 0, pressEffect = False, #frameColor = (0,0,0,0), checkedImage = "gui/buttons/options/SoundSwitch_off.png", uncheckedImage = "gui/buttons/options/SoundSwitch_on.png" ) self.cbVolumeMute.setTransparency(1) self.cbVolumeMute.setImage() self.cbVolumeMute["image_scale"] = 0.25 self.cbVolumeMute["text"] = "" self.createBackButton(self.btnBack_Click) self.lblLanguage.reparentTo(self.frameGeneral) self.cmbLanguage.reparentTo(self.frameGeneral) self.lblResolution.reparentTo(self.frameGeneral) self.cmbResolution.reparentTo(self.frameGeneral) self.lblGraphicQuality.reparentTo(self.frameGeneral) self.sliderGraphicQuality.reparentTo(self.frameGeneral) self.lblVolume.reparentTo(self.frameGeneral) self.sliderVolume.reparentTo(self.frameGeneral) self.lblVolumeMute.reparentTo(self.frameGeneral) self.cbVolumeMute.reparentTo(self.frameGeneral) self.frameGeneral.reparentTo(self.frameMain) self.accept("LanguageChanged", self.setText) def initControlTab(self): """ This function will set up the content of the control tab """ self.frameControl = DirectFrame( # size of the frame frameSize = (base.a2dLeft, base.a2dRight, -0.6, 0.6), # position of the frame pos = (0, 0, 0), # tramsparent bg color frameColor = (0, 0, 0, 0.5)) numItemsVisible = 9 itemHeight = 0.10 # the list field for the keyboard maping to the actions self.controlsList = DirectScrolledList( decButton_pos= (0, 0, -0.05), decButton_text = _("up"), decButton_text_scale = 0.04, decButton_borderWidth = (0.005, 0.005), incButton_pos= (0, 0, -1.05), incButton_text = _("down"), incButton_text_scale = 0.04, incButton_borderWidth = (0.005, 0.005), frameSize = (-1, 1, -1.1, 0.0), frameColor = (0,0,0,0.5), pos = (0, 0, 0.6), numItemsVisible = numItemsVisible, forceHeight = itemHeight, itemFrame_frameSize = (-0.9, 0.9, -0.9, 0), itemFrame_pos = (0, 0, -0.1), ) self.fillControlsList() self.controlsList.reparentTo(self.frameControl) self.frameControl.reparentTo(self.frameMain) def fillControlsList(self): for key, value in sorted(self.engine.settings.playerKeys.items()): # the base frame of any item in the list itemFrame = DirectFrame( frameSize = (-0.9, 0.9, -0.09, 0), frameColor = (0, 1, 0, 0)) def changeKey(key, value): # all possible keyboard keys to set for a specific action keyboard = [ "escape", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "print_screen", "scroll_lock", "pause", "num_lock", "insert", "delete", "home", "end", "page_up", "page_down", "tab", "caps_lock", "shift", "rcontrol", "lcontrol", "ralt", "lalt", "space", "backspace", "enter", "arrow_left", "arrow_up", "arrow_down", "arrow_right", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ä", "ö", "ü", ",", ";", ".", ":", "_", "-", "#", "'", "+", "*", "~", "'", "`", "!", "\"", "§", "$", "%", "&", "/", "(", ")", "=", "?", "{", "}", "[", "]", "\\", "^", "°" ] def setKey(arg): """ This function will set the chosen key for the given action """ # ignore all keyboard inputs again for keyboardKey in keyboard: self.ignore(keyboardKey) if arg == 1: # if the dialog was closed with OK # set the settings to the new value self.engine.settings.playerKeys[key][0] = self.selectedKey if len(self.engine.settings.playerKeys[key]) > 1: # just set the run key value if it is possible newKey = self.engine.settings.playerKeys["run"][0] + "-" + self.selectedKey self.engine.settings.playerKeys[key][1] = newKey # refresh the controls list self.controlsList.removeAllItems() self.fillControlsList() # finaly close the dialog self.keySelectDialog.hide() self.keySelectDialog = None # this variable will store the selected key for the given action self.selectedKey = value[0] def setSelectedKey(selkey): """ set the pressed key as the selected one and actualise the text on the dialog """ self.selectedKey = selkey self.keySelectDialog["text"] = "{0}: {1}".format(key, self.selectedKey) # accept all keyboard keys for keyboardKey in keyboard: self.accept( keyboardKey, setSelectedKey, [keyboardKey]) # set up a dialog wich will ask for the new key for the chosen action self.keySelectDialog = OkCancelDialog( dialogName = "OkCancelDialog", text = "{0}: {1}".format(key, value[0]), fadeScreen = 1, command = setKey ) # show the dialog self.keySelectDialog.show() # add the change button to change the key of the action itemBtnChange = DirectButton( text = _("change"), scale = 0.05, pos = (0.5, 0, -0.05), command = changeKey, extraArgs = [key, value] ) itemBtnChange.reparentTo(itemFrame) # add the label wich will show the name and key of the action itemText = DirectLabel( text = "{0} - {1}".format(key, value[0]), text_scale = 0.06, text_align = TextNode.ALeft, pos = (-0.88, 0, -0.06)) itemText.reparentTo(itemFrame) # finaly add the item to the list self.controlsList.addItem(itemFrame) def show(self): self.setText() self.showBase() def showGeneralTab(self): # set the selected language in the textbox if self.engine.settings.selectedLanguage == "de-DE": self.cmbLanguage.set(0, False) elif self.engine.settings.selectedLanguage == "ru-RU": self.cmbLanguage.set(2, False) elif self.engine.settings.selectedLanguage == "fr-FR": self.cmbLanguage.set(3, False) else: self.cmbLanguage.set(1, False) res = str(self.engine.settings.windowSize[0]) + "x" + str(self.engine.settings.windowSize[1]) i = 0 for item in self.cmbResolution["items"]: if item == res: self.cmbResolution.set(i, False) i += 1 self.sliderGraphicQuality["value"] = self.engine.settings.graphicquality self.sliderVolume["value"] = self.engine.settings.volume #self.cbVolumeMute["indicatorValue"] = settings.muted self.cbVolumeMute["isChecked"] = not self.engine.settings.muted self.cbVolumeMute.commandFunc(None) #self.cbVolumeMute.setIndicatorValue() self.frameGeneral.show() self.hideControlTab() def showControlTab(self): self.frameControl.show() self.hideGeneralTab() def hide(self): self.hideBase() def hideGeneralTab(self): self.frameGeneral.hide() def hideControlTab(self): self.frameControl.hide() def setText(self): self.title["text"] = _("Options") self.btnBack["text"] = _("Back") self.lblLanguage["text"] = _("Language") self.lblResolution["text"] = _("Screen resolution") self.lblGraphicQuality["text"] = _("Graphic quality") self.graphicqualityTextMap = { 0:_("Low"), 1:_("Medium"), 2:_("High")} self.sliderGraphicQuality["text"] = self.graphicqualityTextMap[ self.engine.settings.graphicquality] self.lblVolume["text"] = _("Volume") self.lblVolumeMute["text"] = _("Mute") def cmbLanguage_SelectionChanged(self, arg): # TODO: get available languages and maping from language class! if arg == "Deutsch": self.engine.lng.changeLanguage("de-DE") self.engine.settings.selectedLanguage = "de-DE" elif arg == "русский": self.engine.lng.changeLanguage("ru-RU") self.engine.settings.selectedLanguage = "ru-RU" elif arg == "français": self.engine.lng.changeLanguage("fr-FR") self.engine.settings.selectedLanguage = "fr-FR" else: self.engine.lng.changeLanguage("en-US") self.engine.settings.selectedLanguage = "en-US" def cmbResolution_SelectionChanged(self, arg): resx = int(arg.split("x")[0]) resy = int(arg.split("x")[1]) self.engine.settings.windowSize = [resx, resy] self.engine.graphicMgr.setResolution(resx, resy) def sliderGraphicQuality_ValueChanged(self): val = int(round(self.sliderGraphicQuality["value"], 0)) self.sliderGraphicQuality["text"] = self.graphicqualityTextMap[val] if val != self.engine.settings.graphicquality: self.engine.settings.graphicquality = val self.engine.graphicMgr.setGraphicQuality(self.engine.settings.graphicquality) def sliderVolume_ValueChanged(self): val = round(self.sliderVolume["value"], 2) self.sliderVolume["text"] = str(int(val * 100)) + "%" self.engine.settings.volume = val self.engine.audioMgr.setVolume(self.engine.settings.volume) def cbVolumeMute_CheckedChanged(self, checked): self.cbVolumeMute["image_scale"] = 0.35 self.cbVolumeMute["image_pos"] = (0.05,0,0.25) self.engine.settings.muted = bool(checked) self.engine.audioMgr.mute(self.engine.settings.muted) def btnBack_Click(self): base.messenger.send("OptMenu_back")
class FileDialog(DirectObject): def __init__(self, title, initial_status, callback): self.frmLeft = -.7 self.frmBottom = -.12 self.frmRight = .7 self.frmTop = .12 self.frmWidth = self.frmRight - self.frmLeft self.frmHeight = self.frmTop - self.frmBottom self.title = title self.initial_status = initial_status self.callback = callback self.result = None self.done = 0 def activate(self): # create main dialog frame # Note: frame position references the CENTER of the frame self.frm = DirectFrame(pos=(0, 0, 0), frameSize=(self.frmLeft, self.frmRight, self.frmBottom, self.frmTop), relief=DGG.RIDGE, borderWidth=(0.01, 0.01), frameColor=(0.6, 0.6, 0.6, 1.0)) self.frm.reparentTo(base.aspect2d) # Note: wonderfully enough, label position on the other hand # references the CENTER of the LEFT border of the label! titleLabel = DirectLabel(text=self.title, scale=0.04, frameColor=(0.5, 0.5, 0.5, 1), relief=DGG.RIDGE, borderWidth=(0.01, 0.01), text_align=TextNode.ALeft) titleLabel.setPos(-self.frmWidth / 2 + .02, 0, self.frmHeight / 2 - .045) titleLabel.reparentTo(self.frm) sc = .04 self.dir_edit_field = DirectEntry( text='', # prompt text scale=sc, frameColor=(0.65, 0.65, 0.65, 1), command=self.setText, width=32, numLines=1, focus=1, focusInCommand=self.efFocusIn, ) self.dir_edit_field.setPos(-self.frmWidth / 2 + .02, 0, self.frmHeight / 2 - .13) self.dir_edit_field.reparentTo(self.frm) self.statusLabel = DirectLabel( text=self.initial_status, scale=0.04, frameColor=(0.6, 0.6, 0.6, 1), # relief = DGG.RIDGE, # borderWidth = (0.01, 0.01), text_align=TextNode.ALeft) self.statusLabel.setPos(-self.frmWidth / 2 + .02, 0, self.frmHeight / 2 - .2) self.statusLabel.reparentTo(self.frm) # call this if you need to run a form before your mainloop starts steppping the taskMgr def run(self): while self.done != 1: taskMgr.step() taskMgr.step( ) # once more to make the last output from the dialog visible # while we load a zone self.frm.removeNode() def end(self): self.frm.removeNode() # callback function to set text: called by the Panda3d taskMgr when the user # has entered something into the DirectEntry widget def setText(self, textEntered): print 'dir_edit_field::setText:', textEntered self.done = self.callback(textEntered) if self.done != 1: self.dir_edit_field['focus'] = 1 #clear the text def efFocusIn(self): print 'focus in' self.dir_edit_field.enterText('') def setStatus(self, status): self.statusLabel['text'] = status
class GuiConsole(DirectObject.DirectObject): def __init__(self, class_parent, parent, h_size, v_size, aspect, hugpos): self.h_size = h_size self.v_size = v_size self.scale = 0.04 self.parent = class_parent self.numlines = int(v_size / self.scale - 2) self.pos_min_x = 0 self.pos_min_y = 0 self.pos_max_x = self.h_size self.pos_max_y = 0.7 if aspect > 0: self.pos_max_x /= aspect else: self.pos_max_y *= aspect self.consoleFrame = DirectFrame(relief=DGG.RIDGE, frameColor=(0, 0, 0, 0), scale=self.scale, frameSize=(0, self.h_size / self.scale, 0, self.v_size / self.scale)) if parent == base.a2dBottomLeft: #@UndefinedVariable self.pos_min_x -= 1 self.pos_min_y -= 1 self.pos_max_x -= 1 self.pos_max_y -= 1 if hugpos == "bottom": self.consoleFrame.setPos(0, 0, GUI_BOTTOM_OFFSET - 0.085) self.pos_min_x = 0 self.pos_min_y = GUI_BOTTOM_OFFSET - 0.085 - 0.07 self.pos_max_x = self.h_size self.pos_max_y = GUI_BOTTOM_OFFSET - 0.085 fixedWidthFont = loader.loadFont(GUI_FONT) #@UndefinedVariable #fixedWidthFont.setPixelsPerUnit(60) #fixedWidthFont.setRenderMode(fixedWidthFont.RMSolid) if not fixedWidthFont.isValid(): print "pandaInteractiveConsole.py :: could not load the defined font %s" % str( self.font) fixedWidthFont = DGG.getDefaultFont() #fixedWidthFont.setPageSize(512,512) #fixedWidthFont.setPixelsPerUnit(60) self.consoleEntry = DirectEntry( self.consoleFrame, text="", command=self.onEnterPress #, width = self.h_size/self.scale -2 , pos=(0.01, 0, 0.02), initialText="Enter text...", numLines=1, focus=0, entryFont=fixedWidthFont, scale=1, frameColor=(0, 0, 0, 0.2), text_fg=(0, 1, 0, 1), text_shadow=(0, 0, 0, 1)) #self.consoleEntry = DirectEntry(self.consoleFrame) self.consoleEntry["frameSize"] = (0, self.h_size / self.scale, 0, 1) self.consoleEntry["width"] = self.h_size / self.scale self.consoleEntry["focusInCommand"] = self.focusInCallback self.consoleEntry["focusOutCommand"] = self.focusOutCallback self.consoleFrame.reparentTo(parent) self.textBuffer = list() self.textBufferLength = 100 for i in xrange(self.textBufferLength): self.textBuffer.append(['', (100, 100, 100, 1)]) self.textBufferPos = self.textBufferLength - self.numlines # output lines self.consoleOutputList = list() for i in xrange(self.numlines): label = OnscreenText(parent=self.consoleFrame, text="", pos=(0, i + 1.5), align=TextNode.ALeft, mayChange=1, scale=1.0, fg=(100, 100, 100, 1), shadow=(0, 0, 0, 1)) # , frame = (200,0,0,1) ) label.setFont(fixedWidthFont) self.consoleOutputList.append(label) self.linelength = 57 self.linewrap = textwrap.TextWrapper() self.linewrap.width = self.linelength self.toggleConsole() def focusInCallback(self): self.parent.parent.camera_manager.disableKeyMovement() def focusOutCallback(self): self.parent.parent.camera_manager.enableKeyMovement() def show(self): if self.consoleFrame.isHidden(): self.consoleFrame.toggleVis() def hide(self): pass #if not self.consoleFrame.isHidden(): # self.consoleFrame.toggleVis() def toggleConsole(self): self.consoleFrame.toggleVis() hidden = self.consoleFrame.isHidden() #self.consoleEntry['focus'] != hidden if hidden: #self.ignoreAll() self.accept('control', self.toggleConsole) self.accept('enter', self.manageFocus) self.accept('escape', self.unfocus) else: #self.ignoreAll() #self.accept( 'page_up', self.scroll, [-5] ) #self.accept( 'page_up-repeat', self.scroll, [-5] ) #self.accept( 'page_down', self.scroll, [5] ) #self.accept( 'page_down-repeat', self.scroll, [5] ) #self.accept( 'window-event', self.windowEvent) #self.accept( 'arrow_up' , self.scrollCmd, [ 1] ) #self.accept( 'arrow_down', self.scrollCmd, [-1] ) self.accept('control', self.toggleConsole) self.accept('enter', self.manageFocus) self.accept('escape', self.unfocus) #self.accept( self.autocomplete_key, self.autocomplete ) #self.accept( self.autohelp_key, self.autohelp ) # accept v, c and x, where c & x copy's the whole console text #messenger.toggleVerbose() #for osx use ('meta') #if sys.platform == 'darwin': # self.accept( 'meta', self.unfocus ) # self.accept( 'meta-up', self.focus ) # self.accept( 'meta-c', self.copy ) # self.accept( 'meta-x', self.cut ) # self.accept( 'meta-v', self.paste ) #for windows use ('control') #if sys.platform == 'win32' or sys.platform == 'linux2': # self.accept( 'control', self.unfocus ) # self.accept( 'control-up', self.focus ) # self.accept( 'control-c', self.copy ) # self.accept( 'control-x', self.cut ) # self.accept( 'control-v', self.paste ) def onEnterPress(self, textEntered): # set to last message self.textBufferPos = self.textBufferLength - self.numlines # clear line self.consoleEntry.enterText('') self.consoleOutput(textEntered, utils.CONSOLE_PLAYER1_TEXT) ClientMsg.chat(textEntered) self.focus() def manageFocus(self): if self.consoleFrame.isHidden(): self.consoleFrame.toggleVis() if self.consoleEntry["focus"] == 0: self.focus() def consoleOutput(self, printString, msgType): if msgType == utils.CONSOLE_SYSTEM_ERROR: self.write(printString, utils.CONSOLE_SYSTEM_ERROR_TEXT_COLOR) elif msgType == utils.CONSOLE_SYSTEM_MESSAGE: self.write(printString, utils.CONSOLE_SYSTEM_MESSAGE_TEXT_COLOR) elif msgType == utils.CONSOLE_PLAYER1_TEXT: self.write(printString, utils.CONSOLE_PLAYER1_TEXT_COLOR) else: self.write(printString, utils.CONSOLE_PLAYER2_TEXT_COLOR) def write(self, printString, color=(100, 100, 100, 0.5)): # remove not printable characters (which can be input by console input) printString = re.sub(r'[^%s]' % re.escape(string.printable[:95]), "", printString) splitLines = self.linewrap.wrap(printString) for line in splitLines: self.textBuffer.append([line, color]) self.textBuffer.pop(0) self.updateOutput() def updateOutput(self): for lineNumber in xrange(self.numlines): lineText, color = self.textBuffer[lineNumber + self.textBufferPos] self.consoleOutputList[self.numlines - lineNumber - 1].setText(lineText) self.consoleOutputList[self.numlines - lineNumber - 1]['fg'] = color def focus(self): self.consoleEntry['focus'] = 1 def unfocus(self): self.consoleEntry['focus'] = 0 def getTightBounds(self): l, r, b, t = self.consoleFrame.getBounds() print l, r, b, t bottom_left = Point3(l, 0, b) top_right = Point3(r, 0, t) return (bottom_left, top_right)
class ToonPanel(DirectFrame): notify = directNotify.newCategory("ToonPanel") animal2HeadData = { 'dog': (0.125, 0.04), 'duck': (0.1, 0.025), 'cat': (0.115, 0.04), 'rabbit': (0.115, 0.04), 'horse': (0.115, 0.06), 'monkey': (0.115, 0.06), 'pig': (0.115, 0.07), 'mouse': (0.09, 0.02), 'bear': (0.125, 0.05) } State2Text = { 'status': ('Seeing if %s is available...', '%s is busy right now; try again later.'), 'teleport': ('Trying to go to %s...', 'Could not go to %s.'), 'friend': ('Asking %s to be your friend...', '%s said no, thank you.', 'You are now friends with %s!'), 'remove': ('Are you sure you want to remove %s from your friends list?', '%s left your friends list.') } def __init__(self): DirectFrame.__init__(self, scale=1.2) self['image'] = DGG.getDefaultDialogGeom() self['image_hpr'] = (0, 0, -90) self['image_scale'] = (0.67, 0.9, 0.325) self['image_color'] = (1, 1, 0.75, 1) self['image_pos'] = (0, 0, -0.09) self['relief'] = None self.reparentTo(base.a2dTopRight) self.setPos(-0.235, 0.0, -0.325) self.hide() self.head = None self.laffMeter = None self.exitButton = None self.friendButton = None self.teleportButton = None self.whisperButton = None self.nameText = None self.actionFrame = None self.actionFrameText = None self.actionFrameButton = None self.actionFrameButton2 = None self.avatarInfo = None self.action = None self.locationText = None self.shardText = None self.detailsExitBtn = None self.fsm = ClassicFSM.ClassicFSM('ToonPanel', [ State.State('off', self.enterOff, self.exitOff), State.State('waitOnAvatarInfoResponse', self.enterWaitOnAvatarInfoResponse, self.exitWaitOnAvatarInfoResponse, ['panel']), State.State('panel', self.enterPanel, self.exitPanel, ['off']) ], 'off', 'off') self.fsm.enterInitialState() self.actionFSM = ClassicFSM.ClassicFSM('ToonPanelActionFSM', [ State.State('off', self.enterOff, self.exitOff), State.State( 'waitOnAvatarStatusResponse', self.enterWaitOnAvatarStatusResponse, self.exitWaitOnAvatarStatusResponse, [ 'waitOnAvatarTeleportResponse', 'waitOnAvatarFriendListResponse', 'avatarBusy', 'off' ]), State.State('avatarBusy', self.enterAvatarBusy, self.exitAvatarBusy, ['off']), State.State('waitOnAvatarTeleportResponse', self.enterWaitOnAvatarTeleportResponse, self.exitWaitOnAvatarTeleportResponse, ['unableToTP']), State.State('unableToTP', self.enterUnableToTP, self.exitUnableToTP, ['off']), State.State('waitOnAvatarFriendListResponse', self.enterWaitOnAvatarFriendListResponse, self.exitWaitOnAvatarFriendListResponse, ['fRequestA', 'fRequestR']), State.State('fRequestA', self.enterFriendRequestAccepted, self.exitFriendRequestAccepted, ['off']), State.State('fRequestR', self.enterFriendRequestRejected, self.exitFriendRequestRejected, ['off']), State.State('removeFriendConfirm', self.enterRemoveFriendConfirm, self.exitRemoveFriendConfirm, ['off', 'removedFriend']), State.State('removedFriend', self.enterRemovedFriend, self.exitRemovedFriend, ['off']) ], 'off', 'off') self.actionFSM.enterInitialState() def makeMoreDetailsPanel(self): self.actionFSM.request('off') self.removeMoreDetailsPanel() self.removeActionPanel() self.makeActionPanel() zoneId = self.avatarInfo[5] shardId = self.avatarInfo[6] isOnline = self.avatarInfo[7] shardName = 'Unknown District' hoodName = ZoneUtil.getHoodId(zoneId, 1) for district in base.cr.activeDistricts.values(): if district.doId == shardId: shardName = district.getDistrictName() break if not isOnline: hoodName = 'Offline' shardName = 'Offline' self.locationText = OnscreenText('Location: {0}'.format(hoodName), parent=self.actionFrame, pos=(-0.3, 0.05, 0), align=TextNode.ALeft, scale=0.04) self.shardText = OnscreenText('District: {0}'.format(shardName), parent=self.actionFrame, pos=(-0.3, 0.0, 0), align=TextNode.ALeft, scale=0.04) self.detailsExitBtn = DirectButton(geom=CIGlobals.getCancelBtnGeom(), parent=self.actionFrame, relief=None, scale=0.8, pos=(-0.3, 0.0, -0.175), command=self.removeMoreDetailsPanel) def removeMoreDetailsPanel(self): if self.locationText: self.locationText.destroy() self.locationText = None if self.shardText: self.shardText.destroy() self.shardText = None if self.detailsExitBtn: self.detailsExitBtn.destroy() self.detailsExitBtn = None self.removeActionPanel() def maybeUpdateFriendButton(self): if self.friendButton: if self.avatarInfo: if not self.avatarInfo[0] in base.localAvatar.friends: self.friendButton['text'] = 'Add Friend' self.friendButton['extraArgs'] = [ 'waitOnAvatarFriendListResponse' ] else: self.friendButton['text'] = 'Remove Friend' self.friendButton['extraArgs'] = ['removeFriendConfirm'] def enterOff(self): pass def exitOff(self): pass def enterUnableToTP(self): pass def exitUnableToTP(self): pass def enterWaitOnAvatarTeleportResponse(self): self.setActionText(self.State2Text['teleport'][0] % self.getAvatarName()) self.makeButtons('Cancel') self.acceptOnce('gotAvatarTeleportResponse', self.handleTeleportResponse) base.cr.friendsManager.d_iWantToTeleportToAvatar(self.avatarInfo[0]) def handleTeleportResponse(self, avatarId, shardId, zoneId): if self.avatarInfo[0] == avatarId: requestStatus = {} whereName = ZoneUtil.getWhereName(zoneId) loaderName = ZoneUtil.getLoaderName(zoneId) requestStatus['zoneId'] = zoneId if base.localAvatar.parentId == shardId: requestStatus['shardId'] = None else: requestStatus['shardId'] = shardId requestStatus['hoodId'] = ZoneUtil.getHoodId(zoneId, 1) requestStatus['where'] = whereName requestStatus['loader'] = loaderName requestStatus['how'] = 'teleportIn' requestStatus['avId'] = avatarId base.cr.playGame.getPlace().fsm.request('teleportOut', [requestStatus]) self.cleanup() def exitWaitOnAvatarTeleportResponse(self): self.ignore('gotAvatarTeleportResponse') self.clearActionText() self.clearActionButtons() def setActionText(self, text): self.actionFrameText.setText(text) def clearActionText(self): self.actionFrameText.setText("") def makeButtons(self, button1, button2=None): button2GeomFunc = { 'Cancel': CIGlobals.getCancelBtnGeom, 'No': CIGlobals.getCancelBtnGeom, 'Okay': CIGlobals.getOkayBtnGeom, 'Yes': CIGlobals.getOkayBtnGeom } if button1 and not button2: button1Pos = (0, 0, -0.1) elif button1 and button2: button1Pos = (-0.1, 0, -0.1) button2Pos = (0.1, 0, -0.1) if button1: self.actionFrameButton = DirectButton( text=button1, geom=button2GeomFunc[button1](), parent=self.actionFrame, pos=button1Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[1], relief=None, geom_scale=0.75) if button2: self.actionFrameButton2 = DirectButton( text=button2, geom=button2GeomFunc[button2](), parent=self.actionFrame, pos=button2Pos, text_scale=0.045, text_pos=(0, -0.08), command=self.actionButtonPressed, extraArgs=[2], relief=None, geom_scale=0.75) def actionButtonPressed(self, buttonNum): currentState = self.actionFSM.getCurrentState().getName() if buttonNum == 1: if currentState in [ 'waitOnAvatarStatusResponse', 'waitOnAvatarTeleportResponse', 'waitOnAvatarFriendListResponse', 'avatarBusy', 'unableToTP', 'fRequestA', 'fRequestR', 'removeFriendConfirm', 'removedFriend' ]: if currentState == 'waitOnAvatarFriendListResponse': base.cr.friendsManager.d_iCancelledFriendRequest( self.avatarInfo[0]) elif currentState == 'removeFriendConfirm': self.actionFSM.request('removedFriend') return self.actionFSM.request('off') self.removeActionPanel() self.action = None elif buttonNum == 2: self.actionFSM.request('off') self.removeActionPanel() self.action = None def clearActionButtons(self): if self.actionFrameButton2: self.actionFrameButton2.destroy() self.actionFrameButton2 = None if self.actionFrameButton: self.actionFrameButton.destroy() self.actionFrameButton = None def enterAvatarBusy(self): self.setActionText(self.State2Text['status'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitAvatarBusy(self): self.clearActionText() self.clearActionButtons() def getAvatarName(self): if self.avatarInfo: return self.avatarInfo[1] def enterWaitOnAvatarStatusResponse(self): self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse) base.cr.friendsManager.d_requestAvatarStatus(self.avatarInfo[0]) self.setActionText(self.State2Text['status'][0] % self.getAvatarName()) self.makeButtons('Cancel') def handleAvatarStatusResponse(self, avatarId, status): if avatarId == self.avatarInfo[0]: # Busy if status == 1: self.actionFSM.request('avatarBusy') # Not busy else: self.actionFSM.request(self.action) else: self.acceptOnce('gotAvatarStatus', self.handleAvatarStatusResponse) def exitWaitOnAvatarStatusResponse(self): self.ignore('gotAvatarStatus') self.clearActionText() self.clearActionButtons() def enterWaitOnAvatarFriendListResponse(self): self.acceptOnce('friendRequestAccepted', self.handleFriendRequestAccepted) self.acceptOnce('friendRequestRejected', self.handleFriendRequestRejected) base.cr.friendsManager.d_askAvatarToBeFriends(self.avatarInfo[0]) self.setActionText(self.State2Text['friend'][0] % self.getAvatarName()) self.makeButtons('Cancel') def handleFriendRequestAccepted(self): self.actionFSM.request('fRequestA') def handleFriendRequestRejected(self): self.actionFSM.request('fRequestR') def exitWaitOnAvatarFriendListResponse(self): self.ignore('friendRequestAccepted') self.ignore('friendRequestRejected') self.clearActionText() self.clearActionButtons() def enterFriendRequestAccepted(self): self.setActionText(self.State2Text['friend'][2] % self.getAvatarName()) self.makeButtons('Okay') def exitFriendRequestAccepted(self): self.clearActionText() self.clearActionButtons() def enterFriendRequestRejected(self): self.setActionText(self.State2Text['friend'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitFriendRequestRejected(self): self.clearActionText() self.clearActionButtons() def enterRemoveFriendConfirm(self): self.setActionText(self.State2Text['remove'][0] % self.getAvatarName()) self.makeButtons('Yes', 'No') def exitRemoveFriendConfirm(self): self.clearActionText() self.clearActionButtons() def enterRemovedFriend(self): base.cr.friendsManager.d_iRemovedFriend(self.avatarInfo[0]) self.setActionText(self.State2Text['remove'][1] % self.getAvatarName()) self.makeButtons('Okay') def exitRemovedFriend(self): self.clearActionText() self.clearActionButtons() def makeActionPanel(self): self.actionFrame = DirectFrame(image=DGG.getDefaultDialogGeom(), image_scale=(0.7, 0.5, 0.45), image_color=(1, 1, 0.75, 1), relief=None) self.actionFrame.reparentTo(base.a2dTopRight) self.actionFrame.setPos(-0.815, 0, -0.31) self.actionFrameText = OnscreenText(text="", parent=self.actionFrame, scale=0.05, wordwrap=12, pos=(0, 0.1)) def removeActionPanel(self): self.clearActionButtons() if self.actionFrameText: self.actionFrameText.destroy() self.actionFrameText = None if self.actionFrame: self.actionFrame.destroy() self.actionFrame = None def doAction(self, action): self.action = action self.actionFSM.requestFinalState() self.removeMoreDetailsPanel() self.removeActionPanel() self.makeActionPanel() if action != 'removeFriendConfirm': self.actionFSM.request('waitOnAvatarStatusResponse') else: self.actionFSM.request(action) def enterWaitOnAvatarInfoResponse(self): self.label = OnscreenText(text='Retrieving Toon\ndetails...', parent=self, scale=0.04) self.acceptOnce('avatarInfoResponse', self.handleAvatarInfoResponse) base.cr.friendsManager.d_requestAvatarInfo(self.avatarInfo[0]) def handleAvatarInfoResponse(self, name, dna, maxHealth, health, zoneId, shardId, isOnline, adminToken): if self.avatarInfo: self.avatarInfo.append(name) self.avatarInfo.append(dna) self.avatarInfo.append(maxHealth) self.avatarInfo.append(health) self.avatarInfo.append(zoneId) self.avatarInfo.append(shardId) self.avatarInfo.append(isOnline) self.avatarInfo.append(adminToken) self.fsm.request('panel') def exitWaitOnAvatarInfoResponse(self): self.label.destroy() del self.label self.ignore('avatarInfoResponse') def makePanel(self, avId): if self.avatarInfo: if self.avatarInfo[0] == avId: # They clicked on the same toon without closing the # previous panel, maybe they're spamming? return self.cleanup() base.localAvatar.hideFriendButton() self.show() self.avatarInfo = [] self.avatarInfo.append(avId) self.fsm.request('waitOnAvatarInfoResponse') def exitClicked(self): self.cleanup() base.localAvatar.showFriendButton() def cleanup(self): self.actionFSM.requestFinalState() self.fsm.requestFinalState() self.avatarInfo = None def enterPanel(self): adminToken = self.avatarInfo[8] text_color = CIGlobals.TextColorByAdminToken[adminToken] self.nameText = OnscreenText(text=self.avatarInfo[1], parent=self, pos=(0, 0.2), scale=0.035, wordwrap=8, fg=text_color) self.nameText.setBin('gui-popup', 60) dna = ToonDNA.ToonDNA() dna.setDNAStrand(self.avatarInfo[2]) self.head = ToonHead.ToonHead(base.cr) self.head.generateHead(dna.gender, dna.animal, dna.head, 1) self.head.setHeadColor(dna.headcolor) self.head.reparentTo(self) self.head.setDepthWrite(1) self.head.setDepthTest(1) self.head.setH(180) self.head.setScale(self.animal2HeadData[dna.animal][0]) self.head.setZ(self.animal2HeadData[dna.animal][1]) self.laffMeter = LaffOMeter() r, g, b, _ = dna.headcolor self.laffMeter.generate(r, g, b, dna.animal, self.avatarInfo[3], self.avatarInfo[4]) self.laffMeter.reparentTo(self) self.laffMeter.setBin('gui-popup', 60) self.laffMeter.setScale(0.045) self.laffMeter.setPos(0, 0, -0.1) self.friendButton = DirectButton( geom=CIGlobals.getDefaultBtnGeom(), text="Add Friend", scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarFriendListResponse']) self.friendButton.setPos(0, 0.0, -0.225) self.maybeUpdateFriendButton() self.teleportButton = DirectButton( geom=CIGlobals.getDefaultBtnGeom(), text="Teleport", scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=self.doAction, extraArgs=['waitOnAvatarTeleportResponse']) self.teleportButton.setPos(0, 0, -0.275) self.whisperButton = DirectButton( geom=CIGlobals.getDefaultBtnGeom(), text="Whisper", scale=0.58, relief=None, text_scale=0.058, geom_scale=(1.25, 0, 0.9), text_pos=(0, -0.0125), parent=self, pos=(0, 0, -0.12), command=base.localAvatar.handleClickedWhisper, extraArgs=[self.avatarInfo[1], self.avatarInfo[0], 1]) self.whisperButton.setPos(0, 0, -0.325) self.exitButton = DirectButton(geom=CIGlobals.getCancelBtnGeom(), parent=self, relief=None, scale=0.6, pos=(0, 0.0, -0.39), command=self.exitClicked) gui = loader.loadModel("phase_3.5/models/gui/friendslist_gui.bam") self.moreDetailsBtn = DirectButton( geom=(gui.find('**/Horiz_Arrow_UP'), gui.find('**/Horiz_Arrow_DN'), gui.find('**/Horiz_Arrow_Rllvr'), gui.find('**/Horiz_Arrow_UP')), relief=None, parent=self, pos=(-0.127, 0.0, -0.39), geom_hpr=(180, 0, 0), command=self.makeMoreDetailsPanel, scale=0.77, text=('', 'More Details', 'More Details', ''), text_scale=0.045, text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), text_pos=(-0.08, -0.01), text_align=TextNode.ARight) def exitPanel(self): if self.actionFSM.getCurrentState().getName( ) == 'waitOnAvatarFriendListResponse': if self.avatarInfo: base.cr.friendsManager.d_iCancelledFriendRequest( self.avatarInfo[0]) self.actionFSM.requestFinalState() self.action = None self.avatarInfo = None self.removeActionPanel() self.removeMoreDetailsPanel() self.hide() if self.nameText: self.nameText.destroy() self.nameText = None if self.head: self.head.removeNode() self.head.delete() self.head = None if self.laffMeter: self.laffMeter.disable() self.laffMeter.delete() self.laffMeter = None if self.friendButton: self.friendButton.destroy() self.friendButton = None if self.teleportButton: self.teleportButton.destroy() self.teleportButton = None if self.whisperButton: self.whisperButton.destroy() self.whisperButton = None if self.exitButton: self.exitButton.destroy() self.exitButton = None if self.moreDetailsBtn: self.moreDetailsBtn.destroy() self.moreDetailsBtn = None
class OptionMenu(IMenu): def __init__(self): frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 0, 0, 1.0)) IMenu.__init__(self, frame=frame) self.menuVerticalChoicesList = [ { "event": "Option-Items", "text": "Items" }, # {"event": "Option-Equip", "text": "Equip"}, # {"event": "Option-Magic", "text": "Magic"}, { "event": "Option-Save", "text": "Save" }, { "event": "Option-Config", "text": "Config" }, { "event": "Back-Field", "text": "Back to Game" }, { "event": "Option-Quit", "text": "Back to Start Menu" } ] self.menuHorizontalChoices = [{ "event": "Chara-Sub", "text": "*" }, { "event": "Chara-Add", "text": "*" }] self.characterSheetList = [] self.characterSheetIndex = 0 for hero in base.gameData.hero_party: self.characterSheetList.append(hero) self.createVerticalButtons() self.addTitle() self.charaName = None self.statsSheet = None self.displayCharacterSheet(self.characterSheetIndex) def createButton(self, text, index, eventArgs): btn = DirectRadioButton(text=text.upper(), text_align=TextNode.ALeft, scale=0.05, frameColor=(0, 0, 0, 0.0), pos=(base.a2dLeft + 0.075, 0, (0.3 - (index * .15))), variable=self.menuVerticalChoice, value=[index], text_fg=(1, 1, 1, 1), command=self.menuVerticalEvent) self.menuVerticalButtons.append(btn) btn.reparentTo(self.frameMain) def addTitle(self): self.title = OnscreenText('Character Stats', 1, fg=(1, 0, 0, 1), pos=(base.a2dLeft + 0.7, 0.8), font=base.font_title, align=TextNode.ALeft, scale=.15, mayChange=1) self.title.reparentTo(self.frameMain) def cancelCommand(self): base.messenger.send("Back-Field") def displayCharacterSheet(self, value): if self.charaName: self.charaName.detachNode() self.statsSheet.detachNode() self.characterSheetIndex += value self.characterSheetIndex = max(0, self.characterSheetIndex) self.characterSheetIndex = min(self.characterSheetIndex, len(self.characterSheetList) - 1) chara = self.characterSheetList[self.characterSheetIndex] self.charaName = DirectLabel(scale=0.12, text_align=TextNode.ALeft, pos=(base.a2dLeft + 0.7, 0, 0.5), pad=(0.5, 0.5), frameColor=(0, 0, 0, 0.0), text=chara['name'], text_fg=(1, 1, 1, 1)) self.charaName.reparentTo(self.frameMain) self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 1, 0, 0)) next_xp = y_helpers.get_experience_estimate(chara['level'] + 1) stats = [ 'Health Points: {} / {}'.format(chara['hp'], chara['max_hp']), 'Level: {}'.format(chara['level']), '', 'Attack: {}'.format(y_helpers.get_stat(chara['attack'])), 'Defense: {}'.format(y_helpers.get_stat(chara['defense'])), 'Speed: {}'.format(y_helpers.get_stat(chara['speed'])), '', 'Experience Points: {}'.format(chara['xp']), 'Points needed to level up: {}'.format(next_xp - chara['xp']), ] for stat in stats: self.add_stat(stat, stats.index(stat)) self.statsSheet.reparentTo(self.frameMain) def add_stat(self, text, index): stat = DirectLabel(scale=0.07, text_align=TextNode.ALeft, pos=(base.a2dLeft + 0.7, 0, (0.3 - (index * .1))), pad=(0.5, 0.5), frameColor=(0, 0, 0, 0.0), text=text, text_fg=(1, 1, 1, 1)) stat.reparentTo(self.statsSheet)
class LevelSelection: def __init__(self): self.frameMain = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0.05, 0.05, 0.05, 1)) self.frameMain.setTransparency(1) self.btnLevel1 = self.createLevelButton( (-0.6, 0, 0.15), "assets/gui/Level1Button.png", 1) self.btnLevel1.reparentTo(self.frameMain) self.btnLevel2 = self.createLevelButton( (0.6, 0, 0.15), "assets/gui/Level2Button.png", 2) self.btnLevel2.reparentTo(self.frameMain) self.footerFrame = DirectFrame(text="SELECT THE ARENA", text_fg=(1, 1, 1, 1), text_scale=0.08, text_pos=(0, -0.03), frameSize=(base.a2dLeft, base.a2dRight, 0.1, -0.1), pos=(0, 0, base.a2dBottom + 0.2), frameColor=(0, 0, 0, 0.5)) self.footerFrame.setTransparency(1) self.footerFrame.reparentTo(self.frameMain) self.btnBack = DirectButton(text="BACK", text_fg=(1, 1, 1, 1), text_align=TextNode.ALeft, scale=0.1, pad=(0.15, 0.15), pos=(base.a2dLeft + 0.08, 0, -0.03), frameColor=( (0.2, 0.2, 0.2, 0.8), (0.4, 0.4, 0.4, 0.8), (0.4, 0.4, 0.4, 0.8), (0.1, 0.1, 0.1, 0.8), ), relief=1, command=base.messenger.send, extraArgs=["LevelSelection-Back"], pressEffect=False, rolloverSound=None, clickSound=None) self.btnBack.setTransparency(1) self.btnBack.reparentTo(self.footerFrame) self.hide() def createLevelButton(self, pos, image, levelNr): btn = DirectButton(scale=(0.5, 1, 0.75), relief=0, frameColor=(0, 0, 0, 0), pos=pos, image=image, command=self.selectLevel, extraArgs=[levelNr], rolloverSound=None, clickSound=None) btn.setTransparency(1) return btn def selectLevel(self, level): self.selectedLevel = level base.messenger.send("LevelSelection-Start") def show(self): self.frameMain.show() def hide(self): self.frameMain.hide()
class GuiTextFrame: def __init__(self, offset, h_size, v_size, numLines, hugpos): self.numLines = numLines #if hugpos == "statusbar": # color = (0,0,0,1) #else: # color = (0.2, 0.2, 0.2, 0.8) color = (0.2, 0.2, 0.2, 0.9) self.frame = DirectFrame( relief = DGG.FLAT , frameColor = color , scale = 1 , frameSize = (0, h_size, 0, -v_size) ) self.v_size = v_size self.hugpos = hugpos self.offset = offset if hugpos == "top": self.frame.reparentTo(base.a2dTopLeft)#@UndefinedVariable self.frame.setPos(self.offset.getX(), 0, self.offset.getZ() - GUI_TOP_OFFSET) elif hugpos == "bottom": self.frame.reparentTo(base.a2dBottomLeft)#@UndefinedVariable self.frame.setPos(self.offset.getX(), 0, self.offset.getZ() + GUI_BOTTOM_OFFSET -0.085) elif hugpos == "statusbar": self.frame.reparentTo(base.a2dTopLeft)#@UndefinedVariable self.frame.setPos(self.offset.getX(), 0, self.offset.getZ()) fixedWidthFont = loader.loadFont(GUI_FONT)#@UndefinedVariable if not fixedWidthFont.isValid(): print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(self.font) fixedWidthFont = DGG.getDefaultFont() if numLines == 1: self.lineHeight = 0.05 else: self.lineHeight = v_size*0.9 / numLines # output lines self.frameOutputList = list() for i in xrange( self.numLines ): label = OnscreenText( parent = self.frame , text = "" , pos = (0.005, -(i+1)*self.lineHeight) , align=TextNode.ALeft , mayChange=1 , scale=0.04 , fg = (1,1,1,1) , shadow = (0, 0, 0, 1)) #, frame = (200,0,0,1) ) label.setFont( fixedWidthFont ) self.frameOutputList.append( label ) def write(self, lineNumber, text): if lineNumber > self.numLines: return self.frameOutputList[lineNumber - 1].setText(text) def redraw(self, aspect): 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) self.frame.setPos(p) 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) self.frame.setPos(p) elif self.hugpos == "statusbar": self.frame["frameSize"] = (0, 2*aspect, 0, -self.v_size) self.frame.resetFrameSize()
class FullscreenPopup(DirectObject): def __init__(self, title, fields, initialValues, okayFunction, cancelFunction): self.okayFunction = okayFunction self.cancelFunction = cancelFunction self.node = aspect2d.attachNewNode('popup') self.frame = DirectFrame() self.fields = {} self.LoadContent(title, fields, initialValues) self.frame.reparentTo(self.node) def LoadContent(self, title, fields, initialValues): bg = OnscreenImage(image = 'Assets/Images/Inventory/BlackScreen.png', scale = (2, 1, 1)) bg.setTransparency(TransparencyAttrib.MAlpha) bg.reparentTo(self.node) popup = OnscreenImage(image = 'Assets/Images/Menus/Popups/fullscreenPopup.png') popup.setTransparency(TransparencyAttrib.MAlpha) popup.reparentTo(self.node) titleText = OnscreenText(text = title, pos = (-0.29, 0.81), scale = 0.07, fg = (1, 1, 1, 1)) titleText.reparentTo(self.node) self.LoadButton('Button_Okay', 'okay', 'okay_over', -0.27, -0.8, self.OnButtonClicked, ['okay']) self.LoadButton('Button_Cancel', 'cancel', 'cancel_over', 0.27, -0.8, self.OnButtonClicked, ['cancel']) y = 0 for i in xrange(len(fields)): self.fields[fields[i]] = self.CreateField(fields[i], initialValues[i], y, y) y += 1 def LoadButton(self, egg, up, over, x, y, cmd, args): maps = loader.loadModel("Assets/Images/Menus/Popups/%s" % (egg)) b = DirectButton(geom = (maps.find('**/%s' % (up)), maps.find('**/%s' % (over)), maps.find('**/%s' % (over)), maps.find('**/%s' % (up))), command = cmd, extraArgs = args, pressEffect = 0, relief = None, rolloverSound = None, clickSound = None, pos = (x, 1, y), scale = (0.5, 1, 60.0/400.0)) b.reparentTo(self.frame) def CreateField(self, fieldLabel, initText, yIndex, focus): label = OnscreenText(text = fieldLabel, pos = (-0.4, 0.35 - yIndex * 0.2), scale = 0.07, fg = (1, 1, 1, 1)) label.reparentTo(self.node) f = DirectEntry(text = '' , scale = 0.05, initialText = initText, numLines = 1, rolloverSound = None, clickSound = None, pos = (-0.4, 1, 0.25 - yIndex * 0.2), focus = (not focus)) f.reparentTo(self.frame) return f def GetValue(self, key): return self.fields[key].get() def Destroy(self): self.frame.destroy() self.node.removeNode() def OnButtonClicked(self, buttonText): if(buttonText == 'okay'): self.okayFunction(self) elif(buttonText == 'cancel'): self.cancelFunction(self)
class Menu(UIItem): def __init__(self, list=[]): self.__menuContainer = DirectFrame( #text_pos=(0,1), pos=(0, 0, 0), text_scale=1.5, text_fg=(0, 0, 0, 0), relief=DGG.FLAT, frameColor=(1, 1, 1, 0.5)) self.__menuContainer.hide() self.__menuItems = [] self.selectedItem = 0 self.addItems(list) def addItem(self, text, action): self.__menuItems.append( DirectButton( text=text, command=self.pressEnter, extraArgs=[len(self.__menuItems)], text_align=TextNode.ALeft, scale=0.1, #left/right, forward/back, up/down pos=Vec3(-0.38, 0, 0.5 - (len(self.__menuItems) * 0.15)), text_fg=(1, 1, 1, 1), rolloverSound=None, clickSound=None, pressEffect=0, relief=None, textMayChange=True #text_font=base.fontLoader.load('Arial Bold.ttf') )) self.__menuItems[-1].reparentTo(self.__menuContainer) self.__menuItems[-1].setPythonTag('action', action) self.__menuItems[-1].setPythonTag('text', text) def addItems(self, list): for k, v in list: self.addItem(k, v) def hasItem(self, text): for i in self.__menuItems: if (i['text'] == text): return True return False def __del__(self): self.ignoreAll() def pressEnter(self, item=None): if (item != None): self.selectedItem = item logging.info("pressEnter:: selectedItem = %s" % str(self.selectedItem)) action = self.__menuItems[self.selectedItem].getPythonTag('action') text = self.__menuItems[self.selectedItem].getPythonTag('text') logging.info("pressEnter:: action = %s" % str(action)) if (action != None): #function #self.hide() action(text) #call the function in 'action' def enter(self): """ Press the enter key to select the current menu item. """ self.pressEnter() UIItem.enter(self) def up(self): """Move one item up in the menu.""" newItem = self.selectedItem - 1 if (newItem < 0): newItem = len(self.__menuItems) - 1 self.select(newItem) UIItem.up(self) def down(self): """Move one item down in the menu.""" newItem = self.selectedItem + 1 if (newItem >= len(self.__menuItems)): newItem = 0 self.select(newItem) UIItem.down(self) def select(self, item): self.__menuItems[self.selectedItem]['text_fg'] = (1, 1, 1, 1) self.__menuItems[self.selectedItem]['text_bg'] = (0, 0, 0, 0) self.selectedItem = item self.__menuItems[self.selectedItem]['text_fg'] = (0, 0, 0.5, 1) self.__menuItems[self.selectedItem]['text_bg'] = (1, 1, 1, 1) def show(self): assert len(self.__menuItems) > 0 self.select(0) #make the first item selected if (self.__menuContainer.isHidden()): Sequence( Func(self.__menuContainer.setAlphaScale, 0.0), Func(self.__menuContainer.show), LerpFunctionInterval(self.__menuContainer.setAlphaScale, toData=1.0, fromData=0.0, duration=1.0)).start() def hide(self): self.ignoreAll() if (not self.__menuContainer.isHidden()): Sequence( LerpFunctionInterval(self.__menuContainer.setAlphaScale, toData=0.0, fromData=1.0, duration=1.0), Func(self.__menuContainer.hide), Func(self.__menuContainer.setAlphaScale, 1.0)).start() #now, hide all dialogs referred to: for i in self.__menuItems: a = i.getPythonTag('action') if (isinstance(a, Menu)): a.hide() def setParent(self, parent): self.__menuContainer.reparentTo(parent) def setPos(self, x, y, z): self.__menuContainer.setPos(x, y, z)
class CharacterSelection: def __init__(self): self.frameMain = DirectFrame( frameSize = (base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor = (0.05, 0.05, 0.05, 1)) self.frameMain.setTransparency(1) width = abs(base.a2dLeft) + base.a2dRight red = loader.loadTexture("assets/gui/CharRedBG.png") red.setWrapU(Texture.WM_repeat) red.setWrapV(Texture.WM_repeat) self.char1Frame = DirectFrame( text = "Player 1", text_fg = (1,1,1,1), text_scale = 0.1, text_pos = (0, base.a2dTop - 0.2), frameSize = (-width/6.0, width/6.0, base.a2dBottom, base.a2dTop), frameTexture = red, pos = (base.a2dLeft+width/6.0, 0, 0)) self.char1Frame.updateFrameStyle() self.char1Frame.setTransparency(1) self.char1Frame.reparentTo(self.frameMain) blue = loader.loadTexture("assets/gui/CharBlueBG.png") blue.setWrapU(Texture.WM_repeat) blue.setWrapV(Texture.WM_repeat) self.char2Frame = DirectFrame( text = "Player 2", text_fg = (1,1,1,1), text_scale = 0.1, text_pos = (0, base.a2dTop - 0.2), frameSize = (-width/6.0, width/6.0, base.a2dBottom, base.a2dTop), frameTexture = blue, pos = (base.a2dRight-width/6.0, 0, 0)) self.char2Frame.setTransparency(1) self.char2Frame.reparentTo(self.frameMain) self.footerFrame = DirectFrame( text = "PLAYER 1 - CHOOSE YOUR CHARACTER", text_fg = (1,1,1,1), text_scale = 0.08, text_pos = (0, -0.03), frameSize = (base.a2dLeft, base.a2dRight, 0.1, -0.1), pos = (0, 0, base.a2dBottom + 0.2), frameColor = (0, 0, 0, 0.5)) self.footerFrame.setTransparency(1) self.footerFrame.reparentTo(self.frameMain) self.charSelectFrame = DirectFrame( text = "VS", text_fg = (1,1,1,1), text_scale = 0.1, text_pos = (0, base.a2dTop - 0.2), frameSize = (-width/6.0, width/6.0, base.a2dBottom, base.a2dTop), frameColor = (0,0,0,0)) self.charSelectFrame.reparentTo(self.frameMain) self.btnChar1 = self.createCharacterButton( (-0.2, 0, 0), "assets/gui/Char1Button.png", 1) self.btnChar1.reparentTo(self.charSelectFrame) self.btnChar2 = self.createCharacterButton( (0.2, 0, 0), "assets/gui/Char2Button.png", 2) self.btnChar2.reparentTo(self.charSelectFrame) self.btnBack = DirectButton( text = "BACK", text_fg = (1,1,1,1), text_align = TextNode.ALeft, scale = 0.1, pad = (0.15, 0.15), pos = (base.a2dLeft + 0.08, 0, -0.03), frameColor = ( (0.2,0.2,0.2,0.8), (0.4,0.4,0.4,0.8), (0.4,0.4,0.4,0.8), (0.1,0.1,0.1,0.8)), relief = 1, command = base.messenger.send, extraArgs = ["CharSelection-Back"], pressEffect = False, rolloverSound = None, clickSound = None) self.btnBack.setTransparency(1) self.btnBack.reparentTo(self.footerFrame) self.btnStart = DirectButton( text = "START", text_fg = (1,1,1,1), text_align = TextNode.ARight, scale = 0.1, pad = (0.15, 0.15), pos = (base.a2dRight - 0.08, 0, -0.03), relief = 1, frameColor = ( (0.2,0.2,0.2,0.8), (0.4,0.4,0.4,0.8), (0.4,0.4,0.4,0.8), (0.1,0.1,0.1,0.8)), command = base.messenger.send, extraArgs = ["CharSelection-Start"], pressEffect = False, rolloverSound = None, clickSound = None) self.btnStart.setTransparency(1) self.btnStart.reparentTo(self.footerFrame) self.btnStart["state"] = DGG.DISABLED self.hide() def createCharacterButton(self, pos, image, charNr): btn = DirectButton( scale = 0.1, relief = 0, frameColor = (0,0,0,0), pos = pos, image = image, command = self.selectCharacter, extraArgs = [charNr], rolloverSound = None, clickSound = None) btn.setTransparency(1) return btn def selectCharacter(self, charNr): if self.char1Frame["image"] == None: self.char1Frame["image"] = "assets/gui/Char{}_L.png".format(charNr) self.char1Frame["image_scale"] = (0.5,1, 1) self.selectedCharacter1 = charNr self.footerFrame["text"] = "PLAYER 2 - CHOOSE YOUR CHARACTER" elif self.char2Frame["image"] == None: self.char2Frame["image"] = "assets/gui/Char{}_R.png".format(charNr) self.char2Frame["image_scale"] = (0.5,1, 1) self.selectedCharacter2 = charNr self.btnStart["state"] = DGG.NORMAL self.footerFrame["text"] = "START THE FIGHT >" def show(self): self.selectedCharacter1 = None self.selectedCharacter2 = None self.char1Frame["image"] = None self.char2Frame["image"] = None self.footerFrame["text"] = "PLAYER 1 - CHOOSE YOUR CHARACTER" self.btnStart["state"] = DGG.DISABLED self.frameMain.show() def hide(self): self.frameMain.hide()
class Transitions: # These may be reassigned before the fade or iris transitions are # actually invoked to change the models that will be used. IrisModelName = "models/misc/iris" FadeModelName = "models/misc/fade" def __init__(self, loader, model=None, scale=3.0, pos=Vec3(0, 0, 0)): self.transitionIval = None self.letterboxIval = None self.iris = None self.fade = None self.letterbox = None self.fadeModel = model self.imagePos = pos if model: self.alphaOff = Vec4(1, 1, 1, 0) self.alphaOn = Vec4(1, 1, 1, 1) model.setTransparency(1) self.lerpFunc = LerpColorScaleInterval else: self.alphaOff = Vec4(0, 0, 0, 0) self.alphaOn = Vec4(0, 0, 0, 1) self.lerpFunc = LerpColorInterval self.irisTaskName = "irisTask" self.fadeTaskName = "fadeTask" self.letterboxTaskName = "letterboxTask" def __del__(self): if self.fadeModel: self.fadeModel.removeNode() self.fadeModel = None ################################################## # Fade ################################################## # We can set a custom model for the fade before using it for the first time def setFadeModel(self, model, scale=1.0): self.fadeModel = model # We have to change some default parameters for a custom fadeModel self.alphaOn = Vec4(1, 1, 1, 1) # Reload fade if its already been created if self.fade: self.fade.destroy() self.fade = None self.loadFade() def loadFade(self): if self.fade is None: # We create a DirectFrame for the fade polygon, instead of # simply loading the polygon model and using it directly, # so that it will also obscure mouse events for objects # positioned behind it. self.fade = DirectFrame( parent = hidden, guiId = 'fade', relief = None, image = self.fadeModel, image_scale = (4, 2, 2), state = DGG.NORMAL, ) if not self.fadeModel: # No fade model was given, so we make this the fade model. self.fade["relief"] = DGG.FLAT self.fade["frameSize"] = (-2, 2, -1, 1) self.fade["frameColor"] = (0, 0, 0, 1) self.fade.setTransparency(TransparencyAttrib.MAlpha) self.fade.setBin('unsorted', 0) self.fade.setColor(0,0,0,0) def getFadeInIval(self, t=0.5, finishIval=None): """ Returns an interval without starting it. This is particularly useful in cutscenes, so when the cutsceneIval is escaped out of we can finish the fade immediately """ #self.noTransitions() masad: this creates a one frame pop, is it necessary? self.loadFade() transitionIval = Sequence(Func(self.fade.reparentTo, aspect2d, DGG.FADE_SORT_INDEX), Func(self.fade.showThrough), # in case aspect2d is hidden for some reason self.lerpFunc(self.fade, t, self.alphaOff, # self.alphaOn, ), Func(self.fade.detachNode), name = self.fadeTaskName, ) if finishIval: transitionIval.append(finishIval) return transitionIval def getFadeOutIval(self, t=0.5, finishIval=None): """ Create a sequence that lerps the color out, then parents the fade to hidden """ self.noTransitions() self.loadFade() transitionIval = Sequence(Func(self.fade.reparentTo,aspect2d,DGG.FADE_SORT_INDEX), Func(self.fade.showThrough), # in case aspect2d is hidden for some reason self.lerpFunc(self.fade, t, self.alphaOn, # self.alphaOff, ), name = self.fadeTaskName, ) if finishIval: transitionIval.append(finishIval) return transitionIval def fadeIn(self, t=0.5, finishIval=None): """ Play a fade in transition over t seconds. Places a polygon on the aspect2d plane then lerps the color from black to transparent. When the color lerp is finished, it parents the fade polygon to hidden. """ gsg = base.win.getGsg() if gsg: # If we're about to fade in from black, go ahead and # preload all the textures etc. base.graphicsEngine.renderFrame() render.prepareScene(gsg) render2d.prepareScene(gsg) if (t == 0): # Fade in immediately with no lerp #print "transitiosn: fadeIn 0.0" self.noTransitions() self.loadFade() self.fade.detachNode() else: # Create a sequence that lerps the color out, then # parents the fade to hidden self.transitionIval = self.getFadeInIval(t, finishIval) self.transitionIval.start() def fadeOut(self, t=0.5, finishIval=None): """ Play a fade out transition over t seconds. Places a polygon on the aspect2d plane then lerps the color from transparent to full black. When the color lerp is finished, it leaves the fade polygon covering the aspect2d plane until you fadeIn or call noFade. lerp """ if (t == 0): # Fade out immediately with no lerp self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn) elif ConfigVariableBool('no-loading-screen', False): if finishIval: self.transitionIval = finishIval self.transitionIval.start() else: # Create a sequence that lerps the color out, then # parents the fade to hidden self.transitionIval = self.getFadeOutIval(t,finishIval) self.transitionIval.start() def fadeOutActive(self): return self.fade and self.fade.getColor()[3] > 0 def fadeScreen(self, alpha=0.5): """ Put a semitransparent screen over the camera plane to darken out the world. Useful for drawing attention to a dialog box for instance """ #print "transitiosn: fadeScreen" self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(self.alphaOn[0], self.alphaOn[1], self.alphaOn[2], alpha) def fadeScreenColor(self, color): """ Put a semitransparent screen over the camera plane to darken out the world. Useful for drawing attention to a dialog box for instance """ #print "transitiosn: fadeScreenColor" self.noTransitions() self.loadFade() self.fade.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.fade.setColor(color) def noFade(self): """ Removes any current fade tasks and parents the fade polygon away """ #print "transitiosn: noFade" if self.transitionIval: self.transitionIval.pause() self.transitionIval = None if self.fade: # Make sure to reset the color, since fadeOutActive() is looking at it self.fade.setColor(self.alphaOff) self.fade.detachNode() def setFadeColor(self, r, g, b): self.alphaOn.set(r, g, b, 1) self.alphaOff.set(r, g, b, 0) ################################################## # Iris ################################################## def loadIris(self): if self.iris == None: self.iris = loader.loadModel(self.IrisModelName) self.iris.setPos(0, 0, 0) def irisIn(self, t=0.5, finishIval=None): """ Play an iris in transition over t seconds. Places a polygon on the aspect2d plane then lerps the scale of the iris polygon up so it looks like we iris in. When the scale lerp is finished, it parents the iris polygon to hidden. """ self.noTransitions() self.loadIris() if (t == 0): self.iris.detachNode() else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.transitionIval = Sequence(LerpScaleInterval(self.iris, t, scale = 0.18, startScale = 0.01), Func(self.iris.detachNode), name = self.irisTaskName, ) if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() def irisOut(self, t=0.5, finishIval=None): """ Play an iris out transition over t seconds. Places a polygon on the aspect2d plane then lerps the scale of the iris down so it looks like we iris out. When the scale lerp is finished, it leaves the iris polygon covering the aspect2d plane until you irisIn or call noIris. """ self.noTransitions() self.loadIris() self.loadFade() # we need this to cover up the hole. if (t == 0): self.iris.detachNode() self.fadeOut(0) else: self.iris.reparentTo(aspect2d, DGG.FADE_SORT_INDEX) self.transitionIval = Sequence(LerpScaleInterval(self.iris, t, scale = 0.01, startScale = 0.18), Func(self.iris.detachNode), # Use the fade to cover up the hole that the iris would leave Func(self.fadeOut, 0), name = self.irisTaskName, ) if finishIval: self.transitionIval.append(finishIval) self.transitionIval.start() def noIris(self): """ Removes any current iris tasks and parents the iris polygon away """ if self.transitionIval: self.transitionIval.pause() self.transitionIval = None if self.iris != None: self.iris.detachNode() # Actually we need to remove the fade too, # because the iris effect uses it. self.noFade() def noTransitions(self): """ This call should immediately remove any and all transitions running """ self.noFade() self.noIris() # Letterbox is not really a transition, it is a screen overlay # self.noLetterbox() ################################################## # Letterbox ################################################## def loadLetterbox(self): if not self.letterbox: # We create a DirectFrame for the fade polygon, instead of # simply loading the polygon model and using it directly, # so that it will also obscure mouse events for objects # positioned behind it. self.letterbox = NodePath("letterbox") # Allow fade in and out of the bars self.letterbox.setTransparency(1) # Allow DirectLabels to be parented to the letterbox sensibly self.letterbox.setBin('unsorted', 0) # Allow a custom look to the letterbox graphic. # TODO: This model isn't available everywhere. We should # pass it in as a parameter. button = loader.loadModel('models/gui/toplevel_gui', okMissing = True) barImage = None if button: barImage = button.find('**/generic_button') self.letterboxTop = DirectFrame( parent = self.letterbox, guiId = 'letterboxTop', relief = DGG.FLAT, state = DGG.NORMAL, frameColor = (0, 0, 0, 1), borderWidth = (0, 0), frameSize = (-1, 1, 0, 0.2), pos = (0, 0, 0.8), image = barImage, image_scale = (2.25,1,.5), image_pos = (0,0,.1), image_color = (0.3,0.3,0.3,1), sortOrder = 0, ) self.letterboxBottom = DirectFrame( parent = self.letterbox, guiId = 'letterboxBottom', relief = DGG.FLAT, state = DGG.NORMAL, frameColor = (0, 0, 0, 1), borderWidth = (0, 0), frameSize = (-1, 1, 0, 0.2), pos = (0, 0, -1), image = barImage, image_scale = (2.25,1,.5), image_pos = (0,0,.1), image_color = (0.3,0.3,0.3,1), sortOrder = 0, ) # masad: always place these at the bottom of render self.letterboxTop.setBin('sorted',0) self.letterboxBottom.setBin('sorted',0) self.letterbox.reparentTo(render2d, -1) self.letterboxOff(0) def noLetterbox(self): """ Removes any current letterbox tasks and parents the letterbox polygon away """ if self.letterboxIval: self.letterboxIval.pause() self.letterboxIval = None if self.letterbox: self.letterbox.stash() def letterboxOn(self, t=0.25, finishIval=None): """ Move black bars in over t seconds. """ self.noLetterbox() self.loadLetterbox() self.letterbox.unstash() if (t == 0): self.letterboxBottom.setPos(0, 0, -1) self.letterboxTop.setPos(0, 0, 0.8) else: self.letterboxIval = Sequence(Parallel( LerpPosInterval(self.letterboxBottom, t, pos = Vec3(0, 0, -1), #startPos = Vec3(0, 0, -1.2), ), LerpPosInterval(self.letterboxTop, t, pos = Vec3(0, 0, 0.8), # startPos = Vec3(0, 0, 1), ), ), name = self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start() def letterboxOff(self, t=0.25, finishIval=None): """ Move black bars away over t seconds. """ self.noLetterbox() self.loadLetterbox() self.letterbox.unstash() if (t == 0): self.letterbox.stash() else: self.letterboxIval = Sequence(Parallel( LerpPosInterval(self.letterboxBottom, t, pos = Vec3(0, 0, -1.2), # startPos = Vec3(0, 0, -1), ), LerpPosInterval(self.letterboxTop, t, pos = Vec3(0, 0, 1), # startPos = Vec3(0, 0, 0.8), ), ), Func(self.letterbox.stash), Func(messenger.send,'letterboxOff'), name = self.letterboxTaskName, ) if finishIval: self.letterboxIval.append(finishIval) self.letterboxIval.start()
class DMDSpriteFont(object): def __init__(self, fontPath, parent, sX=1, sY=1, sZ=1): self.__container = DirectFrame( #text_pos=(0,1), pos=(0, 0, 0), relief=DGG.FLAT, frameColor=(1, 1, 1, 0.5)) self.__container.hide() self.__container.reparentTo(parent) self._planes = [] self.char_width = sX - 0.06 self.sX = sX self.sY = sY self.sZ = sZ self.x = 0 self.y = 0 self.z = 0 self.fontPath = fontPath self.textures = {} self.char_translation_map = {"%": "percent"} for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890%": if c in self.char_translation_map: char = self.char_translation_map[c] else: char = c if os.path.exists(os.path.join(self.fontPath, char + ".png")): logging.info("Loading font texture " + str(char)) self.textures[c] = base.loader.loadTexture( os.path.join(self.fontPath, char + ".png")) def _addPlane(self): plane = base.loader.loadModel('assets/models/plane') plane.setPos(self.x + ((len(self._planes) - 1) * self.char_width), self.y, self.z) #set its position plane.setScale(self.sX, self.sY, self.sZ) plane.reparentTo(self.__container) #reparent to render plane.setTransparency(1) plane.node().setEffect(BillboardEffect.makePointEye()) self._planes.append(plane) return plane def clear(self): for p in self._planes: p.removeNode() self._planes = [] def setText(self, str_text): self.clear() for c in str_text: if c in self.textures: plane = self._addPlane() plane.setTexture(self.textures[c], 1) def setPos(self, position): self.x = position[0] self.y = position[1] self.z = position[2] def hide(self): self.__container.hide() def show(self): self.__container.show()
class MagicMenu(IMenu): def __init__(self): frame = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 0, 0, 1.0)) IMenu.__init__(self, frame=frame) self.menuVerticalChoicesList = [] self.menuHorizontalChoices = [{ "event": "Chara-Sub", "text": "*" }, { "event": "Chara-Add", "text": "*" }] self.characterSheetList = [] self.characterSheetIndex = 0 self.statsSheet = None for hero in base.gameData.hero_party: self.characterSheetList.append(hero) self.addTitle() self.characterSheet = None self.displayCharacterSheet(self.characterSheetIndex) def createButton(self, text, index, eventArgs): btn = DirectRadioButton(text=text, text_align=TextNode.ALeft, scale=0.05, frameColor=(0, 0, 0, 0.0), pos=(base.a2dLeft + 0.075, 0, (0.3 - (index * .06))), variable=self.menuVerticalChoice, value=[index], text_fg=(1, 1, 1, 1), command=self.menuVerticalEvent) self.menuVerticalButtons.append(btn) btn.reparentTo(self.frameMain) def addTitle(self): self.title = OnscreenText('Magic Spells', 1, fg=(1, 0, 0, 1), pos=(base.a2dLeft + 0.7, 0.8), font=base.font_title, align=TextNode.ALeft, scale=.15, mayChange=1) self.title.reparentTo(self.frameMain) def cancelCommand(self): base.messenger.send("Back-Option") def updateInventory(self): if self.menuVerticalButtons: for btn in self.menuVerticalButtons: btn.removeNode() self.menuVerticalChoicesList = [] self.menuVerticalChoice = [0] chara = self.characterSheetList[self.characterSheetIndex] for magic in chara['magic']: magicInfo = y_helpers.find_by_id(magic, base.magicData.items) # need events to use items? self.menuVerticalChoicesList.append({ "event": "*", "text": magicInfo['name'] }) self.menuVerticalChoicesList.append({ "event": "Back-Option", "text": "Back to Menu" }) self.menuVerticalButtons = [] self.createVerticalButtons() self.magic_stats(0) def displayCharacterSheet(self, value): if self.characterSheet: self.characterSheet.detachNode() self.characterSheetIndex += value self.characterSheetIndex = max(0, self.characterSheetIndex) self.characterSheetIndex = min(self.characterSheetIndex, len(self.characterSheetList) - 1) chara = self.characterSheetList[self.characterSheetIndex] self.characterSheet = DirectLabel(scale=0.12, text_align=TextNode.ALeft, pos=(base.a2dLeft + 0.7, 0, 0.5), pad=(0.5, 0.5), frameColor=(0, 0, 0, 0.0), text=chara['name'], text_fg=(1, 1, 1, 1)) self.characterSheet.reparentTo(self.frameMain) self.updateInventory() def updateCheckbuttons(self): for btn in self.menuVerticalButtons: index = self.menuVerticalButtons.index(btn) isPressed = index == self.menuVerticalChoice[0] btn["indicatorValue"] = isPressed btn.setIndicatorValue() chara = self.characterSheetList[self.characterSheetIndex] if self.menuVerticalChoice[0] < len(chara['magic']): self.magic_stats(self.menuVerticalChoice[0]) for btn in self.menuHorizontalButtons: index = self.menuHorizontalButtons.index(btn) isPressed = index == self.menuHorizontalChoice[0] btn["indicatorValue"] = isPressed btn.setIndicatorValue() def magic_stats(self, index): if self.statsSheet: self.statsSheet.detachNode() self.statsSheet = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 1, 0, 0)) chara = self.characterSheetList[self.characterSheetIndex] magic = y_helpers.find_by_id(chara['magic'][index], base.magicData.items) stats = [ '{}'.format(magic['name']), '', 'Description: {}'.format(magic['description']), 'Costs: {}'.format(self.write_costs(magic['costs'])), 'Targets: {}'.format(magic['target']), ] for stat in stats: self.add_stat(stat, stats.index(stat)) self.statsSheet.reparentTo(self.frameMain) def write_costs(self, costs): output = '' for key in costs: output += '({} x {}) '.format(key, costs[key]) return output def add_stat(self, text, index): stat = DirectLabel(scale=0.07, text_align=TextNode.ALeft, pos=(base.a2dLeft + 0.7, 0, (0.3 - (index * .1))), pad=(0.5, 0.5), frameColor=(0, 0, 0, 0.0), text=text, text_fg=(1, 1, 1, 1)) stat.reparentTo(self.statsSheet)
def windowMaker(base, label): # find an open slot, if none, return false windict = dict() grid = None for i in range(grid_size[0]): for j in range(grid_size[1]): if occupied[i][j] == False: grid = (i, j) occupied[i][j] = True break else: continue break if not grid: return False windict['grid'] = grid position = grid_to_screen_pos(*grid) #open window newwin = base.openWindow(name=label) newwin.setWindowEvent(label + "-event") listener.accept(newwin.getWindowEvent(), windowEvent) windict['win'] = newwin #format window wp = WindowProperties() wp.setOrigin(*position) wp.setSize(*ws) newwin.requestProperties(wp) #make 3d-mousewatcher display region displayRegion = newwin.getDisplayRegion(0) displayRegion.setDimensions(.3, 1, 0, 1) mkNode = MouseAndKeyboard(newwin, 0, label + "_keyboard_mouse") mk = base.dataRoot.attachNewNode(mkNode) windict['mk'] = mk modis = ModifierButtons() modis.addButton(ButtonHandle('shift')) modis.addButton(ButtonHandle('control')) mwNode = MouseWatcher(label) mwNode.setModifierButtons(modis) mwNode.setDisplayRegion(displayRegion) mw = mk.attachNewNode(mwNode) windict['mw'] = mw bt = ButtonThrower(label + "_button_thrower") bt.setModifierButtons(modis) windict['bt'] = bt bt.setPrefix(label + "_") mw.attachNewNode(bt) #listen for default button events for button in buttons: listener.accept(bt.prefix + button, buttons[button]) #format render display region render_dr = newwin.getDisplayRegion(1) windict['render_dr'] = render_dr render_dr.setDimensions(.3, 1, 0, 1) #create a display region for Gui Elements gui_dr = newwin.makeDisplayRegion(0, .3, .3, 1) # gui_dr.setSort(20) mwNodegui = MouseWatcher(label + "gui") mwNodegui.setDisplayRegion(gui_dr) mwgui = mk.attachNewNode(mwNodegui) #create a 2d render/aspect for gui rendergui = NodePath('render2d') rendergui.setDepthWrite(0) rendergui.setMaterialOff(1) rendergui.setTwoSided(1) #set up aspect2d aspectgui = rendergui.attachNewNode(PGTop('aspectgui')) aspectgui.node().setMouseWatcher(mwgui.node()) #set up camera camNodegui = Camera("camNode2d") cameragui = rendergui.attachNewNode(camNodegui) cameragui.setPos(0, 0, 0) cameragui.setDepthTest(False) cameragui.setDepthWrite(False) lens = OrthographicLens() lens.setFilmSize(2, 2) lens.setNearFar(-1000, 1000) cameragui.node().setLens(lens) gui_dr.setCamera(cameragui) #make frame for gui frame = DirectFrame(frameSize=(-1, 1, -1, 1), frameColor=(.5, .5, .5, 1), relief='ridge') frame.reparentTo(aspectgui) frame.setTransparency(0) windict['gui_frame'] = frame #create Gui elements guibuttons = dict() # guibuttons['Create'] = label+"_mode_create" guibuttons['Preview'] = label + "_preview" # createButton(base, frame, .7, "Create", label+"_mode_create") createButton(base, frame, .7, "Preview", label + "_preview") windict['guibuttons'] = guibuttons #create a display region for math data preview preview_dr = newwin.makeDisplayRegion(0, .3, 0, .3) windict['preview_dr'] = preview_dr # preview_label = label+"_preview" # preview_mwNode = MouseWatcher(preview_label) # preview_mwNode.setDisplayRegion(preview_dr) # preview_mw = mk.attachNewNode(preview_mwNode) # preview_bt = ButtonThrower(preview_label+"_button_thrower") # preview_bt.setPrefix(preview_label+"_") # preview_mw.attachNewNode(preview_bt) # preview_dr.setSort(30) win_to_windict[newwin] = windict return windict
class GuiUnitInfo: def __init__(self, offset, parent, unit_type, default_hp, hp, default_ap, ap): self.offset = offset self.frame = DirectFrame( relief = DGG.FLAT , scale = 1 , frameSize = (-0.5, 0.5, 0, -0.5) , parent = parent ) self.frame.setBillboardPointEye() self.frame.setLightOff() self.frame.setBin("fixed", 40) self.frame.setDepthTest(False) self.frame.setDepthWrite(False) fixedWidthFont = loader.loadFont(GUI_FONT)#@UndefinedVariable #fixedWidthFont.setPixelsPerUnit(60) #fixedWidthFont.setRenderMode(fontt.RMSolid) if not fixedWidthFont.isValid(): print "pandaInteractiveConsole.py :: could not load the defined font %s" % str(self.font) fixedWidthFont = DGG.getDefaultFont() self.label = OnscreenText( parent = self.frame , text = "" , pos = (offset.getX(),offset.getZ()+0.1) , align=TextNode.ACenter , mayChange=True , scale=0.1 , fg = (1,0,0,1) #, shadow = (0, 0, 0, 1) #, frame = (200,0,0,1) ) self.label.setFont( fixedWidthFont ) #self.label.setLightOff() self.all_icons = {} self.visible_icons = {} self.addIcon("overwatch") self.addIcon("set_up") self.ap_bar = DirectWaitBar(parent = self.frame , text = "" , range = default_ap , value = ap , pos = (offset.getX()+0.08,0,offset.getZ()-0.27) , barColor = (0,0,1,1) , frameColor = (0,0,0.5,0.2) , scale = (0.3,0.5,0.3)) self.hp_bar = DirectWaitBar(parent = self.frame , text = "" , range = default_hp , value = hp , pos = (offset.getX()+0.08,0,offset.getZ()-0.2) , barColor = (0,1,0,1) , frameColor = (1,0,0,0.9) , scale = (0.3,0.5,0.3)) self.insignia = OnscreenImage(parent = self.frame ,image = "unit_" + unit_type + "_big_transparent_32.png" #,pos = (offset.getX(),0,offset.getZ()+0.14) , pos = (offset.getX() - 0.31,0,offset.getZ()-0.23) ,scale = 0.09) self.insignia.setTransparency(TransparencyAttrib.MAlpha) def addIcon(self, name): self.all_icons[name] = OnscreenImage(parent = self.frame ,image = name + "_icon.png" #,pos = offset + (0,0,-0.1) ,scale = 0.08) self.all_icons[name].setTransparency(TransparencyAttrib.MAlpha) self.all_icons[name].hide() def write(self, text): text = "" self.label.setText(text) def redraw(self): return def remove(self): self.frame.remove() def reparentTo(self, parent): self.frame.reparentTo(parent) def hide(self): self.label.hide() def show(self): self.label.show() def refreshBars(self, hp, ap): self.ap_bar['value'] = ap self.hp_bar['value'] = hp self.ap_bar.setValue() self.hp_bar.setValue() def refreshIcons(self): count = len(self.visible_icons) start_pos = (1 - count) * 0.25 / 2 for icon in self.all_icons: if icon in self.visible_icons: self.visible_icons[icon].setPos(self.offset + (start_pos, 0, -0.08)) self.visible_icons[icon].show() start_pos += 0.21 else: self.all_icons[icon].hide() def hideOverwatch(self): if "overwatch" in self.visible_icons: self.visible_icons.pop("overwatch") self.refreshIcons() def showOverwatch(self): self.visible_icons["overwatch"] = self.all_icons["overwatch"] self.refreshIcons() def hideSetUp(self): if "set_up" in self.visible_icons: self.visible_icons.pop("set_up") self.refreshIcons() def showSetUp(self): self.visible_icons["set_up"] = self.all_icons["set_up"] self.refreshIcons()
class CharacterSelection: def __init__(self): self.frameMain = DirectFrame(frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0.05, 0.05, 0.05, 1)) self.frameMain.setTransparency(1) width = abs(base.a2dLeft) + base.a2dRight red = loader.loadTexture("assets/gui/CharRedBG.png") red.setWrapU(Texture.WM_repeat) red.setWrapV(Texture.WM_repeat) self.char1Frame = DirectFrame(text="Player 1", text_fg=(1, 1, 1, 1), text_scale=0.1, text_pos=(0, base.a2dTop - 0.2), frameSize=(-width / 6.0, width / 6.0, base.a2dBottom, base.a2dTop), frameTexture=red, pos=(base.a2dLeft + width / 6.0, 0, 0)) self.char1Frame.updateFrameStyle() self.char1Frame.setTransparency(1) self.char1Frame.reparentTo(self.frameMain) blue = loader.loadTexture("assets/gui/CharBlueBG.png") blue.setWrapU(Texture.WM_repeat) blue.setWrapV(Texture.WM_repeat) self.char2Frame = DirectFrame(text="Player 2", text_fg=(1, 1, 1, 1), text_scale=0.1, text_pos=(0, base.a2dTop - 0.2), frameSize=(-width / 6.0, width / 6.0, base.a2dBottom, base.a2dTop), frameTexture=blue, pos=(base.a2dRight - width / 6.0, 0, 0)) self.char2Frame.setTransparency(1) self.char2Frame.reparentTo(self.frameMain) self.footerFrame = DirectFrame(text="PLAYER 1 - CHOOSE YOUR CHARACTER", text_fg=(1, 1, 1, 1), text_scale=0.08, text_pos=(0, -0.03), frameSize=(base.a2dLeft, base.a2dRight, 0.1, -0.1), pos=(0, 0, base.a2dBottom + 0.2), frameColor=(0, 0, 0, 0.5)) self.footerFrame.setTransparency(1) self.footerFrame.reparentTo(self.frameMain) self.charSelectFrame = DirectFrame( text="VS", text_fg=(1, 1, 1, 1), text_scale=0.1, text_pos=(0, base.a2dTop - 0.2), frameSize=(-width / 6.0, width / 6.0, base.a2dBottom, base.a2dTop), frameColor=(0, 0, 0, 0)) self.charSelectFrame.reparentTo(self.frameMain) self.btnChar1 = self.createCharacterButton( (-0.2, 0, 0), "assets/gui/Char1Button.png", 1) self.btnChar1.reparentTo(self.charSelectFrame) self.btnChar2 = self.createCharacterButton( (0.2, 0, 0), "assets/gui/Char2Button.png", 2) self.btnChar2.reparentTo(self.charSelectFrame) self.btnBack = DirectButton(text="BACK", text_fg=(1, 1, 1, 1), text_align=TextNode.ALeft, scale=0.1, pad=(0.15, 0.15), pos=(base.a2dLeft + 0.08, 0, -0.03), frameColor=((0.2, 0.2, 0.2, 0.8), (0.4, 0.4, 0.4, 0.8), (0.4, 0.4, 0.4, 0.8), (0.1, 0.1, 0.1, 0.8)), relief=1, command=base.messenger.send, extraArgs=["CharSelection-Back"], pressEffect=False, rolloverSound=None, clickSound=None) self.btnBack.setTransparency(1) self.btnBack.reparentTo(self.footerFrame) self.btnStart = DirectButton(text="START", text_fg=(1, 1, 1, 1), text_align=TextNode.ARight, scale=0.1, pad=(0.15, 0.15), pos=(base.a2dRight - 0.08, 0, -0.03), relief=1, frameColor=((0.2, 0.2, 0.2, 0.8), (0.4, 0.4, 0.4, 0.8), (0.4, 0.4, 0.4, 0.8), (0.1, 0.1, 0.1, 0.8)), command=base.messenger.send, extraArgs=["CharSelection-Start"], pressEffect=False, rolloverSound=None, clickSound=None) self.btnStart.setTransparency(1) self.btnStart.reparentTo(self.footerFrame) self.btnStart["state"] = DGG.DISABLED self.hide() def createCharacterButton(self, pos, image, charNr): btn = DirectButton(scale=0.1, relief=0, frameColor=(0, 0, 0, 0), pos=pos, image=image, command=self.selectCharacter, extraArgs=[charNr], rolloverSound=None, clickSound=None) btn.setTransparency(1) return btn def selectCharacter(self, charNr): if self.char1Frame["image"] == None: self.char1Frame["image"] = "assets/gui/Char{}_L.png".format(charNr) self.char1Frame["image_scale"] = (0.5, 1, 1) self.selectedCharacter1 = charNr self.footerFrame["text"] = "PLAYER 2 - CHOOSE YOUR CHARACTER" elif self.char2Frame["image"] == None: self.char2Frame["image"] = "assets/gui/Char{}_R.png".format(charNr) self.char2Frame["image_scale"] = (0.5, 1, 1) self.selectedCharacter2 = charNr self.btnStart["state"] = DGG.NORMAL self.footerFrame["text"] = "START THE FIGHT >" def show(self): self.selectedCharacter1 = None self.selectedCharacter2 = None self.char1Frame["image"] = None self.char2Frame["image"] = None self.footerFrame["text"] = "PLAYER 1 - CHOOSE YOUR CHARACTER" self.btnStart["state"] = DGG.DISABLED self.frameMain.show() def hide(self): self.frameMain.hide()
class FileDialog(DirectObject): def __init__(self, title, initial_status, callback): self.frmLeft = -.7 self.frmBottom = -.12 self.frmRight = .7 self.frmTop = .12 self.frmWidth = self.frmRight - self.frmLeft self.frmHeight = self.frmTop - self.frmBottom self.title = title self.initial_status = initial_status self.callback = callback self.result = None self.done = 0 def activate(self): # create main dialog frame # Note: frame position references the CENTER of the frame self.frm = DirectFrame( pos = (0,0,0), frameSize = (self.frmLeft, self.frmRight,self.frmBottom, self.frmTop), relief = DGG.RIDGE, borderWidth = (0.01, 0.01), frameColor = (0.6, 0.6, 0.6, 1.0)) self.frm.reparentTo(base.aspect2d) # Note: wonderfully enough, label position on the other hand # references the CENTER of the LEFT border of the label! titleLabel = DirectLabel(text = self.title, scale = 0.04, frameColor = (0.5, 0.5, 0.5, 1), relief = DGG.RIDGE, borderWidth = (0.01, 0.01), text_align = TextNode.ALeft) titleLabel.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.045) titleLabel.reparentTo(self.frm) sc = .04 self.dir_edit_field = DirectEntry( text = '', # prompt text scale = sc, frameColor = (0.65, 0.65, 0.65, 1), command=self.setText, width = 32, numLines = 1, focus = 1, focusInCommand=self.efFocusIn, ) self.dir_edit_field.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.13) self.dir_edit_field.reparentTo(self.frm) self.statusLabel = DirectLabel(text = self.initial_status, scale = 0.04, frameColor = (0.6, 0.6, 0.6, 1), # relief = DGG.RIDGE, # borderWidth = (0.01, 0.01), text_align = TextNode.ALeft) self.statusLabel.setPos(-self.frmWidth/2+.02, 0, self.frmHeight/2-.2) self.statusLabel.reparentTo(self.frm) # call this if you need to run a form before your mainloop starts steppping the taskMgr def run(self): while self.done != 1: taskMgr.step() taskMgr.step() # once more to make the last output from the dialog visible # while we load a zone self.frm.removeNode() def end(self): self.frm.removeNode() # callback function to set text: called by the Panda3d taskMgr when the user # has entered something into the DirectEntry widget def setText(self, textEntered): print 'dir_edit_field::setText:', textEntered self.done = self.callback(textEntered) if self.done != 1: self.dir_edit_field['focus'] = 1 #clear the text def efFocusIn(self): print 'focus in' self.dir_edit_field.enterText('') def setStatus(self, status): self.statusLabel['text'] = status
class GUIDialog: def __init__(self): self.mainFrame = DirectFrame(frameColor=(0, 0, 0, 0.5), borderWidth=(10, 10), frameSize=(-2, 2, -1, -0.45)) self.textIndex = 0 self.isCalling = False self.frameText = None self.frameActor = None self.frameChoices = None self.textList = [] self.hide() def setLabel(self, labelName): base.textEngine.setTextLabel(labelName) self.textList = base.textEngine.getDialogue() self.processLine(self.textList[self.textIndex]) def processLine(self, line): if line['type'] == 'text': self.dialogueLine(line) elif line['type'] == 'menu': self.choiceLine(line) def choiceLine(self, lineObj): self.setFrameText(lineObj['text']) self.setFrameChoices(lineObj) self.show() def dialogueLine(self, lineObj): self.setFrameActor(lineObj['actor']) self.setFrameText(lineObj['line']) self.show() def showMessage(self, txt): self.setFrameText(txt) self.show() def setFrameChoices(self, lineObj): base.resetButtons() if self.frameChoices: self.frameChoices.quit() optionsList = lineObj['options'] self.frameChoices = GUIDialogOptions(optionsList) self.frameChoices.reparentTo(self.mainFrame) taskMgr.add(self.frameChoices.readKeys, "readKeysTask") for option in optionsList: index = optionsList.index(option) base.accept("TextChoice-{}".format(index), self.chooseOption, [lineObj, index]) def destroyFrameChoices(self, optionsList): self.frameChoices.quit() self.frameChoices = None taskMgr.remove("readKeysTask") for option in optionsList: index = optionsList.index(option) base.ignore("TextChoice-{}".format(index)) def chooseOption(self, lineObj, index): base.textEngine.chooseFromMenu(lineObj, index) self.destroyFrameChoices(lineObj['options']) self.textList = base.textEngine.getDialogue() self.textIndex = 0 self.processLine(self.textList[self.textIndex]) def setFrameActor(self, text): if self.frameActor: self.frameActor.detach_node() self.frameActor = OnscreenText(text=text, pos=(-1.2, -0.55), scale=0.07, wordwrap=35, mayChange=False, align=TextNode.ALeft, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), shadowOffset=(0.05, 0.05)) self.frameActor.reparentTo(self.mainFrame) def setFrameText(self, text): if self.frameText: self.frameText.detach_node() self.frameText = OnscreenText(text=text, pos=(-1.2, -0.65), scale=0.07, wordwrap=35, mayChange=False, align=TextNode.ALeft, fg=(1, 1, 1, 1), shadow=(0, 0, 0, 1), shadowOffset=(0.05, 0.05)) self.frameText.reparentTo(self.mainFrame) def show(self): self.mainFrame.show() def hide(self): self.mainFrame.hide() if self.frameText: self.frameText.detach_node() if self.frameActor: self.frameActor.detach_node() self.textIndex = 0 self.frameText = None def next(self): if not self.isCalling: self.isCalling = True taskMgr.doMethodLater(.1, self.nextText, 'Next Text') def nextText(self, task): if self.textIndex < len(self.textList) - 1: self.textIndex += 1 self.processLine(self.textList[self.textIndex]) else: self.hide() self.isCalling = False return task.done @property def isShowing(self): return self.frameText != None @property def isChoices(self): return self.frameChoices != None def reparentTo(self, target): self.mainFrame.reparentTo(target) def removeNode(self): self.mainFrame.removeNode()
class CIProgressScreen: def __init__(self): self.defaultLogoScale = 0.85 self.defaultLogoZ = 0.65 self.bgm = loader.loadModel('phase_3/models/gui/progress-background.bam') self.bgm.find('**/logo').stash() self.bg = self.bgm.find('**/bg') self.logo = loader.loadTexture('phase_3/maps/CogInvasion_Logo.png') self.logoNode = hidden.attachNewNode('logoNode') self.logoNode.setScale(self.defaultLogoScale) self.logoNode.setPos(0, self.defaultLogoZ, 0) self.logoImg = OnscreenImage(image=self.logo, scale=(0.685, 0, 0.3), parent=self.logoNode) self.logoImg.setTransparency(True) self.bg_img = OnscreenImage(image=self.bg, parent=hidden) self.bg_img.setSx(1.35) self.bg_img.hide() self.progress_bar = DirectWaitBar(value=0, pos=(0, 0, -0.85), parent=hidden, text_pos=(0, 0, 0.2)) self.progress_bar.setSx(1.064) self.progress_bar.setSz(0.38) toontipgui = loader.loadModel('phase_3.5/models/gui/stickerbook_gui.bam') poster = toontipgui.find('**/questCard') self.toontipFrame = DirectFrame(image=poster, image_scale=(1.4, 1, 1), parent=hidden, relief=None, pos=(0, 0, -0.1), scale=0.85) self.toontipLbl = OnscreenText(text='', parent=self.toontipFrame, fg=(0.35, 0.35, 0.35, 1), font=CIGlobals.getToonFont(), wordwrap=14.5, pos=(-0.59, 0.25), align=TextNode.ALeft, scale=0.08) self.loading_lbl = DirectLabel(text='', relief=None, scale=0.08, pos=(-1.0725, 0, -0.79), text_align=TextNode.ALeft, sortOrder=100, text_fg=(0.343, 0.343, 0.343, 1.0), text_font=CIGlobals.getMinnieFont(), parent=hidden, text_shadow=(0, 0, 0, 1)) return def begin(self, hood, range, wantGui): render.hide() self.renderFrames() base.setBackgroundColor(0, 0, 0) if hood == 'localAvatarEnterGame': self.loading_lbl['text'] = 'Entering...' else: if hood == 'init': self.loading_lbl['text'] = 'Loading...' else: self.loading_lbl['text'] = 'Heading to %s...' % hood self.progress_bar['barColor'] = (0.343, 0.343, 0.343, 1.0) self.progress_bar['range'] = range self.bgm.reparentTo(aspect2d) self.bg.reparentTo(render2d) self.bg_img.reparentTo(hidden) self.loading_lbl.reparentTo(aspect2d) self.logoNode.reparentTo(aspect2d) self.progress_bar.reparentTo(aspect2d) tip = random.choice(CIGlobals.ToonTips) self.toontipLbl.setText('TOON TIP:\n' + tip) self.toontipFrame.reparentTo(aspect2d) self.__count = 0 self.__expectedCount = range self.progress_bar.update(self.__count) def renderFramesTask(self, task): self.renderFrames() return task.cont def end(self): base.setBackgroundColor(CIGlobals.DefaultBackgroundColor) taskMgr.remove('renderFrames') render.show() self.progress_bar.finish() self.bg_img.reparentTo(hidden) self.logoNode.reparentTo(hidden) self.bg.reparentTo(hidden) self.bgm.reparentTo(hidden) self.loading_lbl.reparentTo(hidden) self.progress_bar.reparentTo(hidden) self.toontipFrame.reparentTo(hidden) self.renderFrames() def destroy(self): self.bg.removeNode() del self.bg self.bgm.removeNode() del self.bgm self.bg_img.destroy() self.loading_lbl.destroy() self.progress_bar.destroy() self.bgm.destroy() del self.bg_img del self.loading_lbl del self.progress_bar del self.bgm def renderFrames(self): base.graphicsEngine.renderFrame() base.graphicsEngine.renderFrame() def tick(self): self.__count += 1 self.progress_bar.update(self.__count)
class Archive: """docstring for Archive""" def __init__(self): self.archivesShotMsg = [] self.frameArchive = DirectFrame(image="gui/BackGround_a.png", image_scale=(1.7778, 1, 1), frameSize=(base.a2dLeft, base.a2dRight, base.a2dBottom, base.a2dTop), frameColor=(0, 0, 0, 0)) self.frameArchive.setTransparency(1) ArchiveFrameTexture = loader.loadTexture("gui/ArchiveFrameBG.png") self.frameArchive1 = DirectFrame( frameTexture=ArchiveFrameTexture, frameSize=(-1.4, -0.6, base.a2dBottom + 0.5, base.a2dTop - 0.4), frameColor=(1, 1, 1, 0.5), ) self.frameArchive1.reparentTo(self.frameArchive) self.frameArchive2 = DirectFrame(frameSize=(-0.4, 0.4, base.a2dBottom + 0.5, base.a2dTop - 0.4), frameColor=(1, 1, 1, 0.5), frameTexture=ArchiveFrameTexture) self.frameArchive2.reparentTo(self.frameArchive) self.frameArchive3 = DirectFrame(frameSize=(0.6, 1.4, base.a2dBottom + 0.5, base.a2dTop - 0.4), frameColor=(1, 1, 1, 0.5), frameTexture=ArchiveFrameTexture) self.frameArchive3.reparentTo(self.frameArchive) self.v = [0] self.archiveImg = loader.loadTexture("gui/ArchiveImg.png") self.questionMark = loader.loadTexture("gui/QuestionMark.jpg") self.pictures = [ DirectFrame(frameSize=(-1.3, -0.7, base.a2dBottom + 0.9, base.a2dTop - 0.5), frameColor=(1, 1, 1, 1), frameTexture=self.questionMark), DirectFrame(frameSize=(-0.3, 0.3, base.a2dBottom + 0.9, base.a2dTop - 0.5), frameColor=(1, 1, 1, 1), frameTexture=self.questionMark), DirectFrame(frameSize=(0.7, 1.3, base.a2dBottom + 0.9, base.a2dTop - 0.5), frameColor=(1, 1, 1, 1), frameTexture=self.questionMark) ] self.pictures[0].reparentTo(self.frameArchive1) self.pictures[1].reparentTo(self.frameArchive2) self.pictures[2].reparentTo(self.frameArchive3) self.buttons = [ DirectRadioButton(variable=self.v, value=[0], scale=0.05, pos=(-0.98, 0, base.a2dTop - 1.4), command=self.updateUI), DirectRadioButton(variable=self.v, value=[1], scale=0.05, pos=(0.02, 0, base.a2dTop - 1.4), command=self.updateUI), DirectRadioButton(variable=self.v, value=[2], scale=0.05, pos=(1.02, 0, base.a2dTop - 1.4), command=self.updateUI) ] self.buttons[0].reparentTo(self.frameArchive1) self.buttons[1].reparentTo(self.frameArchive2) self.buttons[2].reparentTo(self.frameArchive3) for button in self.buttons: button.setOthers(self.buttons) titles0 = [ OnscreenText(scale=.05, align=TextNode.ACenter, pos=(-1.0, base.a2dBottom + 0.85), text="time", fg=(0, 0, 0, 1)), OnscreenText(scale=.05, align=TextNode.ACenter, pos=(-1.0, base.a2dBottom + 0.8), text="room", fg=(0, 0, 0, 1)), # DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(-1.1, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1)) ] titles0[0].hide() titles0[1].hide() # titles0[0].reparentTo(self.frameArchive1) # titles0[1].reparentTo(self.frameArchive1) # titles0[2].reparentTo(self.frameArchive1) titles1 = [ OnscreenText(scale=.05, align=TextNode.ACenter, pos=(-0.0, base.a2dBottom + 0.85), text="time", fg=(0, 0, 0, 1)), OnscreenText(scale=.05, align=TextNode.ACenter, pos=(-0.0, base.a2dBottom + 0.8), text="room", fg=(0, 0, 0, 1)), # DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(-0.1, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1)) ] titles1[0].hide() titles1[1].hide() # titles1[0].reparentTo(self.frameArchive2) # titles1[1].reparentTo(self.frameArchive2) # titles1[2].reparentTo(self.frameArchive2) titles2 = [ OnscreenText(scale=.05, align=TextNode.ACenter, pos=(1, base.a2dBottom + 0.85), text="time", fg=(0, 0, 0, 1)), OnscreenText(scale=.05, align=TextNode.ACenter, pos=(1, base.a2dBottom + 0.8), text="room", fg=(0, 0, 0, 1)), # DirectLabel(frameColor = (0, 0, 0, 0),scale = .05, align = TextNode.ALeft, pos=(0.9, 0, base.a2dBottom+0.75), text="attribute", fg = (0,0,0,1)) ] titles2[0].hide() titles2[1].hide() # titles2[0].reparentTo(self.frameArchive3) # titles2[1].reparentTo(self.frameArchive3) # titles2[2].reparentTo(self.frameArchive3) self.title = [titles0, titles1, titles2] self.btn_load = self.createButton("Load", -0.6, ["LoadArchive"]) self.btn_delete = self.createButton("Delete", -0.8, ["DeleteArchive"]) self.btn_newgame = self.createButton("NewGame", -0.7, ["NewGame"]) self.hide() def createButton(self, text, horizontalPos, eventArgs): sound = loader.loadSfx("Audio/click.wav") maps = loader.loadModel("gui/button_map") btnGeom = (maps.find("**/btn_ready"), maps.find("**/btn_click"), maps.find("**/btn_rollover"), maps.find("**/btn_disabled")) btn = DirectButton( text=text, text_fg=(1, 1, 1, 1), text_scale=0.05, text_pos=(0.125, -0.013), text_align=TextNode.ALeft, scale=2, geom=btnGeom, pos=(base.a2dRight - 0.6, 0, horizontalPos), # pos = (horizontalPos, 0, -.7), relief=0, frameColor=(0, 0, 0, 0), command=base.messenger.send, extraArgs=eventArgs, pressEffect=True, rolloverSound=None, clickSound=sound) btn.reparentTo(self.frameArchive) return btn def updateUI(self): if len(self.archivesShotMsg) == 0: base.messenger.send("UpdateArchive") else: if len(self.archivesShotMsg[self.v[0]]) == 0: self.btn_delete.hide() self.btn_load.hide() self.btn_newgame.show() else: self.btn_delete.show() self.btn_load.show() self.btn_newgame.hide() def show(self, archiveListShortMsg): self.archivesShotMsg = archiveListShortMsg for index in range(3): self.title[index][0].show() self.title[index][1].show() if len(self.archivesShotMsg[index]) == 0: self.pictures[index]["frameTexture"] = self.questionMark self.title[index][0].setText("?") self.title[index][1].setText("?") else: self.pictures[index]["frameTexture"] = self.archiveImg self.title[index][0].setText( "createTime : " + str(archiveListShortMsg[index]["timestamp"])) self.title[index][1].setText( "currRoom : " + str(archiveListShortMsg[index]["currRoom"])) self.updateUI() self.frameArchive.show() def hide(self): for index in range(3): self.title[index][0].hide() self.title[index][1].hide() self.frameArchive.hide()
class LevelSelection: def __init__(self): self.frameMain = DirectFrame( frameSize = (base.a2dLeft, base.a2dRight, base.a2dTop, base.a2dBottom), frameColor = (0.05, 0.05, 0.05, 1)) self.frameMain.setTransparency(1) self.btnLevel1 = self.createLevelButton( (-0.6, 0, 0.15), "assets/gui/Level1Button.png", 1) self.btnLevel1.reparentTo(self.frameMain) self.btnLevel2 = self.createLevelButton( (0.6, 0, 0.15), "assets/gui/Level2Button.png", 2) self.btnLevel2.reparentTo(self.frameMain) self.footerFrame = DirectFrame( text = "SELECT THE ARENA", text_fg = (1,1,1,1), text_scale = 0.08, text_pos = (0, -0.03), frameSize = (base.a2dLeft, base.a2dRight, -0.1, 0.1), pos = (0, 0, base.a2dBottom + 0.2), frameColor = (0, 0, 0, 0.5)) self.footerFrame.setTransparency(1) self.footerFrame.reparentTo(self.frameMain) self.btnBack = DirectButton( text = "BACK", text_fg = (1,1,1,1), text_align = TextNode.ALeft, scale = 0.1, pad = (0.15, 0.15), pos = (base.a2dLeft + 0.08, 0, -0.03), frameColor = ( (0.2,0.2,0.2,0.8), (0.4,0.4,0.4,0.8), (0.4,0.4,0.4,0.8), (0.1,0.1,0.1,0.8), ), relief = 1, command = base.messenger.send, extraArgs = ["LevelSelection-Back"], pressEffect = False, rolloverSound = None, clickSound = None) self.btnBack.setTransparency(1) self.btnBack.reparentTo(self.footerFrame) self.hide() def createLevelButton(self, pos, image, levelNr): btn = DirectButton( scale = (0.5, 1, 0.75), relief = 0, frameColor = (0,0,0,0), pos = pos, image = image, command = self.selectLevel, extraArgs = [levelNr], rolloverSound = None, clickSound = None) btn.setTransparency(1) return btn def selectLevel(self, level): self.selectedLevel = level base.messenger.send("LevelSelection-Start") def show(self): self.frameMain.show() def hide(self): self.frameMain.hide()