Menu
CoddyTech

Kết quả

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

Khi về đích, thông báo cần cho biết bạn đã hoàn thành như thế nào. Bạn cũng được thêm vào danh sách finished, nên vị trí của bạn là độ dài của danh sách khi bạn cán đích:

finished.append("Car")
var place := finished.size()
var words := "You win!" if place == 1 else "You finished %s" % ordinal(place)

Sau khi về đích, khoảng cách đua không còn ý nghĩa, nên vị trí được lấy từ danh sách:

if state == "done":
	return finished.find("Car") + 1
challenge icon

Thử thách

Dễ

Hãy cho biết bạn đã về đích thế nào.

  1. Trong finish_race, thêm xe vào danh sách và tính words.
  2. Hiển thị "%s\nTime %s" % [words, clock(race_time)].
  3. Bắt đầu position_in_race bằng cách kiểm tra đã hoàn thành như trên.

Nhấn Chơi và hoàn thành cuộc đua: thông báo sẽ cho biết bạn thắng hoặc vị trí của bạ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
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

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

Tự luyện tập: Playground Godot