def setupCameraControl(self): # Disable the camera trackball controls. self.disableMouse() self.player = self.loader.loadModel("models/camera") self.player.reparentTo(self.render) self.player.setPos(0, -15, 5) self.camera.reparentTo(self.player) self.camera.setP(-10) # Move camera slightly forward if not the rim of the camera object shows when rotating the view self.camera.setY(1) self.clock = ClockObject.getGlobalClock() self.genLabelText("ESC: Quit", 0) self.genLabelText(KEY_FORWARD + ": Moves forward", 1) self.genLabelText(KEY_BACKWARD + ": Moves back", 2) self.genLabelText(KEY_RIGHT + ": Moves right", 3) self.genLabelText(KEY_LEFT + ": Moves left", 4) self.genLabelText("Mouse: Look around and turn", 5) self.accept("escape", sys.exit) self.keyMap = {KEY_FORWARD : False, KEY_BACKWARD : False, KEY_LEFT : False, KEY_RIGHT : False,} # Keep track of key presses self.accept(KEY_FORWARD, self.setKey, [KEY_FORWARD, True]) self.accept(KEY_BACKWARD, self.setKey, [KEY_BACKWARD, True]) self.accept(KEY_LEFT, self.setKey, [KEY_LEFT, True]) self.accept(KEY_RIGHT, self.setKey, [KEY_RIGHT, True]) # Keep track of key releases self.accept(KEY_FORWARD + "-up", self.setKey, [KEY_FORWARD, False]) self.accept(KEY_BACKWARD + "-up", self.setKey, [KEY_BACKWARD, False]) self.accept(KEY_LEFT + "-up", self.setKey, [KEY_LEFT, False]) self.accept(KEY_RIGHT + "-up", self.setKey, [KEY_RIGHT, False]) self.taskMgr.add(self.cameraControl, "Camera Control")
def cameraControlTask(self, task): elapsedTime = ClockObject.getGlobalClock().getDt() movementSpeed = 15 maxLookAngle = 80 turnSpeed = 2 if self.oobeMode == 0: # Mouse movement if self.mouseWatcherNode.hasMouse() == True: mpos = self.mouseWatcherNode.getMouse() # Up down movement does not rotate the player, only the view (only the camera) self.camera.setP(mpos.getY() * maxLookAngle) # Small left-right movement does not rotate the player, only the view (only the camera) # self.camera.setH(mpos.getX() * -1 * maxLookAngle) # Larger left-right movement also rotate the player if mpos.getX() > 0.25 or mpos.getX() < -0.25: self.player.setH(self.player.getH() + mpos.getX() * -1 * turnSpeed) # Movement keys if self.keyMap[KEY_FORWARD] == True: self.player.setY(self.player, movementSpeed * elapsedTime) elif self.keyMap[KEY_BACKWARD] == True: self.player.setY(self.player, -1 * movementSpeed * elapsedTime) elif self.keyMap[KEY_RIGHT] == True: self.player.setX(self.player, movementSpeed * elapsedTime) elif self.keyMap[KEY_LEFT] == True: self.player.setX(self.player, -1 * movementSpeed * elapsedTime) # Jetpack if self.keyMap[KEY_JETPACK] == True: if not self.jetpackOn: self.jetpackOn = True # Add the jetpack force to the physical object of the playerActorNode self.playerActorNode.getPhysical(0).addLinearForce(self.jetpackForce) else: if self.jetpackOn: self.jetpackOn = False # Remove the jetpack force to the physical object of the playerActorNode self.playerActorNode.getPhysical(0).removeLinearForce(self.jetpackForce) # Jump if self.keyMap[KEY_JUMP] == True: if self.jumpTime <= 0: print "jump" self.jumpTime = 0.1 self.keyMap[KEY_JUMP] = False self.playerActorNode.getPhysical(0).addLinearForce(self.jumpForce) else: if self.jumpTime > 0: self.jumpTime -= elapsedTime if self.jumpTime <= 0: self.jumpTime = 0 self.playerActorNode.getPhysical(0).removeLinearForce(self.jumpForce) # OOB - Out Of Body mode # Enables use of standard Panda mouse control on camera if self.keyMap[KEY_OOB] == True: self.keyMap[KEY_OOB] = False # Toggle out of body mode self.oobe() # Done return task.cont