Beispiel #1
0
 def __init__(self, menu_args, user):
     Subject.__init__(self)
     GameObject.__init__(self)
     self.user = user
     self.dialog = YesNoDialog(
         base.a2dBottomLeft,
         text=_('%s wants to be a (XMPP) friend of you, do you agree?') %
         user,
         text_wordwrap=16,
         text_fg=menu_args.text_active,
         text_font=menu_args.font,
         pad=(.03, .03),
         topPad=0,
         midPad=.01,
         relief=FLAT,
         frameColor=(.8, .8, .8, .9),
         button_relief=FLAT,
         button_frameColor=(.2, .2, .2, .2),
         button_text_fg=menu_args.text_active,
         button_text_font=menu_args.font,
         buttonValueList=['yes', 'no'],
         command=self.on_btn)
     size = self.dialog['frameSize']
     self.dialog.set_pos(-size[0] + .05, 1, -size[2] + .05)
     self.eng.log('created dialog ' + self.dialog['text'])
Beispiel #2
0
 def save(self, doSave):
     if doSave:
         path = self.browser.get()
         path = os.path.expanduser(path)
         path = os.path.expandvars(path)
         if os.path.exists(path):
             self.dlgOverwrite = YesNoDialog(
                 text="File already Exist.\nOverwrite?",
                 relief=DGG.RIDGE,
                 frameColor=(1, 1, 1, 1),
                 frameSize=(-0.5, 0.5, -0.3, 0.2),
                 sortOrder=1,
                 button_relief=DGG.FLAT,
                 button_frameColor=(0.8, 0.8, 0.8, 1),
                 command=self.__executeSave,
                 extraArgs=[path],
                 scale=300,
                 pos=(base.getSize()[0] / 2, 0, -base.getSize()[1] / 2),
                 parent=base.pixel2d)
             self.dlgOverwriteShadow = DirectFrame(
                 pos=(base.getSize()[0] / 2 + 10, 0,
                      -base.getSize()[1] / 2 - 10),
                 sortOrder=0,
                 frameColor=(0, 0, 0, 0.5),
                 frameSize=self.dlgOverwrite.bounds,
                 scale=300,
                 parent=base.pixel2d)
             self.dlgOverwrite.setBin("gui-popup", 1)
         else:
             self.__executeSave(True, path)
         base.messenger.send("setLastPath", [path])
     self.browser.destroy()
     del self.browser
Beispiel #3
0
    def canInitiateFight(self):
        if self.dlgStartFight is not None: return
        base.messenger.send("canInitiateFight")

        self.dlgStartFight = YesNoDialog(state='normal',
                                         text='Start Fight?',
                                         fadeScreen=True,
                                         command=self.doInitiateFight)
Beispiel #4
0
class Save:
    def __init__(self, nodes, connections, exceptionSave=False):
        self.dlgOverwrite = None
        self.dlgOverwriteShadow = None
        self.jsonElements = JSONTools().get(nodes, connections)

        if exceptionSave:
            tmpPath = os.path.join(tempfile.gettempdir(),
                                   "NEExceptionSave.json")
            self.__executeSave(True, tmpPath)
            logging.info("Wrote crash session file to {}".format(tmpPath))
        else:
            self.browser = DirectFolderBrowser(self.save,
                                               True,
                                               defaultFilename="project.json")

    def save(self, doSave):
        if doSave:
            path = self.browser.get()
            path = os.path.expanduser(path)
            path = os.path.expandvars(path)
            if os.path.exists(path):
                self.dlgOverwrite = YesNoDialog(
                    text="File already Exist.\nOverwrite?",
                    relief=DGG.RIDGE,
                    frameColor=(1, 1, 1, 1),
                    frameSize=(-0.5, 0.5, -0.3, 0.2),
                    sortOrder=1,
                    button_relief=DGG.FLAT,
                    button_frameColor=(0.8, 0.8, 0.8, 1),
                    command=self.__executeSave,
                    extraArgs=[path],
                    scale=300,
                    pos=(base.getSize()[0] / 2, 0, -base.getSize()[1] / 2),
                    parent=base.pixel2d)
                self.dlgOverwriteShadow = DirectFrame(
                    pos=(base.getSize()[0] / 2 + 10, 0,
                         -base.getSize()[1] / 2 - 10),
                    sortOrder=0,
                    frameColor=(0, 0, 0, 0.5),
                    frameSize=self.dlgOverwrite.bounds,
                    scale=300,
                    parent=base.pixel2d)
                self.dlgOverwrite.setBin("gui-popup", 1)
            else:
                self.__executeSave(True, path)
            base.messenger.send("setLastPath", [path])
        self.browser.destroy()
        del self.browser

    def __executeSave(self, overwrite, path):
        if self.dlgOverwrite is not None: self.dlgOverwrite.destroy()
        if self.dlgOverwriteShadow is not None:
            self.dlgOverwriteShadow.destroy()
        if not overwrite: return

        with open(path, 'w') as outfile:
            json.dump(self.jsonElements, outfile, indent=2)
