diff --git a/samples/gamepad/flightstick.py b/samples/gamepad/flightstick.py index 1c4504330c..0a06c52585 100644 --- a/samples/gamepad/flightstick.py +++ b/samples/gamepad/flightstick.py @@ -1,10 +1,9 @@ #!/usr/bin/env python ''' -Demonstrate usage of steering wheels +Demonstrate usage of flight stick -In this sample you can use a wheel type device to control the camera and -show some messages on screen. You can acclerate forward using the -accleration pedal and slow down using the break pedal. +In this sample you can use a flight stick to control the camera and show some +messages on screen. You can accelerate using the throttle. ''' from direct.showbase.ShowBase import ShowBase @@ -16,6 +15,10 @@ loadPrcFileData("", """ notify-level-device debug """) +STICK_DEAD_ZONE = 0.02 +THROTTLE_DEAD_ZONE = 0.02 + + class App(ShowBase): def __init__(self): ShowBase.__init__(self) @@ -53,24 +56,12 @@ class App(ShowBase): self.accept("flight_stick0-start", exit) # Accept button events of the first connected flight stick - self.accept("flight_stick0-action_a", self.action, extraArgs=["Action"]) - self.accept("flight_stick0-action_a-up", self.actionUp) + self.accept("flight_stick0-trigger", self.action, extraArgs=["Trigger"]) + self.accept("flight_stick0-trigger-up", self.actionUp) self.environment = loader.loadModel("environment") self.environment.reparentTo(render) - # save the center position of the stick - # NOTE: here we assume, that the stick is centered when the application get started. - # In real world applications, you should notice the user and give him enough time - # to center the wheel until you store the center position of the controler! - self.hcenter = 0 - self.xcenter = 0 - self.ycenter = 0 - if self.flightStick: - self.hcenter = self.flightStick.findAxis(InputDevice.Axis.pitch).value - self.xcenter = self.flightStick.findAxis(InputDevice.Axis.x).value - self.ycenter = self.flightStick.findAxis(InputDevice.Axis.y).value - # disable pandas default mouse-camera controls so we can handle the camera # movements by ourself self.disableMouse() @@ -139,9 +130,10 @@ class App(ShowBase): if self.currentMoveSpeed < 0: self.currentMoveSpeed = 0 - # we will use the first found wheel - # Acclerate + # Accelerate using the throttle. Apply deadzone of 0.01. throttle = self.flightStick.findAxis(InputDevice.Axis.throttle).value + if abs(throttle) < THROTTLE_DEAD_ZONE: + throttle = 0 accleration = throttle * self.maxAccleration if self.currentMoveSpeed > throttle * self.maxSpeed: self.currentMoveSpeed -= dt * self.deaccleration @@ -151,17 +143,26 @@ class App(ShowBase): # Control the cameras yaw/Headding stick_yaw = self.flightStick.findAxis(InputDevice.Axis.yaw) - base.camera.setH(base.camera, 100 * dt * (stick_yaw.value - self.hcenter)) + if abs(stick_yaw.value) > STICK_DEAD_ZONE: + base.camera.setH(base.camera, 100 * dt * stick_yaw.value) + # Control the cameras pitch stick_y = self.flightStick.findAxis(InputDevice.Axis.pitch) - base.camera.setP(base.camera, 100 * dt * (stick_y.value - self.ycenter)) + if abs(stick_y.value) > STICK_DEAD_ZONE: + base.camera.setP(base.camera, 100 * dt * stick_y.value) + # Control the cameras roll - stick_X = self.flightStick.findAxis(InputDevice.Axis.roll) - base.camera.setR(base.camera, 100 * dt * (stick_X.value - self.xcenter)) + stick_x = self.flightStick.findAxis(InputDevice.Axis.roll) + if abs(stick_x.value) > STICK_DEAD_ZONE: + base.camera.setR(base.camera, 100 * dt * stick_x.value) # calculate movement base.camera.setY(base.camera, dt * self.currentMoveSpeed) + # Make sure camera does not go below the ground. + if base.camera.getZ() < 1: + base.camera.setZ(1) + return task.cont app = App()