Lent dans les virages
Leçon 14 sur 20 du cours Jeu Godot : Circuit néon de Coddy.
La voiture rivale prend les virages à pleine vitesse, ce qu’aucun conducteur ne ferait. Fais-la freiner dans les virages. track.turn_ahead(progress, 70.0) indique de combien la piste tourne sur les 70 prochains pixels, en radians.
Plus le virage est serré, plus la vitesse visée est faible, jusqu’à 18 pour cent de moins. Ensuite, elle se rapproche progressivement de cette vitesse, comme une voiture qui accélère et ralentit :
var turn: float = track.turn_ahead(progress, 70.0)
var target := top_speed * (1.0 - clampf(turn / 3.0, 0.0, 0.18))
speed = move_toward(speed, target, 160.0 * delta)
progress += speed * deltaLa voiture rivale démarre maintenant à l’arrêt, comme toi.
Défi
Facile- Ajoute
var speed := 0.0dansrival.gd. - Remplace
progress += top_speed * deltapar les quatre lignes 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