Beispiel #5
0
 def askForRequeue(self):
     buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
     okImageList = (buttons.find('**/ChtBx_OKBtn_UP'),
                    buttons.find('**/ChtBx_OKBtn_DN'),
                    buttons.find('**/ChtBx_OKBtn_Rllvr'))
     cancelImageList = (buttons.find('**/CloseBtn_UP'),
                        buttons.find('**/CloseBtn_DN'),
                        buttons.find('**/CloseBtn_Rllvr'))
     buttons.removeNode()
     self.cr.mainMenu.buttons[0]['state'] = DISABLED
     self.requeueFrame = DirectFrame(
         relief=None,
         image=loader.loadModel('phase_13/models/gui/fade'),
         image_scale=(5, 2, 2),
         image_color=(0, 0, 0, 0.3),
         image_pos=(0.5, 0, 0),
         state=NORMAL,
         sortOrder=20)
     self.requeueDialog = YesNoDialog(
         parent=self.requeueFrame,
         text='Would you like to requeue?',
         button_text_pos=(0, -0.1),
         button_relief=None,
         buttonImageList=[okImageList, cancelImageList],
         button_text_font=FONT,
         text_font=FONT,
         command=self.requeueResponse)
Beispiel #6
0
 def __init__(self, menu_props, from_, roomname):
     Subject.__init__(self)
     GameObject.__init__(self)
     self.from_ = from_
     self.roomname = roomname
     self.dialog = YesNoDialog(
         base.a2dBottomLeft,
         text=_('%s has invited you to a match, do you agree?') % from_,
         text_wordwrap=16,
         text_fg=menu_props.text_active_col,
         text_font=menu_props.font,
         pad=(.03, .03),
         topPad=0,
         midPad=.01,
         relief=FLAT,
         frameColor=(.8, .8, .8, .9),
         button_relief=FLAT,
         button_frameColor=(.2, .2, .2, .2),
         button_text_fg=menu_props.text_active_col,
         button_text_font=menu_props.font,
         buttonValueList=['yes', 'no'],
         command=self.on_btn)
     size = self.dialog['frameSize']
     self.dialog.set_pos(-size[0] + .05, 1, -size[2] + .05)
     self.eng.log('created dialog ' + self.dialog['text'])
Beispiel #7
0
 def createYesNoDialog(self, parent=None):
     parent = self.getEditorRootCanvas() if parent is None else parent
     pos = self.editorCenter if parent == self.getEditorRootCanvas() else (0,0,0)
     if self.visEditorInAspect2D:
         element = YesNoDialog(
             text="Yes/No Dialog",
             state = DGG.NORMAL,
             parent=parent)
     else:
         element = YesNoDialog(
             text="Yes/No Dialog",
             state=DGG.NORMAL,
             scale=300,
             pos=pos,
             parent=parent)
     elementInfo = ElementInfo(element, "YesNoDialog")
     self.setupBind(elementInfo)
     return elementInfo
