Posición en la carrera
Lección 16 de 20 del curso Juego de Godot: Circuito Neón de Coddy.
¿Vas ganando? Tu puesto es uno, más uno por cada rival que tienes delante. Para comparar, mide tu carrera del mismo modo que se mide el progreso de un rival: las vueltas multiplicadas por la longitud de la pista, más cuánto has recorrido.
Usa los puntos de control para que un atajo nunca te haga avanzar: estás como mínimo en el último punto de control que pasaste y como máximo a un punto de control de distancia:
func race_distance() -> float:
var seg: float = track.length / CHECKPOINTS
var done_cp := (next_checkpoint - 1 + CHECKPOINTS) % CHECKPOINTS
var past: float = wrapf(track.offset_of(car.position) - done_cp * seg, -seg, seg * 2.0)
return laps * track.length + done_cp * seg + clampf(past, 0.0, seg)func position_in_race() -> int:
var mine := race_distance()
var place := 1
for rival in rivals:
if rival.progress > mine:
place += 1
return placeMuéstralo como 1.º, 2.º, 3.º o 4.º. ordinal elige la terminación: ["th", "st", "nd", "rd"][place] para los puestos del 1 al 3, y «th» a partir de ahí.
Desafío
Intermedio- Escribe
race_distanceyposition_in_raceenrace.gd. - Escribe
ordinal(place: int) -> String. - En
show_hud, establece$HUD/Position.text = "%s / %d" % [ordinal(position_in_race()), rivals.size() + 1].
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
var boost_time := 0.0
var boost_charge := 0.0
var active := true
@onready var track: Node2D = $"../Track"
func _physics_process(delta: float) -> void:
var throttle := 0.0
var steer := 0.0
if active:
throttle = Input.get_axis("move_down", "move_up")
steer = Input.get_axis("move_left", "move_right")
if Input.is_action_just_pressed("action") and boost_charge >= 1.0:
boost_charge = 0.0
boost_time = 1.0
boost_charge = minf(1.0, boost_charge + delta / 10.0)
$"../HUD/Boost".scale.x = boost_charge
var forward := Vector2.RIGHT.rotated(rotation)
var speed := velocity.dot(forward)
var top := max_speed
var grip_now := grip
if boost_time > 0.0:
boost_time -= delta
top = max_speed * 1.3
velocity += forward * accel * delta
for pad in get_tree().get_nodes_in_group("boost_pads"):
if position.distance_to(pad.position) < 22.0:
boost_time = maxf(boost_time, 0.4)
for oil in get_tree().get_nodes_in_group("oil"):
if position.distance_to(oil.position) < 20.0:
grip_now = grip * 0.12
if not track.is_on_road(position):
top = max_speed * 0.45
velocity *= 1.0 - 2.5 * delta
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_now * delta)
velocity *= 1.0 - drag * delta
if velocity.length() > top:
velocity = velocity.move_toward(velocity.limit_length(top), accel * 2.0 * delta)
position += velocity * delta
$Exhaust.emitting = throttle > 0.0 or boost_time > 0.0
$Flame.visible = boost_time > 0.0
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Godot: Circuito Neón
Practica por tu cuenta: Playground de Godot