# 开始菜单设计 ## 一、场景结构 采用**单场景 + 子节点切换**方案,仅一个 `MainMenu.tscn`。 ``` MainMenu.tscn ├── BG (TextureRect) │ └── 背景图片 ├── Logo (TextureRect) │ └── 游戏 Logo ├── ButtonGroup (VBoxContainer) │ ├── 新游戏按钮 → 显示 NewGamePanel │ ├── 读取存档按钮 → 显示 LoadGamePanel │ ├── 设置按钮 → 显示 SettingsPanel │ └── 退出按钮 → get_tree().quit() ├── NewGamePanel (Panel, 默认隐藏) │ ├── 宗门名称输入框 (LineEdit) │ ├── 难度选择 (OptionButton) │ │ ├── 简单 │ │ ├── 普通 │ │ └── 困难 │ ├── 确认按钮 → 进入游戏 │ └── 返回按钮 → 隐藏自身 ├── LoadGamePanel (Panel, 默认隐藏) │ ├── 存档列表 (ItemList) │ ├── 加载按钮 │ └── 返回按钮 └── SettingsPanel (Panel, 默认隐藏) ├── 音量滑块 (HSlider) ├── 全屏切换 (CheckBox) └── 返回按钮 ``` ## 二、场景节点属性说明 ### MainMenu(根节点 — Control) | 属性 | 值 | 说明 | |------|----|------| | `anchors_preset` | 15(Full Rect) | 四角锚定父节点边界 | | `anchor_right` | 1.0 | 右边缘锚定到父节点右边界 | | `anchor_bottom` | 1.0 | 下边缘锚定到父节点下边界 | | `grow_horizontal` | 2 | 控件缩小时向右收缩 | | `grow_vertical` | 2 | 控件缩小时向下收缩 | | `size_flags_horizontal` | 3 | Fill + Expand,水平填充可用空间 | | `size_flags_vertical` | 3 | Fill + Expand,垂直填充可用空间 | ### BG(TextureRect — 背景) | 属性 | 值 | 说明 | |------|----|------| | `anchors_preset` | 15(Full Rect) | 铺满父节点 | | `anchor_right` / `anchor_bottom` | 1.0 | 锚定右下边界 | | `stretch_mode` | 0(Scale) | 拉伸图片铺满,保持原始比例 | ### Logo(TextureRect — 游戏 Logo) | 属性 | 值 | 说明 | |------|----|------| | `anchors_preset` | 1(Top Center) | 顶部居中锚点 | | `anchor_left` / `anchor_right` | 0.5 | 水平居中 | | `offset_left` | -200 | 左偏移,使宽度为 400 | | `offset_right` | 200 | 右偏移 | | `offset_top` | 60 | 距顶部 60px | | `offset_bottom` | 260 | 距顶部 260px(高 200) | | `grow_horizontal` | 2 | 向左收缩 | ### ButtonGroup(VBoxContainer — 按钮组) | 属性 | 值 | 说明 | |------|----|------| | `anchors_preset` | 8(Center) | 居中锚定 | | `anchor_left / top / right / bottom` | 0.5 | 中心点对齐 | | `offset_left` | -100 | 向左扩展 100px(总宽 200) | | `offset_right` | 100 | 向右扩展 100px | | `offset_top` | -80 | 向上扩展 80px(总高 160) | | `offset_bottom` | 80 | 向下扩展 80px | | `grow_horizontal` | 2 | 向左收缩 | | `grow_vertical` | 2 | 向上收缩 | | `theme_override_constants/separation` | 16 | 按钮间距 16px | ### Button(子按钮) | 属性 | 值 | 说明 | |------|----|------| | `custom_minimum_size` | Vector2(200, 48) | 按钮最小尺寸,宽 200 高 48 | | `text` | "新游戏" 等 | 按钮显示文字 | --- ## 三、面板切换逻辑 所有面板放在同一场景内,通过 `visible` 属性切换。 ```gdscript func _on_new_game_pressed(): button_group.hide() new_game_panel.show() func _on_back_pressed(): new_game_panel.hide() button_group.show() ``` ## 四、进入游戏流程 新游戏确认后调用: ```gdscript func _on_confirm_new_game(): var sect_name = $NewGamePanel/NameInput.text var difficulty = $NewGamePanel/Difficulty.selected # 初始化游戏数据 GameData.start_new_game(sect_name, difficulty) get_tree().change_scene_to_file("res://src/main/MainGame.tscn") ``` ## 五、注意事项 - 面板切换使用 `show()` / `hide()`,不销毁节点,保留输入状态 - 背景和 Logo 可加淡入动画(AnimationPlayer) - 存档列表数据来源:`ResourceSaver` 序列化的存档文件