Ejemplo n.º 1
0
class Engine(DirectObject):
    """The engine class sets up the holders for game GameObjects
    and starts the parser that runs through the [name].egg
    """
    def __init__(self, _main):

        print "Engine - init >>>"
        log.info("Engine - init >>>")


        # Main ref
        self.main = _main
        self.settings = Settings()
        self.graphicMgr = GraphicManager(self.settings)
        self.audioMgr = AudioManager()
        self.lng = Language(self.settings)
        self.lng.setup(self.settings)

        ### Bools ###
        # Gets set if we have a player character to work with.
        self.hasPlayer = False
        ### Bools END ###

        ### Setup Engine Holders ###
        self.__resetObjects()
        ### Engine Holders END ###

        # Setup Bullet Physics
        #? We could save this somewhere else i guess?
        self.bulletWorld = BulletWorld()
        self.bulletWorld.setGravity(
            Vec3(self.settings.gravity_x,
                 self.settings.gravity_y,
                 self.settings.gravity_z))

        # Init Factory
        self.factory = Factory(self)

        # Debug node
        self.debugNP = None

    def start(self):
        # Controls Physics and other engine related Things

        # Init Input
        self.inputHandler = InputHandler(self)
        self.inputHandler.start()

        # Event HAndler
        self.eventHandler = EventHandler(self)
        self.eventHandler.start()

        # Init Camera
        self.cameraHandler = CameraHandler(self, "TPS")

        # Start Engine Loop
        taskMgr.add(self.engineLoop, "Engine_Loop")

    def stop(self):
        taskMgr.remove("Engine_Loop")
        self.unloadLevel()
        self.__resetObjects()
        self.inputHandler.stop()
        del(self.inputHandler)
        self.eventHandler.stop()
        del(self.eventHandler)
        self.cameraHandler.stop()
        del(self.cameraHandler)
        render.clearLight()
        base.messenger.send("Quit")

    def unloadLevel(self):
        self.__removeObjects()

    def loadLevel(self, levelName):
        # Parse the .egg file
        self.factory.parseLevelFile(levelName)

    def __resetObjects(self):
        # Create Game ObjectType Holders these hold the instances
        self.GameObjects = {}
        self.GameObjects["player"] = None
        self.GameObjects["level"] = {}
        self.GameObjects["object"] = {}
        self.GameObjects["light"] = {}
        self.GameObjects["sensor"] = {}

        # Create Render Object Holders for sorting stuff in sceneG.
        # nodepaths
        self.RenderObjects = {}
        self.BulletObjects = {}

        # none visual
        self.BulletObjects["main"] = render.attachNewNode("Bullet_main")
        self.BulletObjects["player"] = self.BulletObjects["main"].attachNewNode("Bullet_player")
        self.BulletObjects["level"] = self.BulletObjects["main"].attachNewNode("Bullet_level")
        self.BulletObjects["object"] = self.BulletObjects["main"].attachNewNode("Bullet_object")
        self.BulletObjects["sensor"] = self.BulletObjects["main"].attachNewNode("Bullet_sensor")

        # Visuals
        self.RenderObjects["player"] = render.attachNewNode("Render_player")
        self.RenderObjects["level"] = render.attachNewNode("Render_level")
        self.RenderObjects["object"] = render.attachNewNode("Render_object")
        self.RenderObjects["light"] = render.attachNewNode("Render_light")

    def __removeObjects(self):
        for name, objects in self.GameObjects.items():
            if name == "player":
                objects.remove()
                continue
            for name, obj in objects.items():
                obj.remove()


    def showBulletDebug(self):
        """Show bullet Debug"""
        # Bullet DEBUG
        debugNode = BulletDebugNode('Debug')
        debugNode.showWireframe(True)
        debugNode.showConstraints(False)
        debugNode.showBoundingBoxes(False)
        debugNode.showNormals(False)
        self.debugNP = render.attachNewNode(debugNode)
        self.debugNP.show()

        self.bulletWorld.setDebugNode(self.debugNP.node())

    def hideBulletDebug(self):
        """Hide the debug stuff"""

        self.debugNP.hide()

    def engineLoop(self, task):
        """Handle Engine Related Tasks"""
        dt = globalClock.getDt()

        # Handle Physics
        self.bulletWorld.doPhysics(dt)

        if self.hasPlayer:
            self.inputHandler.update(dt)
            self.cameraHandler.update(dt)
            self.GameObjects["player"].setBasicMovement(dt)
            self.GameObjects["player"].startGhostContactTester(dt)
            self.GameObjects["player"].startContactTester(dt)



        return task.cont