Menu
CoddyTech

Bệ tăng tốc

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

Những mũi tên phát sáng trên đường đua là các bệ tăng tốc. Lái xe qua một bệ, xe sẽ tăng tốc vượt quá max_speed.

Lưu thời gian tăng tốc trong boost_time. Các bệ nằm trong nhóm boost_pads, vì vậy xe có thể tìm thấy tất cả:

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)

Trong thời gian tăng tốc, hãy đếm ngược thời gian, tăng tốc độ tối đa thêm 30 percent và đẩy xe về phía trước:

if boost_time > 0.0:
	boost_time -= delta
	top = max_speed * 1.3
	velocity += forward * accel * delta

Hiển thị hiệu ứng: ống xả phát sáng và ngọn lửa bùng cháy phía sau xe.

challenge icon

Thử thách

Dễ

Khiến các mũi tên phát sáng giúp xe tăng tốc.

  1. Thêm var boost_time := 0.0 bên dưới velocity.
  2. Sau var top := max_speed, thêm phần tăng tốc rồi đến vòng lặp pad.
  3. Đặt $Exhaust.emitting = throttle > 0.0 or boost_time > 0.0 và $Flame.visible = boost_time > 0.0.

Nhấn Chơi và lái xe qua một mũi tên phát sáng: ngọn lửa bùng lên và xe tăng tốc. 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

@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
	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 * 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

Tất cả bài học trong Trò chơi Godot: Mạch neon

Tự luyện tập: Playground Godot