Menu
CoddyTech

Grip und Driften

Lektion 4 von 20 im Kurs Godot-Spiel: Neon-Rennstrecke von Coddy.

Lenkst du scharf ein, rutscht das Auto wie ein Hockeypuck: Es zeigt in eine Richtung und bewegt sich in eine andere. Reifen verhindern das. Sie lassen ein Auto vorwärts rollen, aber nicht seitwärts.

forward.orthogonal() zeigt zur Seite des Autos. Zerlege die Geschwindigkeit in den Anteil entlang dieser Richtung und ziehe in jedem Frame den größten Teil davon ab:

var side := forward.orthogonal()
velocity -= side * velocity.dot(side) * minf(1.0, grip * delta)

Bei einem grip von 7 folgt das Auto kurz nach dem Abbiegen seiner Fahrtrichtung und driftet dabei ein wenig. Je geringer der Grip, desto länger der Drift. minf(1.0, ...) stellt sicher, dass in einem Frame nie mehr als der gesamte seitliche Anteil abgezogen wird.

challenge icon

Aufgabe

Einfach
  1. Füge @export var grip := 7.0 hinzu.
  2. Nimm nach dem Lenken wie oben die Seitwärtsgeschwindigkeit weg.
  3. Drücke „Spielen“ und fahre durch eine Kurve. Probiere im Inspector einen Grip von 2 aus, um zu driften.

Probier es selbst

extends Node2D

@export var accel := 260.0
@export var max_speed := 200.0
@export var turn_speed := 3.2
@export var drag := 0.6

var velocity := Vector2.ZERO


func _physics_process(delta: float) -> void:
	var throttle := Input.get_axis("move_down", "move_up")
	var steer := Input.get_axis("move_left", "move_right")

	var forward := Vector2.RIGHT.rotated(rotation)
	var speed := velocity.dot(forward)

	if throttle < 0.0 and speed > 10.0:
		velocity += forward * throttle * accel * 1.6 * delta
	else:
		velocity += forward * throttle * accel * delta
	rotation += steer * turn_speed * delta * clampf(absf(speed) / 90.0, 0.0, 1.0) * signf(speed + 0.01)
	velocity *= 1.0 - drag * delta
	velocity = velocity.limit_length(max_speed)
	position += velocity * delta
	$Exhaust.emitting = throttle > 0.0

Alle Lektionen in Godot-Spiel: Neon-Rennstrecke

Übe selbstständig: Godot-Playground