Files
SectSimulator/doc/design/UI/StartMenu.md
T
Admin 17994ec4ae refactor: 重构主菜单 UI,将 StartMenu 替换为 MainMenu
- 删除旧 StartMenu.tscn,新建 MainMenu.tscn + MainMenu.gd
- 新增 MainGame.tscn 主游戏场景作为运行入口
- project.godot 配置 run/main_scene 启动场景
- 添加 doc/design/UI/StartMenu.md 主菜单设计文档
- 新增 assets/ 资源目录结构 (audio/fonts/sprites)
- 修复通用资源分析文档中的缩进问题
2026-07-30 23:25:21 +08:00

125 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 开始菜单设计
## 一、场景结构
采用**单场景 + 子节点切换**方案,仅一个 `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` | 15Full 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,垂直填充可用空间 |
### BGTextureRect — 背景)
| 属性 | 值 | 说明 |
|------|----|------|
| `anchors_preset` | 15Full Rect | 铺满父节点 |
| `anchor_right` / `anchor_bottom` | 1.0 | 锚定右下边界 |
| `stretch_mode` | 0(Scale) | 拉伸图片铺满,保持原始比例 |
### LogoTextureRect — 游戏 Logo
| 属性 | 值 | 说明 |
|------|----|------|
| `anchors_preset` | 1Top 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 | 向左收缩 |
### ButtonGroupVBoxContainer — 按钮组)
| 属性 | 值 | 说明 |
|------|----|------|
| `anchors_preset` | 8Center | 居中锚定 |
| `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` 序列化的存档文件