Trois rivaux
Leçon 15 sur 20 du cours Jeu Godot : Circuit néon de Coddy.
Deux autres concurrents rejoignent la grille, l’un ambre et l’autre vert, chacun avec sa propre vitesse de pointe et sa voie. La course doit savoir quand chacun termine.
Les tours d’un concurrent correspondent à sa progression sur la longueur de la piste, arrondie à l’entier inférieur :
func laps_done() -> int:
return int(progress / track.length)Les concurrents appartiennent au groupe rivals. À chaque image, tout concurrent qui a effectué trois tours et ne figure pas encore dans la liste finished y est ajouté :
for rival in rivals:
if rival.laps_done() >= LAPS and not finished.has(rival.name):
finished.append(rival.name)Défi
Facile- Dans
rival.gd, ajoutezlaps_done. - Dans
race.gd, ajoutezvar finished: Array[String] = []et@onready var rivals: Array[Node] = get_tree().get_nodes_in_group("rivals"). - Après
check_progress(), ajoutez la boucle ci-dessus.
Essayez vous-même
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
Toutes les leçons de Jeu Godot : Circuit néon
Entraînez-vous par vous-même : Playground Godot