设置页组件系统
Galgo 的设置页可以通过 Config.Settings 完全重组。你可以声明分组、组件、排序、显示条件、点击动作和自定义绘制。
基本结构
go
settings := galgo.SettingsConfig{
Title: "SETTINGS",
Sections: []galgo.SettingsSection{
{
ID: "audio",
Title: "Audio",
Order: 10,
Components: []galgo.SettingsComponent{
{ID: "bgm", Label: "BGM Volume", Order: 10, Kind: galgo.SettingsComponentSlider, Value: &galgo.VolumeValue{Channel: "bgm"}},
},
},
},
}传给引擎:
go
galgo.Config{
Settings: settings,
}如果 Settings.Sections 为空,引擎使用旧的内置设置页。如果不为空,引擎使用模块化设置页。
Section
SettingsSection 字段:
ID:稳定标识。Title:分组标题,会翻译。Order:分组排序。Components:组件列表。Visible:动态显示条件。
组件会按 Order 排序。模块化设置页会在空间不足时自动换到第二列。
Component 类型
内置组件类型:
SettingsComponentSlider:滑块。SettingsComponentToggle:开关。SettingsComponentOptions:选项组。SettingsComponentButton:按钮。SettingsComponentCustom:自定义绘制和点击。
通用字段:
IDLabelOrderKindValueActionOptionsOptionsFuncHeightVisibleSensitiveDrawHandleClickValueFormatter
Slider
滑块需要绑定 ScreenValue,值应为 0 到 1 的 float64。
go
galgo.SettingsComponent{
ID: "bgm_volume",
Label: "BGM Volume",
Order: 10,
Kind: galgo.SettingsComponentSlider,
Value: &galgo.VolumeValue{Channel: "bgm"},
}内置滑块值:
VolumeValue{Channel: "bgm"}VolumeValue{Channel: "se"}VolumeValue{Channel: "voice"}TextSpeedValue{}
格式化显示值:
go
ValueFormatter: func(e *galgo.Engine, value interface{}) string {
return "Fast"
}Toggle
开关需要绑定 bool 值。
go
galgo.SettingsComponent{
ID: "bonus",
Label: "Bonus Flag",
Kind: galgo.SettingsComponentToggle,
Value: &galgo.VariableValue{Key: "bonus_enabled"},
}内置开关值:
FullscreenValue{}VariableValue{Key: "..."}
VariableValue 会直接读写引擎变量。作为 toggle 使用时,变量值应为 bool。
Options
选项组适合分辨率、语言、难度、文本框风格等。
go
galgo.SettingsComponent{
ID: "language",
Label: "Language",
Kind: galgo.SettingsComponentOptions,
Value: &galgo.LanguageValue{},
Options: []galgo.SettingsOption{
{Label: "zh", Value: "zh"},
{Label: "en", Value: "en"},
},
}动态选项:
go
OptionsFunc: func(e *galgo.Engine) []galgo.SettingsOption {
return []galgo.SettingsOption{
{Label: "1280x720", Value: 0},
{Label: "1600x900", Value: 1},
{Label: "1920x1080", Value: 2},
}
}内置值:
ResolutionValue{}LanguageValue{}VariableValue{Key: "..."}
如果 SettingsOption.Action 不为空,点击选项会执行 action;否则会把 Value 写入组件的 ScreenValue。
Button
按钮需要绑定 ScreenAction:
go
galgo.SettingsComponent{
ID: "cg_gallery",
Label: "CG Gallery",
Kind: galgo.SettingsComponentButton,
Action: galgo.ShowScreen(galgo.MenuStateCGGallery),
}常用 action:
ShowScreenHideScreenReturnToTitleActionSensitiveActionSetVarToggleVar
Custom
自定义组件适合复杂展示:
go
galgo.SettingsComponent{
ID: "custom_note",
Label: "Custom Note",
Kind: galgo.SettingsComponentCustom,
Height: 62,
Draw: func(e *galgo.Engine, screen *ebiten.Image, c galgo.SettingsComponent, b galgo.UIRect) bool {
vector.DrawFilledRect(screen, float32(b.X), float32(b.Y), float32(b.W), float32(b.H), color.RGBA{15, 23, 42, 155}, true)
e.DrawText(screen, "Custom settings component", 100, 180, 13, color.White)
return true
},
HandleClick: func(e *galgo.Engine, c galgo.SettingsComponent, cx, cy int, b galgo.UIRect) bool {
e.ShowToast("Clicked custom settings component")
return true
},
}Draw 返回 true 表示你已经完成绘制。HandleClick 返回 true 表示点击已处理。
显示条件和禁用
只在游戏进行中显示:
go
Visible: func(e *galgo.Engine) bool {
return e.GetVar("walked_together") != nil
}条件禁用:
go
Sensitive: func(e *galgo.Engine) bool {
return e.IsAchievementUnlocked("named_player")
}推荐分组
常见设置页结构:
- Gameplay:文字速度、自动播放、跳过、剧情标志。
- Audio:BGM、SE、Voice。
- Display:全屏、分辨率、语言。
- Navigation:存档、读档、画廊、返回标题。
- Debug:开发期变量、测试按钮,只在 debug 构建显示。