DebugUI v0.1.0 がリリースされました
DebugUI は、Ebitengine のデバッグ用 UI ライブラリです。ゲームを開発していると、デバッグ用の UI が必要になることがあります。例えば、 FPS や TPS を表示したり、ゲーム内パラメータを動的に変更したりなどです。そのためにクリックの処理やキーボードの処理を書いたり、 UI 描画のコードを書いたりするのは面倒ですね。 DebugUI は簡単に使えるデバッグ用 UI を提供します。
DebugUI を使用すると、パラメータが多量にある操作もスッキリと取り扱うことができます。
DebugUI は Immediate Mode な API です。例えば 1 個のウィンドウと 1 個のボタンを表示するコードは次のようになります。
package main
import (
"fmt"
"image"
"os"
"github.com/ebitengine/debugui"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
)
type Game struct {
debugui debugui.DebugUI
count int
}
func (g *Game) Update() error {
if _, err := g.debugui.Update(func(ctx *debugui.Context) error {
ctx.Window("Test", image.Rect(60, 60, 160, 120), func(layout debugui.ContainerLayout) {
ctx.Button("Button").On(func() {
g.count++
})
})
return nil
}); err != nil {
return err
}
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
g.debugui.Draw(screen)
ebitenutil.DebugPrint(screen, fmt.Sprintf("Count: %d", g.count))
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
return outsideWidth, outsideHeight
}
func main() {
if err := ebiten.RunGame(&Game{}); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
これを実行すると次のような画面になります。
ポイントは次のとおりです。
debugui.DebugUI
は、明示的な初期化が不要で、いきなり使用できます。- ゲームの
Update
とDraw
で、DebugUI
のUpdate
とDraw
をそれぞれ呼びます。 DebugUI
は Immediate Mode な API です。DebugUI
のUpdate
に渡した関数はゲームのUpdate
ごとに実行されます。 UI を構成するウィジェット、例えばウィンドウやボタンなどは、毎回Window
やButton
関数の評価によって「作り直し」になります。ウィジェットは毎回作り直しにはなるものの、基本的に「コード上の同じ箇所の関数呼び出しによって作られたウィジェットは同じもの」であるとみなされ、状態管理されます。- ボタンを押した後に実行される関数は
Buton
関数の戻り値のOn
メソッドで指定します。ここで指定した関数は、ボタンが押されたときのみ評価されます。 - ウィンドウはドラッグで場所移動できたり、右下をドラッグしてサイズを変えられたりします。先ほど説明したとおり、ウィンドウは
Window
関数で毎回作られますが、この状態はちゃんと保持されます。
もう少し複雑な例は、 Ebitengine のサンプルや DebugUI のサンプルなどをご覧ください。
DebugUI はまだバージョン 0 なので、 API の破壊的変更が将来行われる可能性があります。ご注意ください。