полная мета-структура игры: pause + settings + save/load
Some checks failed
Godot CI / Import + smoke test (push) Failing after 13s
Some checks failed
Godot CI / Import + smoke test (push) Failing after 13s
PAUSE-МЕНЮ (autoload PauseMenu CanvasLayer): - ESC во время геймплея открывает оверлей с тёмным фоном и центральной панелью в Шиндовс-стиле. - 4 кнопки: Продолжить / Настройки / В главное меню / Сохранить и выйти. - process_mode = ALWAYS чтобы работать при tree.paused = true. - При закрытии меню в 3D-сценах автоматически возвращает Input.mouse_mode = CAPTURED. - В главном меню pause не активируется (_can_pause false). - set_input_as_handled блокирует FPV-контроллер от перехвата ESC одновременно. НАСТРОЙКИ (под-панель в Pause-меню): - Слайдер «Чувствительность мыши» 0.001-0.010 (по умолчанию 0.0025). - Слайдер «Громкость» 0-100% — связан с AudioServer Bus 0 Master через linear_to_db (audio ассетов пока нет, но шкала рабочая). - Кнопки Назад / Применить. Применить пишет в user://settings.json. - settings.json грузится автоматически при старте GameState._ready. SAVE/LOAD: - GameState.save_game(scene_path) → user://save01.json в JSON с player_name, прогрессом актов 1-2, ачивками, текущей сценой. - GameState.load_game() читает и восстанавливает state, заполняет last_scene_path для перехода. - has_save() / delete_save() помощники. - Кнопка «Продолжить» в главном меню активна только если есть save и грузит игрока в сохранённую сцену. - Кнопка «Новая игра» удаляет старый save и сбрасывает state. AUTO-SAVE: - При закрытии окна через X (NOTIFICATION_WM_CLOSE_REQUEST) — save_game перед quit. - Кнопка Q в FPV-контроллере — save+quit. - Кнопка «Сохранить и выйти» в pause-меню — save+quit. - Кнопка «В главное меню» — save перед переходом. FPV-КОНТРОЛЛЕР: - mouse_sensitivity больше не локальное @export, читается из GameState.mouse_sensitivity каждый mouse_motion event (применяется живьём после Apply). - _input → _unhandled_input чтобы PauseMenu мог перехватить ESC через set_input_as_handled. - Убран ESC-toggle захвата мыши (теперь это делает PauseMenu). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a6f6785188
commit
f8040fb399
7 changed files with 442 additions and 12 deletions
|
|
@ -2,25 +2,41 @@ extends Control
|
|||
|
||||
@onready var btn_new: Button = $Center/V/BtnNew
|
||||
@onready var btn_continue: Button = $Center/V/BtnContinue
|
||||
@onready var btn_settings: Button = $Center/V/BtnSettings
|
||||
@onready var btn_quit: Button = $Center/V/BtnQuit
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||
GameState.reset()
|
||||
DialogManager.set_crosshair_visible(false)
|
||||
DialogManager.set_controls_hint("")
|
||||
DialogManager.set_date_time("", "")
|
||||
DialogManager.set_objective("")
|
||||
|
||||
btn_new.pressed.connect(_on_new_game)
|
||||
btn_continue.pressed.connect(_on_continue)
|
||||
btn_quit.pressed.connect(_on_quit)
|
||||
btn_continue.disabled = not GameState.has_save()
|
||||
if not btn_continue.disabled:
|
||||
btn_continue.text = "Продолжить"
|
||||
btn_new.grab_focus()
|
||||
|
||||
|
||||
func _on_new_game() -> void:
|
||||
GameState.reset()
|
||||
GameState.delete_save()
|
||||
SceneManager.go_room()
|
||||
|
||||
|
||||
func _on_continue() -> void:
|
||||
if not GameState.load_game():
|
||||
return
|
||||
var target: String = GameState.last_scene_path
|
||||
if target == "" or not ResourceLoader.exists(target):
|
||||
target = SceneManager.SCENE_ACT1_ROOM
|
||||
SceneManager.change_scene(target)
|
||||
|
||||
|
||||
func _on_quit() -> void:
|
||||
get_tree().quit()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue