import bge
from bge import logic
import PhysicsConstraints
from gamesystem import gaudges
from math import pi
import numpy as np
### Define ###
scene = logic.getCurrentScene()
car = scene.objects["Car"]
keyboard = logic.keyboard
JUST_ACTIVATED = bge.logic.KX_INPUT_JUST_ACTIVATED
ACTIVE = bge.logic.KX_INPUT_ACTIVE
#keyboard keys
gas = keyboard.events[bge.events.WKEY]
left = keyboard.events[bge.events.AKEY]
reverse = keyboard.events[bge.events.SKEY]
right = keyboard.events[bge.events.DKEY]
ebrake = keyboard.events[bge.events.SPACEKEY]
#stats
gasPower = car["gasPower"] * 10
brakePower = car["brakePower"]
ebrakePower = car["ebrakePower"]
reversePower = car["gasPower"] / 3 * 20
maxSteer = car["maxSteer"]
steerSpeed = car["steerSpeed"]
maxSpeed = car["maxSpeed"]
# Define tire objects
tireFL = scene.objects["TireFL"]
tireFR = scene.objects["TireFR"]
tireRL = scene.objects["TireRL"]
tireRR = scene.objects["TireRR"]
### Initialise ###
if not "ini" in car:
pid = car.getPhysicsId()
suspension = PhysicsConstraints.createConstraint(pid, 0, 11)
cid = suspension.getConstraintId()
suspension = PhysicsConstraints.getVehicleConstraint(cid)
wheelRadius = 0.345
suspensionRestLength = 0.5
hasSteering = 1
car["gearRatios"] = [3.5, 2.7, 1.8, 1.2, 0.6]
car["finalRatio"] = 4
car["rpmArray"] = [0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000]
car["torqArray"] = [0, 125, 175, 210, 290, 345, 312, 176, 51, 15]
### Tweakables ###
damping = car["damping"]
stiffness = car["stiffness"]
compression = car["compression"]
roll = car["roll"]
grip = car["grip"]
drift = car["drift"]
car["wheelPerimeter"] = 2 * pi * wheelRadius
### Actions ###
# Generate tires
wheelAttachDirLocal = [0, 0, -1]
wheelAttachPosLocal = [-0.745, 1.27, 0.59]
wheelAxleLocal = [-1, 0, 0]
suspension.addWheel(tireFL, wheelAttachPosLocal, wheelAttachDirLocal, wheelAxleLocal, suspensionRestLength, wheelRadius, hasSteering)
wheelAttachDirLocal = [0, 0, -1]
wheelAttachPosLocal = [0.745, 1.27, 0.59]
wheelAxleLocal = [-1, 0, 0]
suspension.addWheel(tireFR, wheelAttachPosLocal, wheelAttachDirLocal, wheelAxleLocal, suspensionRestLength, wheelRadius, hasSteering)
wheelAttachDirLocal = [0, 0, -1]
wheelAttachPosLocal = [-0.75, -1.18, 0.59]
wheelAxleLocal = [-1, 0, 0]
hasSteering = 0
suspension.addWheel(tireRL, wheelAttachPosLocal, wheelAttachDirLocal, wheelAxleLocal, suspensionRestLength, wheelRadius, hasSteering)
wheelAttachDirLocal = [0, 0, -1]
wheelAttachPosLocal = [0.75, -1.18, 0.59]
wheelAxleLocal = [-1, 0, 0]
suspension.addWheel(tireRR, wheelAttachPosLocal, wheelAttachDirLocal, wheelAxleLocal, suspensionRestLength, wheelRadius, hasSteering)
# Update suspension
for tire in range(4):
suspension.setSuspensionDamping(damping, tire)
suspension.setSuspensionStiffness(stiffness, tire)
suspension.setSuspensionCompression(compression, tire)
suspension.setRollInfluence(roll, tire)
suspension.setTyreFriction(grip, 0)
suspension.setTyreFriction(grip, 1)
suspension.setTyreFriction(grip / (drift * ((maxSpeed - gaudges.speed) / maxSpeed)), 2)
suspension.setTyreFriction(grip / (drift * ((maxSpeed - gaudges.speed) / maxSpeed)), 3)
car["ini"] = True
car["CID"] = cid
### Car in action ###
wheelRPS = (car["speed"] / 3.6) / car["wheelPerimeter"]
car["wheelRPM"] = wheelRPS * 60
car["RPM"] = car["wheelRPM"] / (car["gearRatios"][car["Gear"] - 1] * car["finalRatio"]) * 4
torque = np.interp(car["RPM"], car["rpmArray"], car["torqArray"])
torque = torque * car["gearRatios"][car["Gear"] - 1] * car["finalRatio"]
suspension = PhysicsConstraints.getVehicleConstraint(car["CID"])
# Drift
suspension.setTyreFriction(car["grip"] / (car["drift"] * ((maxSpeed - gaudges.speed) / maxSpeed)), 2)
suspension.setTyreFriction(car["grip"] / (car["drift"] * ((maxSpeed - gaudges.speed) / maxSpeed)), 3)
# Gas
if gas == ACTIVE:
car["gas"] = torque
else:
car["gas"] = 0
# Emergency brake
if ebrake == ACTIVE:
car["ebrake"] = ebrakePower
else:
car["ebrake"] = 0
# Reverse
if reverse == ACTIVE:
if car["speed"] > 0:
car["brake"] = brakePower
car["gas"] = 0
else:
car["brake"] = 0
car["gas"] = -torque
else:
car["brake"] = 0
# Steering
if right == ACTIVE:
if car["steer"] > -maxSteer:
car["steer"] -= steerSpeed
elif left == ACTIVE:
if car["steer"] < maxSteer:
car["steer"] += steerSpeed
else:
car["steer"] = 0.0
drive = car["drive"]
## drives
# 1: rear
# 2: front
# 3: full
frontDrive = 0
rearDrive = 0
if drive == 1:
rearDrive = 1.5
frontDrive = 0.5
elif drive == 2:
rearDrive = 0.5
frontDrive = 1.5
else:
rearDrive = 1.0
frontDrive = 1.0
for tire in range(4):
# Front tires
if tire < 2:
suspension.applyEngineForce(-car["gas"] * frontDrive, tire)
suspension.applyBraking(car["brake"], tire)
# Rear tires
else:
suspension.applyEngineForce(-car["gas"] * rearDrive, tire)
suspension.applyBraking(car["ebrake"], tire)
suspension.setSteeringValue(car["steer"], 0)
suspension.setSteeringValue(car["steer"], 1)
gaudges.speed = car.getLinearVelocity(1).y * 3.6
car["speed"] = int(gaudges.speed)
if car["speed"] > maxSpeed:
car.localLinearVelocity.y = maxSpeed / 3.6
if car["speed"] < -(maxSpeed / 2):
car.localLinearVelocity.y = -((maxSpeed / 2) / 3.6)
My current script, kinda not what I need.