class Highscore(): def __init__(self): home = os.path.expanduser("~") quickJNRDir = os.path.join(home, ".quickShooter") if not os.path.exists(quickJNRDir): os.makedirs(quickJNRDir) self.highscorefile = os.path.join(quickJNRDir, "highscore.txt") self.highscore = [] if not os.path.exists(self.highscorefile): with open(self.highscorefile, "w") as f: f.write("""Foxy;4000 Wolf;3500 Coon;3000 Kitty;2020 Ferret;2000 Lynx;1700 Lion;1280 Tiger;800 Birdy;450 Fishy;250""") with open(self.highscorefile, "r+") as f: data = f.readlines() for line in data: name = line.split(";")[0] pts = line.split(";")[1] self.highscore.append([name, pts]) self.lstHighscore = DirectScrolledList( frameSize = (-1, 1, -0.6, 0.6), frameColor = (0,0,0,0.5), pos = (0, 0, 0), numItemsVisible = 10, itemMakeFunction = self.__makeListItem, itemFrame_frameSize = (-0.9, 0.9, 0.0, -1), itemFrame_color = (1, 1, 1, 0), itemFrame_pos = (0, 0, 0.5)) self.btnBack = DirectButton( # size of the button scale = (0.15, 0.15, 0.15), text = "Back", # set no relief relief = None, frameColor = (0,0,0,0), # No sink in when press pressEffect = False, # position on the window pos = (0.2, 0, 0.1), # the event which is thrown on clickSound command = self.btnBack_Click, # sounds that should be played rolloverSound = None, clickSound = None) self.btnBack.setTransparency(1) self.btnBack.reparentTo(base.a2dBottomLeft) self.refreshList() self.hide() def show(self): self.lstHighscore.show() self.btnBack.show() def hide(self): self.lstHighscore.hide() self.btnBack.hide() def writeHighscore(self): self.__sortHigscore() with open(self.highscorefile, "w") as f: for entry in self.highscore: f.write("{0};{1}".format(entry[0], entry[1])) def refreshList(self): self.__sortHigscore() self.lstHighscore.removeAllItems() for entry in self.highscore: self.lstHighscore.addItem("{0};{1}".format(entry[0], entry[1])) def __makeListItem(self, highscoreItem, stuff, morestuff): name = highscoreItem.split(";")[0] pts = highscoreItem.split(";")[1] # left l = -0.9 # right r = 0.9 itemFrame = DirectFrame( frameColor=(1, 1, 1, 0.5), frameSize=(l, r, -0.1, 0), relief=DGG.SUNKEN, borderWidth=(0.01, 0.01), pos=(0, 0, 0)) lblName = DirectLabel( pos=(l + 0.01, 0, -0.07), text=name, text_align=TextNode.ALeft, scale=0.07, frameColor=(0, 0, 0, 0)) lblPts = DirectLabel( pos=(r - 0.01, 0, -0.07), text=pts, text_align=TextNode.ARight, scale=0.07, frameColor=(0, 0, 0, 0)) lblName.reparentTo(itemFrame) lblPts.reparentTo(itemFrame) return itemFrame def __sortHigscore(self): self.highscore = sorted( self.highscore, key=lambda score: int(score[1]), reverse=True)[:10] def setPoints(self, name, points): self.highscore.append([name, str(points) + "\n"]) self.refreshList() self.writeHighscore() def btnBack_Click(self): self.hide() base.messenger.send("Highscore_back")
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")