Menu
CoddyTech

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.

challenge icon

Desafío

Fácil
  1. Añade @export var grip := 7.0.
  2. Después del giro, elimina la velocidad lateral como se indicó arriba.
  3. 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