예제 #1
0
    def __init__(self):
        ShowBase.__init__(self)

        self.createLoadScreen('./LEGameAssets/Textures/title_screen.png')
        base.graphicsEngine.renderFrame()

        #== Environment and Rendering Settings ==
        base.setFrameRateMeter(FLAG_SHOW_FRAMES_PER_SECOND)
        if FLAG_USE_AUTOSHADER:
            render.setShaderAuto()
        self.filters = CommonFilters(base.win, self.cam)  # NEW
        if FLAG_SHOW_GLOW:
            bloomSize = 4  #'small'
            filterok = self.filters.setBloom(blend=(0, 0, 0, 1),
                                             desat=-0.5,
                                             intensity=3.0,
                                             size=bloomSize)
            if (filterok == False):
                print 'WARNING:Video card not powerful enough to do image postprocessing'

        #tex = loader.loadTexture("./LEGameAssets/Textures/loadbar_tray.png")
        self.loadBar = DirectWaitBar(text="",
                                     value=0,
                                     scale=(.35, .5, .5),
                                     pos=(0.006, .83, .83))
        #self.loadBar['barRelief'] = DirectWaitBar.GROOVE
        #self.loadBar['scale'] = 0.05
        #self.loadBar['barTexture'] = tex
        self.loadBar['barColor'] = (6.0 / 255.0, 11.0 / 255, 28.0 / 255.0, 1)
        self.loadBar.reparentTo(render2d)
        self.loadBar.hide()
        base.graphicsEngine.renderFrame()

        self.setBackgroundColor(166.0 / 255.0, 207.0 / 255.0, 240.0 / 255.0, 1)
        self.skybox = self.loader.loadModel(
            "LEGameAssets/Models/skybox_final.egg")
        self.skybox.setScale(50)
        self.skybox.reparentTo(render)

        #== Load the level and the managers ==
        self.assets, self.objects, self.gameObjects, self.sounds, self.sequences = loadWorld(
            SCENE_FILE, LIBRARY_INDEX)
        self.loadBar['value'] += 5
        base.graphicsEngine.renderFrame()

        self.conversations = loadConversations(SCENE_FILE, LIBRARY_INDEX)
        self.scenes = {}
        self.loadScenes()
        self.loadBar['value'] += 5
        base.graphicsEngine.renderFrame()

        self.journalMgr = JournalMgr(self)
        self.loadJournal(self.journalMgr, JOURNAL_FILE)

        self.conversationMgr = ConversationMgr(self, self.conversations)

        self.scriptMgr = ScriptMgr(self)
        self.scriptMgr.loadScripts(SCRIPTS_LIST)
        self.scriptInterface = ScriptInterface(self)

        self.inventoryMgr = InventoryMgr(self)
        loadInventory(self.inventoryMgr, INVENTORY_FILE)

        self.loadBar['value'] += 5
        base.graphicsEngine.renderFrame()

        self.ranSequences = []

        #== Main Character ==
        self.hero = None
        for name, gameObj in self.gameObjects.iteritems():
            if gameObj.getNP().hasTag('LE-mainChar'):
                self.hero = gameObj
                break
        else:
            # make a default hero
            defaultHeroNP = loader.loadModel("panda")
            self.hero = GameObject(defaultHeroNP)
            self.hero.reparentTo(render)
            self.hero.setPos(0, 0, 0)
            self.hero.setTag('LE-mainChar', '180')
            self.gameObjects[self.hero.getName()] = self.hero

        self.setCollideMasks(self.gameObjects)

        # remove the hero from the objects dict so it cannot be clicked by player
        if self.hero.getName() in self.objects:
            del self.objects[self.hero.getName()]

    #== Camera ==
        camHeightFactor = CAMERA_HEIGHT
        camTrailFactor = -CAMERA_TRAIL  # careful of +/- distinction
        self.heroHeight = self.getModelHeight(self.hero)
        self.heroHeadingOffset = float(self.hero.getTag('LE-mainChar'))
        self.lastHeroH = self.hero.getH(render) + self.heroHeadingOffset

        # setup the camera pivot, which will follow the main character model and anchor the camera
        self.camPivot = NodePath('camPivot')
        self.camPivot.reparentTo(render)

        self.camHeight = camHeightFactor * self.heroHeight
        self.camTrail = camTrailFactor * self.heroHeight
        self.cam.setPos(self.camPivot.getPos() +
                        (0, self.camTrail, self.camHeight))
        self.cam.wrtReparentTo(self.camPivot)

        self.placeCamera(self.hero)  # match X and Y to main character
        self.alignCamera(self.hero)  # match heading to main character
        #self.camPivot.setH(render, self.hero.getH(render) + self.heroHeadingOffset)

        self.gameCam = self.cam

        #== Collisions ==
        self.setupCollisions()

        #== Controls ==
        self.disableMouse()
        self.keyMap = {'w': False, 'a': False, 's': False, 'd': False}
        self.enableMovement(self.hero)
        self.accept("mouse1", self.onClickin3D)
        self.accept('escape', sys.exit)

        self.accept('z', render.place)

        #== UI and Combat ==
        self.gameplayUI = GameplayUI(self)
        self.gameplayUI.hideAll()

        # for health bars and on screen UI
        self.overlayAmbientLight = AmbientLight('overlayAmbientLight')
        self.overlayAmbientLight.setColor(VBase4(1.0, 1.0, 1.0, 1.0))
        self.overlayAmbientLightNP = render.attachNewNode(
            self.overlayAmbientLight)

        # initialize the combat manager (which includes AI) now that a main character and gameplayUI instance and overlay light is established
        self.combatMgr = CombatMgr(self)

        # initialize player's spells
        self.heroSpells = []
        for properties in PLAYER_SPELLS:
            spell = Spell(self.hero, properties)
            self.heroSpells.append(spell)

    #== Start Tasks
        taskMgr.add(self.moveHeroTask, 'moveHeroTask', appendTask=True)
        taskMgr.add(self.cameraFollowTask, 'cameraFollowTask', appendTask=True)
        taskMgr.add(self.processHeroCollisions, 'processHeroCollisions')
        taskMgr.add(self.updateHeroHeight, 'updateHeroHeight')
        self.combatMgr.startTasks()

        self.accept('enter', self.destroyLoadScreen)
        self.destroyLoadScreen()
