Hi, I'm a godot beginner and I have followed this simple car tutorial from kidscancode Arcade style car
extends Spatial
onready var ball = $Ball
onready var car_mesh = $CarMesh
onready var ground_ray = $CarMesh/RayCast
onready var right_wheel = $CarMesh/tmpParent/suv/wheel_frontRight
onready var left_wheel = $CarMesh/tmpParent/suv/wheel_frontLeft
onready var body_mesh = $CarMesh/tmpParent/suv/body
onready var num_cameras = $CarMesh/CameraPositions.get_child_count()
var current_camera = 0
var sphere_offset = Vector3(0, -1.0, 0)
var acceleration = 60
var steering = 21.0
var turn_speed = 5
var turn_stop_limit = 0.75
var speed_input = 0
var rotate_input = 0
var body_tilt = 25
func _ready():
ground_ray.add_exception(ball)
emit_signal("change_camera", $CarMesh/CameraPositions.get_child(current_camera))
func _physics_process(_delta):
car_mesh.transform.origin = ball.transform.origin + sphere_offset
ball.add_central_force(-car_mesh.global_transform.basis.z * speed_input)
func _process(delta):
speed_input = 0
speed_input += Input.get_action_strength("accelerate")
speed_input -= Input.get_action_strength("brake")
speed_input *= acceleration
rotate_input = 0
rotate_input += Input.get_action_strength("steer_left")
rotate_input -= Input.get_action_strength("steer_right")
rotate_input *= deg2rad(steering)
right_wheel.rotation.y = rotate_input
left_wheel.rotation.y = rotate_input
if ball.linear_velocity.length() > turn_stop_limit:
var new_basis = car_mesh.global_transform.basis.rotated(car_mesh.global_transform.basis.y, rotate_input)
car_mesh.global_transform.basis = car_mesh.global_transform.basis.slerp(new_basis, turn_speed * delta)
car_mesh.global_transform = car_mesh.global_transform.orthonormalized()
var t = -rotate_input * ball.linear_velocity.length() / body_tilt
body_mesh.rotation.z = lerp(body_mesh.rotation.z, t, 10 * delta)
var n = ground_ray.get_collision_normal()
var xform = align_with_y(car_mesh.global_transform, n.normalized())
car_mesh.global_transform = car_mesh.global_transform.interpolate_with(xform, 10 * delta)
func align_with_y(xform, new_y):
xform.basis.y = new_y
xform.basis.x = -xform.basis.z.cross(new_y)
xform.basis = xform.basis.orthonormalized()
return xform
It's working so far and I have basic understanding on how the codes work but I want to learn how to expand this farther. for example How would I go about on adding the jump function or drift function? (like MarioKart) I have googled but they all seems to be for Kinematic3D node, not Spatial
Thanks