Skip to content

设置页组件系统

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:自定义绘制和点击。

通用字段:

  • ID
  • Label
  • Order
  • Kind
  • Value
  • Action
  • Options
  • OptionsFunc
  • Height
  • Visible
  • Sensitive
  • Draw
  • HandleClick
  • ValueFormatter

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:

  • ShowScreen
  • HideScreen
  • ReturnToTitle
  • Action
  • SensitiveAction
  • SetVar
  • ToggleVar

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 构建显示。

Released under the project license.