ثلاثة منافسين
الدرس 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)التحدي
سهل- في
rival.gd، أضفlaps_done. - في
race.gd، أضفvar finished: Array[String] = []و@onready var rivals: Array[Node] = get_tree().get_nodes_in_group("rivals"). - بعد
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