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.12Sau đó, dùng grip_now tại chỗ vận tốc ngang bị loại bỏ.
Thử thách
DễKhiến các vũng dầu làm xe mất độ bám.
- Sau
var top := max_speed, thêmvar grip_now := grip. - Sau vòng lặp qua các bệ tăng tốc, thêm vòng lặp qua dầu.
- Dùng
grip_nowthay chogriptrong 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