מיקום במרוץ
שיעור 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.
אתגר
בינוני- כתבו את
race_distanceואתposition_in_raceב־race.gd. - כתבו את
ordinal(place: int) -> String. - בתוך
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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה משחק Godot: מעגל ניאון
תרגלו בעצמכם: Godot אונליין