Beispiel #8
0
class FriendDialog(GameObject, Subject):

    def __init__(self, menu_props, user):
        Subject.__init__(self)
        GameObject.__init__(self)
        self.user = user
        self.dialog = YesNoDialog(
            base.a2dBottomLeft,
            text=_('%s wants to be a (XMPP) friend of you, do you agree?') % user,
            text_wordwrap=16,
            text_fg=menu_props.text_active_col,
            text_font=menu_props.font,
            pad=(.03, .03),
            topPad=0,
            midPad=.01,
            relief=FLAT,
            frameColor=(.8, .8, .8, .9),
            button_relief=FLAT,
            button_frameColor=(.2, .2, .2, .2),
            button_text_fg=menu_props.text_active_col,
            button_text_font=menu_props.font,
            buttonValueList=['yes', 'no'],
            command=self.on_btn)
        size = self.dialog['frameSize']
        self.dialog.set_pos(-size[0] + .05, 1, -size[2] + .05)
        self.eng.log('created dialog ' + self.dialog['text'])

    def on_btn(self, val):
        self.eng.log('friend button ' + val)
        self.notify('on_friend_answer', self.user, val == 'yes')

    def destroy(self):
        self.eng.log('destroyed dialog ' + self.dialog['text'])
        self.dialog = self.dialog.destroy()
        Subject.destroy(self)
        GameObject.destroy(self)
Beispiel #9
0
class DRoom(DistributedObject):
    """The Distributed Room is the topmost object of a game. In a room all
    players that play together, the board and the consensus of what should be
    played. It doesn't define finer game rules as these will be board specific
    and should be implemented in the DBoard"""
    def __init__(self, cr):
        DistributedObject.__init__(self, cr)
        self.dlgStartFight = None

    def announceGenerate(self):
        self.cr.localRoomId = self.doId
        DistributedObject.announceGenerate(self)

        self.accept("requestMoveToField", self.d_requestMoveToField)

    def startRoom(self):
        base.messenger.send("startRoom")

    def nextPlayer(self, playerName):
        base.messenger.send("setNextActivePlayerName", [playerName])

    def d_endTurn(self):
        self.sendUpdate("endTurn")

    def endTurn(self):
        """ End this players turn """
        base.messenger.send("endThisPlayerTurn", [])

    def startTurn(self):
        """ Start this players turn """
        base.messenger.send("startTurn", [])

    def d_rollDice(self):
        self.sendUpdate("rollDice")

    def rolledDice(self, roll):
        base.messenger.send("playSFXDice")
        base.messenger.send("rolledDice", [roll])

    def updateRolledDice(self, remainingRoll):
        base.messenger.send("rolledDice", [remainingRoll])

    def rolledDiceFailed(self):
        pass

    def d_requestMoveToField(self, fieldName):
        self.sendUpdate("requestMoveToField", [fieldName])

    def gameOver(self, winningPlayerName):
        msg = ""
        if winningPlayerName == "ALL":
            msg = "You Won!"
            base.messenger.send("playAudioWin")
        else:
            msg = "Player\n{}\nwon!".format(winningPlayerName)
            if winningPlayerName == self.cr.doId2do[
                    self.cr.localPlayerId].name:
                base.messenger.send("playAudioWin")
            else:
                base.messenger.send("playAudioLoose")
        base.messenger.send("gameOver", [msg])

    def canInitiateFight(self):
        if self.dlgStartFight is not None: return
        base.messenger.send("canInitiateFight")

        self.dlgStartFight = YesNoDialog(state='normal',
                                         text='Start Fight?',
                                         fadeScreen=True,
                                         command=self.doInitiateFight)

    def doInitiateFight(self, yes):
        if yes:
            self.d_initiateFight()
        self.dlgStartFight.cleanup()
        self.dlgStartFight = None

    def d_initiateFight(self):
        self.sendUpdate("initiateFight")

    def startBattle(self):
        pass

    def endBattle(self, won):
        print("Player won:", won)

    def spectateBattle(self):
        pass

    def endSpectateBattle(self):
        pass
