Menu
CoddyTech

Nút tăng tốc

Bài học 8 trên 20 trong khóa học Trò chơi Godot: Mạch neon của Coddy.

Thêm một lần tăng tốc nữa, lần này bạn tự canh thời gian. Một thanh đo đầy dần trong mười giây; khi đầy, phím Enter (hoặc E) kích hoạt tăng tốc trong một giây rồi làm thanh đo cạn đi.

if Input.is_action_just_pressed("action") and boost_charge >= 1.0:
	boost_charge = 0.0
	boost_time = 1.0

is_action_just_pressed chỉ có giá trị true ở khung hình phím được nhấn xuống, nên giữ phím Enter cũng chỉ kích hoạt một lần. Hãy làm đầy thanh đo và hiển thị nó trên thanh HUD, có chiều rộng bằng scale.x:

boost_charge = minf(1.0, boost_charge + delta / 10.0)
$"../HUD/Boost".scale.x = boost_charge
challenge icon

Thử thách

Dễ

Thêm nút tăng tốc cho người chơi.

  1. Thêm var boost_charge := 0.0.
  2. Sau khi đọc các phím, kích hoạt tăng tốc như trên.
  3. Sau đó nạp đầy thanh đo và đặt chiều rộng của thanh như trên.

Nhấn Chơi, đợi mười giây để thanh nạp đầy rồi nhấn Enter: xe tăng tốc vọt lên. 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

@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")

	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
quiz iconTự kiểm tra

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