Skip to content

交互系统:输入、变量、拖放、成就与画廊

文本输入

文本输入用于取名字、口令、命名存档等场景。

go
galgo.Input("player_name", "你叫什么名字?",
    galgo.InputDefault("Haruto"),
    galgo.InputPlaceholder("输入名字"),
    galgo.InputMaxRunes(16),
)

提交后会写入变量:

go
name := engine.GetStringVar("player_name", "玩家")

输入框支持中文 IME、光标移动、鼠标选区、拖选、Ctrl+AShift+方向键Home/EndBackspace/Delete

可选项:

  • InputDefault(value)
  • InputPlaceholder(value)
  • InputMaxRunes(max)
  • InputAllowEmpty()
  • InputSubmitLabel(label)
  • InputValidator(fn)

校验示例:

go
galgo.Input("player_name", "输入名字",
    galgo.InputValidator(func(value string) (bool, string) {
        if len([]rune(value)) < 2 {
            return false, "名字至少 2 个字"
        }
        return true, ""
    }),
)

变量

go
engine.SetVariable("flag", true)
value, ok := engine.GetVariable("flag")

engine.GetStringVar("player_name", "玩家")
engine.GetBoolVar("walked_together", false)
engine.GetIntVar("score", 0)
engine.GetFloatVar("affection", 0)
engine.HasVar("flag")
engine.DeleteVar("flag")

文本中可插值变量:

go
galgo.Text("Aria", "{{player_name}},今天一起回家吧。")

拖放组件

go
galgo.DragDrop(
    []*galgo.DragComponent{
        {ID: "token", Label: "Promise", X: 500, Y: 300, W: 160, H: 48},
    },
    []*galgo.DropZone{
        {
            ID:    "target",
            Label: "Drop Here",
            X:     540,
            Y:     430,
            W:     200,
            H:     70,
            Accept: func(e *galgo.Engine, c *galgo.DragComponent, z *galgo.DropZone) bool {
                return c.ID == "token"
            },
            OnDrop: func(e *galgo.Engine, c *galgo.DragComponent, z *galgo.DropZone) {
                e.SetVariable("token_ready", true)
                e.UnlockAchievement("first_drag")
            },
        },
    },
)

选项:

  • DragDropBlocking(bool)
  • DragDropCompleteOnDrop(bool)
  • DragDropOnComplete(fn)

组件支持自定义绘制:

go
Draw: func(e *galgo.Engine, screen *ebiten.Image, c *galgo.DragComponent, dragging bool) bool {
    // 自己绘制组件
    return true
}

成就

先在配置中注册:

go
Achievements: []galgo.AchievementItem{
    {Key: "named_player", Title: "First Name", Description: "Named the protagonist."},
    {Key: "secret_route", Title: "Secret", Description: "Found the route.", Hidden: true},
},

脚本中解锁:

go
galgo.UnlockAchievement("named_player")

运行时:

go
engine.UnlockAchievement("named_player")
engine.IsAchievementUnlocked("named_player")

如果启用了 Steamworks,UnlockAchievement 会同时尝试同步 Steam 成就。

画廊

配置 CG 和音乐:

go
GalleryCGs: []galgo.GalleryCGItem{
    {Key: "classroom", Path: "assets/bg_classroom.jpg", Name: "Classroom"},
},
GalleryBGMs: []galgo.GalleryBGMItem{
    {Key: "school_life", Path: "assets/bgm_school.ogg", Name: "School Life"},
},

背景调用 Bg 时会自动解锁同 Key 的 CG:

go
galgo.Bg("classroom", "assets/bg_classroom.jpg")

也可以手动:

go
engine.UnlockCG("classroom", "assets/bg_classroom.jpg")
engine.UnlockBGM("school_life", "assets/bgm_school.ogg")

解锁状态保存到 SaveDir/gallery.json

Released under the project license.