class ExporterProject:
    def __init__(self,
                 fileName,
                 guiElementsDict,
                 getEditorFrame,
                 usePixel2D,
                 exceptionSave=False,
                 autosave=False,
                 tooltip=None):
        self.guiElementsDict = guiElementsDict
        self.getEditorFrame = getEditorFrame
        self.usePixel2D = usePixel2D
        self.isAutosave = False

        if exceptionSave:
            self.excSave()
            return

        if autosave:
            self.isAutosave = True
            self.autoSave(fileName)
            return

        self.dlgPathSelect = PathSelect(self.save, "Save Project File",
                                        "Save file path", "Save", fileName,
                                        tooltip)

    def excSave(self):
        self.dlgOverwrite = None
        self.dlgOverwriteShadow = None

        tmpPath = os.path.join(tempfile.gettempdir(), "DGDExceptionSave.json")
        self.__executeSave(True, tmpPath)
        logging.info("Wrote crash session file to {}".format(tmpPath))

    def autoSave(self, fileName=""):
        self.dlgOverwrite = None
        self.dlgOverwriteShadow = None
        if fileName == "":
            fileName = os.path.join(tempfile.gettempdir(), "DGDAutosave.json")
        self.__executeSave(True, fileName)
        logging.info("Wrote autosave file to {}".format(fileName))

    def save(self, doSave):
        if doSave:
            self.dlgOverwrite = None
            self.dlgOverwriteShadow = None
            path = self.dlgPathSelect.getPath()
            path = os.path.expanduser(path)
            path = os.path.expandvars(path)
            if os.path.exists(path):
                self.dlgOverwrite = YesNoDialog(
                    text="File already Exist.\nOverwrite?",
                    relief=DGG.RIDGE,
                    frameColor=(1, 1, 1, 1),
                    frameSize=(-0.5, 0.5, -0.3, 0.2),
                    sortOrder=1,
                    button_relief=DGG.FLAT,
                    button_frameColor=(0.8, 0.8, 0.8, 1),
                    command=self.__executeSave,
                    extraArgs=[path],
                    scale=300,
                    pos=(base.getSize()[0] / 2, 0, -base.getSize()[1] / 2),
                    parent=base.pixel2d)
                self.dlgOverwriteShadow = DirectFrame(
                    pos=(base.getSize()[0] / 2 + 10, 0,
                         -base.getSize()[1] / 2 - 10),
                    sortOrder=0,
                    frameColor=(0, 0, 0, 0.5),
                    frameSize=self.dlgOverwrite.bounds,
                    scale=300,
                    parent=base.pixel2d)
            else:
                self.__executeSave(True, path)
            base.messenger.send("setLastPath", [path])
        self.dlgPathSelect.destroy()
        del self.dlgPathSelect

    def __executeSave(self, overwrite, path):
        if self.dlgOverwrite is not None: self.dlgOverwrite.destroy()
        if self.dlgOverwriteShadow is not None:
            self.dlgOverwriteShadow.destroy()
        if not overwrite: return

        jsonTools = JSONTools()
        jsonElements = jsonTools.getProjectJSON(self.guiElementsDict,
                                                self.getEditorFrame,
                                                self.usePixel2D)
        with open(path, 'w') as outfile:
            json.dump(jsonElements, outfile, indent=2)

        if not self.isAutosave:
            base.messenger.send("clearDirtyFlag")
