Menu
CoddyTech

Aderenza e derapata

Lezione 4 di 20 del corso Gioco Godot: Circuito al neon di Coddy.

Sterza bruscamente e l'auto slitta come un disco da hockey: punta in una direzione e si muove in un'altra. Gli pneumatici impediscono che accada. Permettono all'auto di rotolare in avanti, ma non di lato.

forward.orthogonal() punta verso il lato dell'auto. Scomponi la velocità nella componente lungo questa direzione e sottrai gran parte di quella componente a ogni fotogramma:

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

Con grip impostato su 7, dopo una svolta l'auto segue il muso con un leggero ritardo, con una breve derapata. Più bassa è la presa, più lunga è la derapata. minf(1.0, ...) fa sì che in un fotogramma non venga mai sottratta più dell'intera componente laterale.

challenge icon

Sfida

Facile
  1. Aggiungi @export var grip := 7.0.
  2. Dopo la sterzata, elimina la velocità laterale come sopra.
  3. Premi «Gioca» e affronta una curva. Prova un grip di 2 nell'Inspector per derapare.

Provalo tu

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

Tutte le lezioni di Gioco Godot: Circuito al neon

Esercitati da solo: Playground Godot