/
ulupapi
/
Race_game
Обзор
Документация
Войти
/
ulupapi
/
Race_game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/HudLeft.gd
188 строк
5 KB
ulupapi
Game
26 дек 2025, 19:34
26 дек 2025, 19:34
7574b6d
Код
Авторство
О чём код?
# res://scripts/HudLeft.gd extends Control @export var car_path: NodePath @export var pitlane_path: NodePath @export var debug_log: bool = false var _car: Node = null var _pitlane: Node = null var _panel: PanelContainer var _grid: GridContainer var _lbl_speed: Label var _lbl_tyre: Label var _bar_wear: ProgressBar var _lbl_drs: Label var _lbl_pit: Label var _probe_timer: float = 0.0 func _ready() -> void: # геометрия левого сайдбара (360 px) anchor_left = 0.0 anchor_top = 0.0 anchor_right = 0.0 anchor_bottom = 1.0 offset_left = 0.0 offset_right = 360.0 offset_top = 0.0 offset_bottom = 0.0 # ссылки по экспортам if car_path != NodePath(""): _car = get_node_or_null(car_path) if pitlane_path != NodePath(""): _pitlane = get_node_or_null(pitlane_path) _build_ui() set_process(true) func _process(delta: float) -> void: # автопоиск, если не задали пути _probe_timer += delta if _probe_timer >= 0.5: _probe_timer = 0.0 if _car == null: var pcs: Array = get_tree().get_nodes_in_group("player_car") if pcs.size() > 0: _car = pcs[0] if debug_log: print("[HudLeft] auto-car: ", _car.get_path()) if _pitlane == null: var pls: Array = get_tree().get_nodes_in_group("pitlane") if pls.size() > 0: _pitlane = pls[0] if debug_log: print("[HudLeft] auto-pitlane: ", _pitlane.get_path()) _update_readings() func _build_ui() -> void: _panel = PanelContainer.new() _panel.anchor_left = 0.0 _panel.anchor_right = 1.0 _panel.anchor_top = 0.0 _panel.anchor_bottom = 0.0 _panel.offset_left = 12.0 _panel.offset_right = -12.0 _panel.offset_top = 12.0 _panel.offset_bottom = 0.0 add_child(_panel) var pad := MarginContainer.new() pad.add_theme_constant_override("margin_left", 12) pad.add_theme_constant_override("margin_right", 12) pad.add_theme_constant_override("margin_top", 12) pad.add_theme_constant_override("margin_bottom", 12) _panel.add_child(pad) _grid = GridContainer.new() _grid.columns = 2 pad.add_child(_grid) # SPEED var l1 := Label.new() l1.text = "SPEED" _grid.add_child(l1) _lbl_speed = _make_val() _grid.add_child(_lbl_speed) # TYRE var l2 := Label.new() l2.text = "TYRE" _grid.add_child(l2) _lbl_tyre = _make_val() _grid.add_child(_lbl_tyre) # WEAR (progress bar — только один индикатор, без повторения текста) var l3 := Label.new() l3.text = "WEAR" _grid.add_child(l3) _bar_wear = ProgressBar.new() _bar_wear.min_value = 0.0 _bar_wear.max_value = 100.0 _bar_wear.step = 1.0 _bar_wear.value = 0.0 _bar_wear.size_flags_horizontal = Control.SIZE_EXPAND_FILL _grid.add_child(_bar_wear) # DRS var l4 := Label.new() l4.text = "DRS" _grid.add_child(l4) _lbl_drs = _make_val() _grid.add_child(_lbl_drs) # PIT var l5 := Label.new() l5.text = "PIT" _grid.add_child(l5) _lbl_pit = _make_val() _grid.add_child(_lbl_pit) # стартовые значения _lbl_speed.text = "-- km/h" _lbl_tyre.text = "--" _bar_wear.value = 0.0 _lbl_drs.text = "OFF" _lbl_pit.text = "OFF" func _make_val() -> Label: var lb := Label.new() lb.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT return lb func _update_readings() -> void: # SPEED var s_txt: String = "-- km/h" if _car != null and _car.has_method("get_speed_kph"): var sp: float = float(_car.call("get_speed_kph")) s_txt = str(int(round(sp))) + " km/h" _lbl_speed.text = s_txt # TYRE + WEAR var comp: String = "--" var wearp: float = 0.0 if _car != null: if _car.has_method("get_tyre_compound"): comp = String(_car.call("get_tyre_compound")) if _car.has_method("get_tyre_wear_percent"): wearp = float(_car.call("get_tyre_wear_percent")) if wearp < 0.0: wearp = 0.0 if wearp > 100.0: wearp = 100.0 _lbl_tyre.text = comp + " " + str(int(round(wearp))) + " %" _bar_wear.value = wearp # DRS (ON/OFF) var drs_txt: String = "OFF" if _car != null and _car.has_method("is_drs_active"): var on: bool = bool(_car.call("is_drs_active")) if on: drs_txt = "ON" _lbl_drs.text = drs_txt # PIT: ACTIVE / ARMED / LIMIT xx / OFF var pit_txt: String = "OFF" var active: bool = false if _car != null and _car.has_method("is_pit_active"): active = bool(_car.call("is_pit_active")) if active: pit_txt = "ACTIVE" else: var armed: bool = false if _pitlane != null and _pitlane.has_method("is_armed"): armed = bool(_pitlane.call("is_armed")) if armed: pit_txt = "ARMED" else: var lim: float = 0.0 if _car != null and _car.has_method("get_speed_limit_kph"): lim = float(_car.call("get_speed_limit_kph")) if lim > 0.0: pit_txt = "LIMIT " + str(int(round(lim))) + " kph" else: pit_txt = "OFF" _lbl_pit.text = pit_txt