Menu
CoddyTech

بطء في المنعطفات

الدرس 14 من 20 في دورة لعبة Godot: حلبة النيون على Coddy.

ينعطف المنافس بأقصى سرعة، وهذا ما لا يفعله أي سائق. اجعله يخفف سرعته عند المنعطفات. تخبرك track.turn_ahead(progress, 70.0) بمدى انحناء المسار خلال الـ 70 بكسل التالية، بوحدة الراديان.

كلما كان المنعطف أشد، انخفضت السرعة التي يستهدفها، بنسبة تصل إلى 18 بالمئة. ثم يقترب تدريجيًا من تلك السرعة، كما تتسارع السيارة وتتباطأ:

var turn: float = track.turn_ahead(progress, 70.0)
var target := top_speed * (1.0 - clampf(turn / 3.0, 0.0, 0.18))
speed = move_toward(speed, target, 160.0 * delta)
progress += speed * delta

يبدأ المنافس الآن من السكون، مثلك.

challenge icon

التحدي

سهل
  1. أضف var speed := 0.0 إلى rival.gd.
  2. استبدل progress += top_speed * delta بالأسطر الأربعة أعلاه.

جرّب بنفسك

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