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.
Défi
Facile- Ajoute
@export var grip := 7.0. - Après le virage, élimine la vitesse latérale comme ci-dessus.
- 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