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

4.0 KiB
Raw Blame History

开始菜单设计

一、场景结构

采用单场景 + 子节点切换方案,仅一个 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 0Scale 拉伸图片铺满,保持原始比例
属性 说明
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 属性切换。

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 序列化的存档文件