Menu
CoddyTech

Ergebnisse

Lektion 18 von 20 im Kurs Godot-Spiel: Neon-Rennstrecke von Coddy.

Beim Zieleinlauf sollte angezeigt werden, wie du abgeschnitten hast. Du kommst auch auf die Liste finished, also ist dein Platz die Länge der Liste, wenn du die Ziellinie überquerst:

finished.append("Car")
var place := finished.size()
var words := "You win!" if place == 1 else "You finished %s" % ordinal(place)

Nach dem Zieleinlauf ist die Renndistanz bedeutungslos, daher ergibt sich die Position aus der Liste:

if state == "done":
	return finished.find("Car") + 1
challenge icon

Aufgabe

Einfach
  1. Füge in finish_race das Auto zur Liste hinzu und ermittle words.
  2. Zeige "%s\nTime %s" % [words, clock(race_time)] an.
  3. Beginne position_in_race mit der obigen Prüfung auf den abgeschlossenen Zustand.

Probier es selbst

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

Alle Lektionen in Godot-Spiel: Neon-Rennstrecke

Übe selbstständig: Godot-Playground