samples: improvements to flight stick sample program

This commit is contained in:
rdb 2018-10-07 20:47:59 +02:00
parent d764574d07
commit 3d66e22905

View File

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