Vị trí trong cuộc đua
Bài học 16 trên 20 trong khóa học Trò chơi Godot: Mạch neon của Coddy.
Bạn đang dẫn đầu chứ? Vị trí của bạn là 1, cộng thêm 1 cho mỗi đối thủ ở phía trước. Để so sánh, hãy đo quãng đường đua của bạn giống như cách đo tiến độ của đối thủ: số vòng nhân với chiều dài đường đua, cộng thêm quãng đường bạn đã đi được trong vòng hiện tại.
Hãy dùng các điểm kiểm tra để đường tắt không bao giờ giúp bạn vượt lên: bạn đang ở ít nhất là điểm kiểm tra cuối cùng đã đi qua và nhiều nhất là một điểm kiểm tra sau đó:
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 placeHiển thị thứ hạng là 1st, 2nd, 3rd hoặc 4th. ordinal chọn phần kết thúc: ["th", "st", "nd", "rd"][place] cho 1 đến 3, còn lại là th.
Thử thách
Trung bìnhHiển thị vị trí của bạn trong cuộc đua.
- Viết
race_distancevàposition_in_racetrongrace.gd. - Viết
ordinal(place: int) -> String. - Trong
show_hud, đặt$HUD/Position.text = "%s / %d" % [ordinal(position_in_race()), rivals.size() + 1].
Nhấn Chơi: HUD hiển thị 4th / 4 và vị trí tăng lên khi bạn vượt qua một đối thủ. Sau đó, nhấn Kiểm tra.
Tự làm thử
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
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Trò chơi Godot: Mạch neon
Tự luyện tập: Playground Godot