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: מעגל ניאון

תרגלו בעצמכם: Godot אונליין