예제 #2
0
    def openScene(self, sceneName):
        if (self.scenes.has_key(sceneName) == False):
            print "ERROR:There is no scene under the name ", sceneName, "."
            return

        self.startLoadBar(12)
        self.createLoadScreen()

        #Part2:Clear all of the collision lists
        self.cTrav.removeCollider(self.heroCNP)
        self.heroGroundHandler.clearEntries()
        self.heroCollisionQueue.clearEntries()

        self.resetAllSequences()
        self.increaseLoadBar(1)

        #Part3: stop all of the tasks

        taskMgr.remove('processHeroCollisions')
        taskMgr.remove('updateHeroHeight')
        taskMgr.remove('moveHeroTask')
        taskMgr.remove('cameraFollowTask')
        taskMgr.remove("updateShaders")  # ?
        self.combatMgr.stopTasks()

        self.gameplayUI.stop()
        self.gameplayUI.removeAllHealthBars()

        self.increaseLoadBar(1)

        #Part1.1: Stop currently running parts like conversations or camera
        if (self.conversationMgr.isConversationOpen()):
            self.conversationMgr.closeConversation()

        #Part 1.2: stop the camera

        self.increaseLoadBar(1)

        #Part4: Turn-Off all of the player controls
        self.ignore("mouse1")

        self.increaseLoadBar(1)

        #Part5: Remove all of the game elements that are related with the current scene
        del self.combatMgr

        self.increaseLoadBar(1)

        #Part6: Remove all of the children and the lights from the render
        render.getChildren().detach()
        render.clearLight()

        self.increaseLoadBar(1)

        #Part7:Add the camera and hero or any game element that should be exist in any scene back
        self.camPivot.reparentTo(render)
        self.hero.reparentTo(render)
        #self.heroWallCollide.reparentTo(render)
        self.heroWallCollideX.reparentTo(render)
        self.heroWallCollideY.reparentTo(render)
        self.heroWallCollideZ.reparentTo(render)
        self.heroGroundCollide.reparentTo(render)
        self.cameraHeroP.reparentTo(render)

        self.overlayAmbientLightNP.reparentTo(render)

        self.increaseLoadBar(1)

        #Part8:Add the new objects from the new scene
        self.assets, self.objects, self.gameObjects, self.sounds, self.sequences = loadWorld(
            self.scenes[sceneName], LIBRARY_INDEX)

        self.increaseLoadBar(1)

        #Part9:Add the hero to the new gameObject list and remove the duplicates of the hero
        self.gameObjects[self.hero.getName()] = self.hero
        if (self.objects.has_key(self.hero.getName())):
            object = self.objects[self.hero.getName()]
            if (object.hasTag('LE-mainChar')):
                object.detachNode()
                del self.objects[self.hero.getName()]

        for name, gameObj in self.gameObjects.iteritems():
            if gameObj.getNP().hasTag('LE-ground'):
                #debug("is Ground")
                bitmask = gameObj.getNP().getCollideMask()
                bitmask |= BITMASK_GROUND
                gameObj.getNP().setCollideMask(bitmask)
        self.increaseLoadBar(1)

        #Part10:Restart the tasks.
        self.combatMgr = CombatMgr(self)

        taskMgr.add(self.processHeroCollisions, 'processHeroCollisions')
        taskMgr.add(self.updateHeroHeight, 'updateHeroHeight')
        taskMgr.add(self.moveHeroTask, 'moveHeroTask')
        taskMgr.add(self.cameraFollowTask, 'cameraFollowTask')
        self.combatMgr.startTasks()
        self.gameplayUI.start()

        self.increaseLoadBar(1)

        self.setCollideMasks(self.gameObjects)

        self.increaseLoadBar(1)

        #Part11: Change the color of the sky
        if (sceneName.startswith("interior")
                or sceneName.startswith("Interior")):
            self.setBackgroundColor(BGC_DARK_GREY)
        else:
            self.skybox.reparentTo(render)
            self.setBackgroundColor(BGC_LIGHT_BLUE)

        self.increaseLoadBar(1)

        #Part12: Restart the player controls
        self.accept("mouse1", self.onClickin3D)

        self.increaseLoadBar(1)
        self.accept("enter", self.destroyLoadScreen)

        debug("After open Scene: " +
              str(self.heroCollisionQueue.getNumEntries()))
        self.heroCollisionQueue.clearEntries()
        self.cTrav.addCollider(self.heroCNP, self.heroCollisionQueue)

        self.destroyLoadScreen()