Menu
CoddyTech

Vệt dầu

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

Những vũng nước sẫm màu là dầu. Khi đi trên dầu, lốp xe mất độ bám và xe trượt theo hướng đang di chuyển.

Giữ độ bám cho khung hình này trong grip_now. Dầu nằm trong nhóm oil:

var grip_now := grip
for oil in get_tree().get_nodes_in_group("oil"):
	if position.distance_to(oil.position) < 20.0:
		grip_now = grip * 0.12

Sau đó, dùng grip_now tại chỗ vận tốc ngang bị loại bỏ.

challenge icon

Thử thách

Dễ

Khiến các vũng dầu làm xe mất độ bám.

  1. Sau var top := max_speed, thêm var grip_now := grip.
  2. Sau vòng lặp qua các bệ tăng tốc, thêm vòng lặp qua dầu.
  3. Dùng grip_now thay cho grip trong dòng xử lý lực ngang.

Nhấn Chơi và lái xe qua một vũng tối: xe sẽ trượt. 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
	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)
	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 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