Đếm số vòng
Bài học 10 trên 20 trong khóa học Trò chơi Godot: Mạch neon của Coddy.
Đến checkpoint 0, tức vạch đích, sau tất cả các checkpoint khác là hoàn thành một vòng. Hãy tính vòng đó tại thời điểm bạn đếm checkpoint:
if next_checkpoint == 0:
finish_lap()Đồng thời, hiển thị vòng bạn đang chạy trên HUD. Vòng đầu tiên là vòng 1, vì vậy hãy hiển thị số vòng đã hoàn thành cộng thêm một:
func show_hud() -> void:
$HUD/Lap.text = "Lap %d" % (laps + 1)Gọi show_hud một lần trong _ready và gọi lại ở mỗi khung hình sau check_progress.
Thử thách
DễĐếm số vòng đua và hiển thị chúng.
- Thêm
var laps := 0. - Trong
check_progress, trước khi đặt điểm kiểm tra tiếp theo, hãy gọifinish_lap()khinext_checkpoint == 0. - Viết
finish_lap(hàm này tănglapsthêm một) vàshow_hud. - Gọi
show_hud()từ_readyvà_physics_process.
Nhấn Chơi và lái một vòng đua: HUD chuyển từ Lap 1 sang Lap 2. 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
@onready var track: Node2D = $"../Track"
func _physics_process(delta: float) -> void:
var throttle := Input.get_axis("move_down", "move_up")
var 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
Tất cả bài học trong Trò chơi Godot: Mạch neon
Tự luyện tập: Playground Godot