- 删除旧 StartMenu.tscn,新建 MainMenu.tscn + MainMenu.gd - 新增 MainGame.tscn 主游戏场景作为运行入口 - project.godot 配置 run/main_scene 启动场景 - 添加 doc/design/UI/StartMenu.md 主菜单设计文档 - 新增 assets/ 资源目录结构 (audio/fonts/sprites) - 修复通用资源分析文档中的缩进问题
4.0 KiB
4.0 KiB
开始菜单设计
一、场景结构
采用单场景 + 子节点切换方案,仅一个 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 属性切换。
func _on_new_game_pressed():
button_group.hide()
new_game_panel.show()
func _on_back_pressed():
new_game_panel.hide()
button_group.show()
四、进入游戏流程
新游戏确认后调用:
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序列化的存档文件