Menu
CoddyTech

Đồ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 += delta

Thờ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)]
challenge icon

Thử thách

Dễ

Tính thời gian mỗi vòng đua.

  1. Thêm var lap_time := 0.0 và tăng giá trị này trong _physics_process.
  2. Trong finish_lap, đặt lại giá trị này về 0.
  3. Viết clock và hiển thị $HUD/Time.text = clock(lap_time) trong show_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