Menu
CoddyTech

מיקום במרוץ

שיעור 16 מתוך 20 בקורס משחק Godot: מעגל ניאון של Coddy.

אתם מנצחים? המקום שלכם הוא אחד, ועוד אחד על כל יריב שלפניכם. כדי להשוות, מדדו את ההתקדמות שלכם במרוץ באותה דרך שבה מודדים את ההתקדמות של יריב: מספר ההקפות כפול אורך המסלול, ועוד המרחק שעברתם בהקפה הנוכחית.

השתמשו בנקודות הביקורת, כדי שקיצור דרך לעולם לא יקדם אתכם: אתם נמצאים לפחות בנקודת הביקורת האחרונה שעברתם ולכל היותר נקודת ביקורת אחת אחריה:

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

הציגו את המקום בתור 1st, 2nd, 3rd או 4th. ordinal בוחר את הסיומת: ["th", "st", "nd", "rd"][place] עבור 1 עד 3, ואחר כך th.

challenge icon

אתגר

בינוני
  1. כתבו את race_distance ואת position_in_race ב־race.gd.
  2. כתבו את ordinal(place: int) -> String.
  3. בתוך show_hud, הגדירו את $HUD/Position.text = "%s / %d" % [ordinal(position_in_race()), rivals.size() + 1].

נסו בעצמכם

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 iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Godot: מעגל ניאון

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