Mantente en la pista
Lección 5 de 20 del curso Juego de Godot: Circuito Neón de Coddy.
La pista se dibuja con track.gd, que también responde preguntas sobre ella. track.is_on_road(position) es verdadero mientras un punto está en la pista. Fuera de ella, el coche debería avanzar lentamente por la hierba.
Obtén el nodo de la pista una vez, cuando el coche esté listo:
@onready var track: Node2D = $"../Track"Después, guarda una velocidad máxima para este fotograma. Fuera de la pista, es el 45 por ciento de max_speed, y la hierba también ralentiza el coche:
var top := max_speed
if not track.is_on_road(position):
top = max_speed * 0.45
velocity *= 1.0 - 2.5 * deltaPor último, reemplaza limit_length. Reducir bruscamente la velocidad detendría el coche en seco al llegar al borde de la pista, así que redúcela gradualmente hasta la velocidad máxima:
if velocity.length() > top:
velocity = velocity.move_toward(velocity.limit_length(top), accel * 2.0 * delta)Desafío
Fácil- Añade la línea
@onreadypara la pista. - Después de
speed, calculatopy la ralentización fuera de la carretera. - Reemplaza la línea
limit_lengthpor las dos líneas anteriores. - Pulsa «Jugar» y conduce sobre el césped.
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
@export var grip := 7.0
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)
var side := forward.orthogonal()
velocity -= side * velocity.dot(side) * minf(1.0, grip * delta)
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