/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/LapTimerSimple.gd
98 строк
3 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
# res://scripts/LapTimerSimple.gd extends Node class_name LapTimerSimple ## === Экспорт === @export var finish_area_path: NodePath # <- сюда назначьте ваш Area3D финиша (широкий прямоугольник) @export var only_player: bool = true # учитывать только машину игрока (group: "player_car") @export var min_lap_time_s: float = 3.0 # защита от двойных срабатываний ## === Сигналы === signal lap_started(lap_index: int) # вызов после первого пересечения (lap_index = 1) signal lap_completed(lap_index: int, lap_time_s: float, best_time_s: float) ## === Состояние === var _finish: Area3D = null var _car: Node = null var _started: bool = false var _cur_time: float = 0.0 var _last: float = -1.0 var _best: float = -1.0 var _laps: int = 0 func _ready() -> void: add_to_group("lap_timer") if finish_area_path == NodePath(""): push_error("[LapTimerSimple] Укажи finish_area_path на Area3D финиша.") set_process(false) return _finish = get_node_or_null(finish_area_path) as Area3D if _finish == null: push_error("[LapTimerSimple] Не найден Area3D финиша по finish_area_path.") set_process(false) return _finish.monitoring = true _finish.monitorable = true _finish.body_entered.connect(_on_finish_entered) set_process(true) # Не стартуем сразу — ждём первого пересечения финиша func _process(delta: float) -> void: if _started: _cur_time += delta ## === Обработчик финишной линии === func _on_finish_entered(body: Node) -> void: if not _accept_body(body): return # Первый валидный проезд — запускаем таймер, ещё без инкремента лап if not _started: _started = true _cur_time = 0.0 _laps = 0 _last = -1.0 _best = -1.0 emit_signal("lap_started", 1) # со следующего круга пойдёт инкремент return # Идущие круги — отсечка валидна только при выполнении min_lap_time_s if _cur_time < min_lap_time_s: return _laps += 1 _last = _cur_time if _best < 0.0 or _last < _best: _best = _last _cur_time = 0.0 emit_signal("lap_completed", _laps, _last, _best) ## === Фильтр тел === func _accept_body(body: Node) -> bool: if only_player: if _car == null: var pcs: Array = get_tree().get_nodes_in_group("player_car") if pcs.size() > 0: _car = pcs[0] return _car != null and body == _car return true ## === API для HUD === func get_current_time() -> float: return _cur_time if _started else -1.0 func get_last_lap_time() -> float: return _last func get_best_lap_time() -> float: return _best func get_laps() -> int: return _laps func is_started() -> bool: return _started