/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/PlayerDriver.gd
88 строк
3 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
# res://scripts/PlayerDriver.gd extends Node class_name PlayerDriver @export var car_path: NodePath @export var max_speed_kph: float = 320.0 @export var accel_rate: float = 12.0 @export var brake_rate: float = 28.0 @export var coast_drag: float = 2.5 @export var lateral_speed_mps: float = 6.0 @export var auto_center_rate: float = 0.7 var car: RaceCar = null var v_desired: float = 0.0 func _enter_tree() -> void: _add_key(&"accelerate", KEY_W); _add_key(&"accelerate", KEY_UP) _add_key(&"brake", KEY_S); _add_key(&"brake", KEY_DOWN) _add_key(&"left", KEY_A); _add_key(&"left", KEY_LEFT) _add_key(&"right", KEY_D); _add_key(&"right", KEY_RIGHT) _add_key(&"car_start", KEY_SPACE) # дублируем старт func _ready() -> void: if car_path != NodePath(""): car = get_node_or_null(car_path) as RaceCar else: var n: Node = get_parent() while n != null and car == null: if n is RaceCar: car = n as RaceCar else: n = n.get_parent() if car == null: push_error("[PlayerDriver] RaceCar not found. Set Car Path.") set_process(false); set_physics_process(false) return v_desired = 0.0 func _physics_process(dt: float) -> void: if car == null: return var max_v: float = max_speed_kph / 3.6 var accel: bool = Input.is_action_pressed(&"accelerate") var brake: bool = Input.is_action_pressed(&"brake") # автостарт по первому газу if accel and not car.is_started(): car.start_drive() if accel and not brake: v_desired += accel_rate * dt elif brake and not accel: v_desired -= brake_rate * dt else: v_desired -= coast_drag * dt v_desired = clamp(v_desired, 0.0, max_v) # игрок — всегда «владелец» скорости if car.has_method("set_target_speed_from_player"): car.set_target_speed_from_player(v_desired) else: car.set_target_speed_mps(v_desired) # Поперечное смещение по A/D var steer: float = 0.0 if Input.is_action_pressed(&"left"): steer -= 1.0 if Input.is_action_pressed(&"right"): steer += 1.0 var h: float = car.h_offset if steer != 0.0: h += steer * lateral_speed_mps * dt else: # мягкий возврат к центру if h > 0.0: h = max(0.0, h - auto_center_rate * dt) elif h < 0.0: h = min(0.0, h + auto_center_rate * dt) # ограничение по ширине берём из машины var lim: float = car.lateral_limit_m car.h_offset = clamp(h, -lim, lim) # ---- helpers ---- func _add_key(action: StringName, code: int) -> void: if not InputMap.has_action(action): InputMap.add_action(action) var ev := InputEventKey.new() ev.physical_keycode = code InputMap.action_add_event(action, ev)