Đồng hồ tính thời gian vòng chạy
Bài học 11 trên 20 trong khóa học Trò chơi Godot: Mạch neon của Coddy.
Các tay đua chạy đua với thời gian. Cộng thời gian của vòng đua sau mỗi khung hình và đặt lại thời gian khi bắt đầu vòng mới:
lap_time += deltaThời gian dễ đọc nhất khi hiển thị bằng phút và giây, như 0:06.4. %04.1f in ra một số có một chữ số thập phân, rộng ít nhất 4 ký tự và có số 0 ở đầu:
func clock(seconds: float) -> String:
return "%d:%04.1f" % [floori(seconds / 60.0), fmod(seconds, 60.0)]Thử thách
DễTính thời gian mỗi vòng đua.
- Thêm
var lap_time := 0.0và tăng giá trị này trong_physics_process. - Trong
finish_lap, đặt lại giá trị này về 0. - Viết
clockvà hiển thị$HUD/Time.text = clock(lap_time)trongshow_hud.
Nhấn “Chơi”: thời gian vòng đua tăng lên và bắt đầu lại sau mỗi vòng. 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