Menu
CoddyTech

Adhérence et dérapage

Leçon 4 sur 20 du cours Jeu Godot : Circuit néon de Coddy.

Tourne brusquement et la voiture glisse comme une rondelle de hockey : elle pointe dans une direction et se déplace dans une autre. Les pneus empêchent cela. Ils permettent à une voiture d’avancer, mais pas de glisser sur le côté.

forward.orthogonal() pointe vers le côté de la voiture. Décompose la vitesse en sa composante dans cette direction et retire la majeure partie de cette composante à chaque image :

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

Avec grip réglé sur 7, la voiture suit la direction de son nez un instant après un virage, avec une courte dérive. Plus l’adhérence est faible, plus la dérive est longue. minf(1.0, ...) garantit qu’une image ne retire jamais plus que toute la composante latérale.

challenge icon

Défi

Facile
  1. Ajoute @export var grip := 7.0.
  2. Après le virage, élimine la vitesse latérale comme ci-dessus.
  3. Appuie sur « Jouer » et prends un virage. Essaie une adhérence de 2 dans l’inspecteur pour déraper.

Essayez vous-même

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

Toutes les leçons de Jeu Godot : Circuit néon

Entraînez-vous par vous-même : Playground Godot