Agarre y derrape
Lección 4 de 20 del curso Juego de Godot: Circuito Neón de Coddy.
Gira bruscamente y el coche se desliza como un disco de hockey: apunta en una dirección y se mueve en otra. Los neumáticos lo evitan. Permiten que el coche avance, pero no que se desplace de lado.
forward.orthogonal() apunta hacia un costado del coche. Divide la velocidad en la parte que va en esa dirección y quita la mayor parte de esa componente en cada fotograma:
var side := forward.orthogonal()
velocity -= side * velocity.dot(side) * minf(1.0, grip * delta)Con grip en 7, el coche sigue la dirección de su parte delantera un instante después de girar, con un derrape breve. Menos agarre significa un derrape más largo. minf(1.0, ...) se asegura de que en un fotograma nunca se quite más de toda la componente lateral.
Desafío
Fácil- Añade
@export var grip := 7.0. - Después del giro, elimina la velocidad lateral como se indicó arriba.
- Pulsa «Jugar» y toma una curva. Prueba un agarre de 2 en el Inspector para derrapar.
Pruébalo tú mismo
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
Todas las lecciones de Juego de Godot: Circuito Neón
Practica por tu cuenta: Playground de Godot