class ExporterPy:
    functionMapping = {
        "base":{"initialText":"get"},
        "text":{"align":"align", "scale":"scale", "pos":"pos", "fg":"fg", "bg":"bg"}}

    # list of control names starting with the following will be ignored
    ignoreControls = ["item", "cancelframe", "popupMarker", "popupMenu"]
    # list of control names staritng with the following will always be included
    explIncludeControls = ["itemFrame"]

    def __init__(self, saveFile, guiElementsDict, customWidgetHandler, getEditorFrame, tooltip, usePixel2D):
        self.guiElementsDict = guiElementsDict
        self.customWidgetHandler = customWidgetHandler

        jsonTools = JSONTools()
        self.jsonFileContent = jsonTools.getProjectJSON(self.guiElementsDict, getEditorFrame, usePixel2D)
        self.jsonElements = self.jsonFileContent["ComponentList"]

        self.createdParents = ["root"]
        self.postponedElements = {}
        self.postSetupCalling = []
        self.radiobuttonDict = {}
        self.customWidgetAddDict = {}

        importStatements = {
            "DirectButton":"from direct.gui.DirectButton import DirectButton",
            "DirectEntry":"from direct.gui.DirectEntry import DirectEntry",
            "DirectEntryScroll":"from direct.gui.DirectEntryScroll import DirectEntryScroll",
            "DirectCheckBox":"from direct.gui.DirectCheckBox import DirectCheckBox",
            "DirectCheckButton":"from direct.gui.DirectCheckButton import DirectCheckButton",
            "DirectOptionMenu":"from direct.gui.DirectOptionMenu import DirectOptionMenu",
            "DirectRadioButton":"from direct.gui.DirectRadioButton import DirectRadioButton",
            "DirectSlider":"from direct.gui.DirectSlider import DirectSlider",
            "DirectScrollBar":"from direct.gui.DirectScrollBar import DirectScrollBar",
            "DirectScrolledList":"from direct.gui.DirectScrolledList import DirectScrolledList",
            "DirectScrolledListItem":"from direct.gui.DirectScrolledList import DirectScrolledListItem",
            "DirectLabel":"from direct.gui.DirectLabel import DirectLabel",
            "DirectWaitBar":"from direct.gui.DirectWaitBar import DirectWaitBar",
            "OkDialog":"from direct.gui.DirectDialog import OkDialog",
            "OkCancelDialog":"from direct.gui.DirectDialog import OkCancelDialog",
            "YesNoDialog":"from direct.gui.DirectDialog import YesNoDialog",
            "YesNoCancelDialog":"from direct.gui.DirectDialog import YesNoCancelDialog",
            "RetryCancelDialog":"from direct.gui.DirectDialog import RetryCancelDialog",
            "DirectFrame":"from direct.gui.DirectFrame import DirectFrame",
            "DirectScrolledFrame":"from direct.gui.DirectScrolledFrame import DirectScrolledFrame",
        }

        self.content = """#!/usr/bin/python
# -*- coding: utf-8 -*-

# This file was created using the DirectGUI Designer

from direct.gui import DirectGuiGlobals as DGG
"""
        usedImports = []
        for name, elementInfo in self.guiElementsDict.items():
            if elementInfo.type not in usedImports:
                if elementInfo.type in importStatements:
                    self.content = "{}\n{}".format(self.content, importStatements[elementInfo.type])
                else:
                    self.content = "{}\n{}".format(self.content, elementInfo.customImportPath)
                usedImports.append(elementInfo.type)
        self.content += """
from panda3d.core import (
    LPoint3f,
    LVecBase3f,
    LVecBase4f,
    TextNode
)"""
        if ConfigVariableBool("create-executable-scripts", False).getValue():
            self.content += """
# We need showbase to make this script directly runnable
from direct.showbase.ShowBase import ShowBase"""
        self.content += """

class GUI:
    def __init__(self, rootParent=None):
        """

        #self.__createStructuredElements("root", visualEditor.getCanvas())

        for name, elementInfo in self.jsonElements.items():
            self.content += self.__createElement(name, elementInfo)


        self.content += "\n"
        for line in self.postSetupCalling:
            self.content += line + "\n"

        for radioButton, others in self.radiobuttonDict.items():
            self.content += " "*8 + "{}.setOthers([".format(radioButton)
            for other in others:
                self.content += other + ","
            self.content += "])\n"

        topLevelItems = []
        for name, elementInfo in self.jsonElements.items():
            widget = self.customWidgetHandler.getWidget(elementInfo["type"])
            if widget is not None:
                if name not in self.customWidgetAddDict: continue
                for element in self.customWidgetAddDict[name]:
                    if widget.addItemFunction is not None:
                        self.content += " "*8 + "self.{}.{}({})\n".format(name, widget.addItemFunction, element)

            if elementInfo["parent"] == "root":
                topLevelItems.append(name)

        # Create helper functions for toplevel elements
        if len(topLevelItems) > 0:
            self.content += "\n"
            self.content += " "*4 + "def show(self):\n"
            for name in topLevelItems:
                self.content += " "*8 + "self.{}.show()\n".format(name)

            self.content += "\n"
            self.content += " "*4 + "def hide(self):\n"
            for name in topLevelItems:
                self.content += " "*8 + "self.{}.hide()\n".format(name)

            self.content += "\n"
            self.content += " "*4 + "def destroy(self):\n"
            for name in topLevelItems:
                self.content += " "*8 + "self.{}.destroy()\n".format(name)

        # Make script executable if desired
        if ConfigVariableBool("create-executable-scripts", False).getValue():
            self.content += """
# Create a ShowBase instance to make this gui directly runnable
app = ShowBase()\n"""
            if usePixel2D:
                self.content += "GUI(app.pixel2d)\n"
            else:
                self.content += "GUI()\n"
            self.content += "app.run()\n"

        self.dlgPathSelect = PathSelect(
            self.save, "Save Python File", "Save file path", "Save", saveFile, tooltip)

    def save(self, doSave):
        if doSave:
            self.dlgOverwrite = None
            self.dlgOverwriteShadow = None
            path = self.dlgPathSelect.getPath()
            path = os.path.expanduser(path)
            path = os.path.expandvars(path)
            if os.path.exists(path):
                self.dlgOverwrite = YesNoDialog(
                    text="File already Exist.\nOverwrite?",
                    relief=DGG.RIDGE,
                    frameColor=(1,1,1,1),
                    frameSize=(-0.5,0.5,-0.3,0.2),
                    sortOrder=1,
                    button_relief=DGG.FLAT,
                    button_frameColor=(0.8, 0.8, 0.8, 1),
                    command=self.__executeSave,
                    extraArgs=[path],
                    scale=300,
                    pos=(base.getSize()[0]/2, 0, -base.getSize()[1]/2),
                    parent=base.pixel2d)
                self.dlgOverwriteShadow = DirectFrame(
                    pos=(base.getSize()[0]/2 + 10, 0, -base.getSize()[1]/2 - 10),
                    sortOrder=0,
                    frameColor=(0,0,0,0.5),
                    frameSize=self.dlgOverwrite.bounds,
                    scale=300,
                    parent=base.pixel2d)
            else:
                self.__executeSave(True, path)
            base.messenger.send("setLastPath", [path])
        self.dlgPathSelect.destroy()
        del self.dlgPathSelect

    def __executeSave(self, overwrite, path):
        if self.dlgOverwrite is not None: self.dlgOverwrite.destroy()
        if self.dlgOverwriteShadow is not None: self.dlgOverwriteShadow.destroy()
        if not overwrite: return
        with open(path, 'w') as outfile:
            outfile.write(self.content)

    def __createElement(self, name, elementInfo):
        extraOptions = ""
        for optionName, optionValue in elementInfo["extraOptions"].items():
            extraOptions += " "*12 + "{}={},\n".format(optionName, optionValue)
        elementCode = """
        self.{} = {}(
{}{}{}{}        )\n""".format(
            name,
            elementInfo["type"],
            self.__writeElementOptions(name, elementInfo),
            " "*12 + "command={},\n".format(elementInfo["command"]) if elementInfo["command"] is not None else "",
            " "*12 + "extraArgs=[{}],\n".format(elementInfo["extraArgs"]) if elementInfo["extraArgs"] is not None else "",
            extraOptions,
            )
        if elementInfo["element"]["transparency"] != "M_none":
            elementCode += " "*8 +"self.{}.setTransparency({})\n".format(name, elementInfo["element"]["transparency"])

        if elementInfo["type"] == "DirectScrolledListItem":
            self.postSetupCalling.append(" "*8 + "self.{}.addItem(self.{})".format(elementInfo["parent"], name))

        return elementCode

    def __writeElementOptions(self, name, elementInfo):
        elementOptions = ""
        indent = " "*12

        if elementInfo["type"] == "DirectOptionMenu":
            elementOptions += indent + "items=['item1'],\n"

        for optionKey, optionValue in elementInfo["element"].items():
            if optionKey == "others":
                others = []
                for other in optionValue:
                    others.append("self.{}".format(other))
                self.radiobuttonDict["self.{}".format(name)] = others
                continue
            elif optionKey == "transparency":
                continue

            elementOptions += indent + optionKey + "=" + optionValue + ",\n"

        if elementInfo["parent"] != "root":
            self.canvasParents = [
                "a2dTopCenter","a2dBottomCenter","a2dLeftCenter","a2dRightCenter",
                "a2dTopLeft","a2dTopRight","a2dBottomLeft","a2dBottomRight"]

            if elementInfo["parent"] in self.jsonElements and self.jsonElements[elementInfo["parent"]]["type"] == "DirectScrollFrame":
                # use the canvas as parent
                elementOptions += indent + "parent=self." + elementInfo["parent"] + ".getCanvas(),\n"
            elif elementInfo["parent"] in self.jsonElements and self.customWidgetHandler.getWidget(self.jsonElements[elementInfo["parent"]]["type"]) is not None:
                widget = self.customWidgetHandler.getWidget(self.jsonElements[elementInfo["parent"]]["type"])
                if widget.addItemFunction is not None:
                    if elementInfo["parent"] in self.customWidgetAddDict:
                        self.customWidgetAddDict[elementInfo["parent"]].append("self.{}".format(name))
                    else:
                        self.customWidgetAddDict[elementInfo["parent"]] = ["self.{}".format(name)]
            elif elementInfo["parent"] in self.canvasParents:
                elementOptions += indent + "parent=base." + elementInfo["parent"] + ",\n"
            else:
                elementOptions += indent + "parent=self." + elementInfo["parent"] + ",\n"
        else:
            # use the parent passed to the class
            elementOptions += indent + "parent=rootParent,\n"

        return elementOptions
