Menu
CoddyTech

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 * delta

Por ú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)
challenge icon

Desafío

Fácil
  1. Añade la línea @onready para la pista.
  2. Después de speed, calcula top y la ralentización fuera de la carretera.
  3. Reemplaza la línea limit_length por las dos líneas anteriores.
  4. 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