Menu
CoddyTech

ثلاثة منافسين

الدرس 15 من 20 في دورة لعبة Godot: حلبة النيون على Coddy.

ينضم منافسان آخران إلى شبكة الانطلاق، أحدهما كهرماني والآخر أخضر، ولكل منهما سرعته القصوى ومساره الخاص. يجب أن يعرف السباق متى ينهي كل منهما السباق.

عدد لفات المنافس هو تقدمه على طول المسار، مقربًا إلى الأسفل:

func laps_done() -> int:
	return int(progress / track.length)

المنافسون ضمن مجموعة rivals. في كل إطار، يُضاف إليها أي منافس أتم ثلاث لفات ولم يُدرج بعد في قائمة finished:

for rival in rivals:
	if rival.laps_done() >= LAPS and not finished.has(rival.name):
		finished.append(rival.name)
challenge icon

التحدي

سهل
  1. في rival.gd، أضف laps_done.
  2. في race.gd، أضف var finished: Array[String] = [] و@onready var rivals: Array[Node] = get_tree().get_nodes_in_group("rivals").
  3. بعد check_progress()، أضف الحلقة المذكورة أعلاه.

جرّب بنفسك

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

جميع دروس لعبة Godot: حلبة النيون

تدرّب بنفسك: Playground لـ Godot