Beispiel #12
0
 def askQuit(self):
     self.yesNoDialog = YesNoDialog(
         text="Realy Quit?",
         command=self.quitGame)
Beispiel #13
0
class GameScreenHandler(DirectObject, GameScreen):
    def __init__(self):
        GameScreen.__init__(self)

        self.btnContinue.hide()

        self.mainChar = Character(self.frmContent.getCanvas(), (0,0,0), "mainChar", "mike")
        self.mainChar.animate("idle", "l", 3)
        self.mainChar.btn.reparentTo(self.frmContent.getCanvas(), 100)

        self.chapter = None
        self.inventory = Inventory(self.frmInventory)

        self.accept("quitGame", self.askQuit)
        self.accept("toggleAudio", self.toggleAudio)
        self.accept("switchToChapter", self.switchToChapter)
        self.accept("showText", self.showText)
        self.accept("showNote", self.showNote)
        self.accept("addInventory", self.addInventory)
        self.accept("getInventory", self.getInventory)
        self.accept("moveChar", self.mainChar.moveTo)
        self.accept("stopChar", self.mainChar.stop)
        self.accept("animateChar", self.mainChar.animate)

        if base.AppHasAudioFocus:
            self.btnAudioToggle["text"] = "Audio On"
        else:
            self.btnAudioToggle["text"] = "Audio Off"

        self.chapter = levelTree["chapter1"](self.frmContent.getCanvas())
        self.mainChar.btn.setPos(self.chapter.startPos)
        LerpColorInterval(self.frmFadeOverlay, 2.0, (0,0,0,0)).start()

    def askQuit(self):
        self.yesNoDialog = YesNoDialog(
            text="Realy Quit?",
            command=self.quitGame)

    def quitGame(self, yes):
        self.yesNoDialog.destroy()
        if yes:
            self.ignoreAll()
            self.mainChar.stop()
            self.mainChar.destroy()
            self.chapter.destroy()
            base.messenger.send("exit")

    def toggleAudio(self):
        if base.AppHasAudioFocus:
            base.disableAllAudio()
            self.btnAudioToggle["text"] = "Audio Off"
        else:
            base.enableAllAudio()
            self.btnAudioToggle["text"] = "Audio On"

    def setChapter(self, chapterName):
        if self.chapter is not None:
            del self.chapter
            self.chapter = None
        self.chapter = levelTree[chapterName](self.frmContent.getCanvas())

    def switchToChapter(self, chapterName):
        switchTo = Sequence(
            LerpColorInterval(self.frmFadeOverlay, 2.0, (0,0,0,1), (0,0,0,0)),
            Func(self.chapter.destroy),
            Func(self.setChapter, chapterName),
            Func(self.setStarPos),
            LerpColorInterval(self.frmFadeOverlay, 2.0, (0,0,0,0)),
        )
        switchTo.start()

    def setStarPos(self):
        self.mainChar.setStart(self.chapter.startPos)

    def showNote(self, text):
        self.lblStory["text"] = text
        base.messenger.send("continue")

    def showText(self, textQueue):
        self.btnContinue.show()
        self.textQueue = textQueue
        self.accept("story_continue", self.nextText)
        self.nextText()

    def nextText(self):
        if len(self.textQueue) <= 0:
            base.messenger.send("continue")
            self.ignore("story_continue")
            self.lblStory["text"] = ""
            self.btnContinue.hide()
            return

        text = self.textQueue[0]
        self.lblStory["text"] = text
        del self.textQueue[0]

    def addInventory(self, itemKey, itemImage):
        self.inventory.addItem(itemKey, itemImage)

    def getInventory(self):
        base.messenger.send("inventoryRequest", [self.inventory.inventoryList])