Menu
CoddyTech

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 place

Mué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í.

challenge icon

Desafío

Intermedio
  1. Escribe race_distance y position_in_race en race.gd.
  2. Escribe ordinal(place: int) -> String.
  3. 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
quiz iconPonte a prueba

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