Menu
CoddyTech

Đế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.

challenge icon

Thử thách

Dễ

Đếm số vòng đua và hiển thị chúng.

  1. Thêm var laps := 0.
  2. Trong check_progress, trước khi đặt điểm kiểm tra tiếp theo, hãy gọi finish_lap() khi next_checkpoint == 0.
  3. Viết finish_lap (hàm này tăng laps thêm một) và show_hud.
  4. Gọi show_hud() từ _ready và _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