Menu
CoddyTech

Vị trí trong cuộc đua

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

Bạn đang dẫn đầu chứ? Vị trí của bạn là 1, cộng thêm 1 cho mỗi đối thủ ở phía trước. Để so sánh, hãy đo quãng đường đua của bạn giống như cách đo tiến độ của đối thủ: số vòng nhân với chiều dài đường đua, cộng thêm quãng đường bạn đã đi được trong vòng hiện tại.

Hãy dùng các điểm kiểm tra để đường tắt không bao giờ giúp bạn vượt lên: bạn đang ở ít nhất là điểm kiểm tra cuối cùng đã đi qua và nhiều nhất là một điểm kiểm tra sau đó:

func race_distance() -> float:
	var seg: float = track.length / CHECKPOINTS
	var done_cp := (next_checkpoint - 1 + CHECKPOINTS) % CHECKPOINTS
	var past: float = wrapf(track.offset_of(car.position) - done_cp * seg, -seg, seg * 2.0)
	return laps * track.length + done_cp * seg + clampf(past, 0.0, seg)
func position_in_race() -> int:
	var mine := race_distance()
	var place := 1
	for rival in rivals:
		if rival.progress > mine:
			place += 1
	return place

Hiển thị thứ hạng là 1st, 2nd, 3rd hoặc 4th. ordinal chọn phần kết thúc: ["th", "st", "nd", "rd"][place] cho 1 đến 3, còn lại là th.

challenge icon

Thử thách

Trung bình

Hiển thị vị trí của bạn trong cuộc đua.

  1. Viết race_distance và position_in_race trong race.gd.
  2. Viết ordinal(place: int) -> String.
  3. Trong show_hud, đặt $HUD/Position.text = "%s / %d" % [ordinal(position_in_race()), rivals.size() + 1].

Nhấn Chơi: HUD hiển thị 4th / 4 và vị trí tăng lên khi bạn vượt qua một đối thủ. 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
var active := true

@onready var track: Node2D = $"../Track"


func _physics_process(delta: float) -> void:
	var throttle := 0.0
	var steer := 0.0
	if active:
		throttle = Input.get_axis("move_down", "move_up")
		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
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