As promised: a working gamepad task routine. Trying to change the distance interfered with the tracking function. It was easier to decide I don’t need it. Let me know if anyone has suggestions.
Gamepad control for the vehicle
def GamePadInput(self, dt):
## Respond to gamepad #############
if not self.gamepad:
return 0
engineForce = 0.0
brakeForce = 0.0
## Listen to Gamepad Input
gpstart = self.gamepad.findButton("start")
gpback = self.gamepad.findButton("back")
lshoulder = self.gamepad.findButton("lshoulder")
rshoulder = self.gamepad.findButton("rshoulder")
left_x = self.gamepad.findAxis(InputDevice.Axis.left_x)
left_y = self.gamepad.findAxis(InputDevice.Axis.left_y)
right_x = self.gamepad.findAxis(InputDevice.Axis.right_x)
right_y = self.gamepad.findAxis(InputDevice.Axis.right_y)
#Accept button events of the first connected gamepad
if gpback.pressed:
self.doExit()
if gpstart.pressed:
self.doReset()
##### Camera Follow Player Controls ###############
camvec = self.yugoNP.getPos(render) - self.camera.getPos()
camvec.setZ(0)
camdist = camvec.length()
camvec.normalize()
if camdist > self.camY: # + 0.2:
self.camera.setPos(self.camera.getPos() + camvec * (camdist - self.camY))
# Rotate camera around the car in a arc
if right_x.value > 0.02: # move cam right
self.camera.setX(self.camera, +20 * dt)
if right_x.value < -0.02: # move cam left
self.camera.setX(self.camera, -20 * dt)
if right_y.value > 0.02: # move cam up
self.camera.setZ(self.camera, +20 * dt)
if right_y.value < -0.02: # move cam down
self.camera.setZ(self.camera, -20 * dt)
### Vehicle Control #####
if left_y.value > 0.01: # go forward
engineForce = left_y.value * 1600
brakeForce = 0.0
if left_y.value < -0.01: # go backwards
engineForce = left_y.value * 400
brakeForce = 0.0
if rshoulder.pressed: # slow down
engineForce = 0.0
brakeForce = 40
if lshoulder.pressed: # apply brakes
engineForce = 0.0
brakeForce = 100
if left_x.value < -0.01: # turn left
self.steering = left_x.value * -5
self.steering = min(self.steering, self.steeringClamp)
if left_x.value > 0.01: # turn right
self.steering = left_x.value * -5
self.steering = max(self.steering, -self.steeringClamp)
### Calibrate Drifting Toggles #######
if left_x.value < 0.01 and left_x.value > -0.01: # straight ahead
self.steering = 0.0
if left_y.value < 0.01 and left_y.value > -0.01: # sit still
self.engineForce = 0.0
# Apply steering to front wheels
self.vehicle.setSteeringValue(self.steering, 0);
self.vehicle.setSteeringValue(self.steering, 1);
# Apply force to back wheels
self.vehicle.applyEngineForce(engineForce, 2);
self.vehicle.applyEngineForce(engineForce, 3);
self.vehicle.setBrake(brakeForce, 2);
self.vehicle.setBrake(brakeForce, 3);