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()
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()