diff --git a/assets/loader-fonts.go b/assets/loader-fonts.go index 6b9bc60..e8e8ae4 100644 --- a/assets/loader-fonts.go +++ b/assets/loader-fonts.go @@ -11,13 +11,17 @@ import ( var FontRenderer = LoadFonts("fonts") const ( - GameFont string = "x12y20pxScanLine" - FontSize int = 16 + GameFont string = "x12y20pxScanLine" + FontSizeNormal int = 16 + FontSizeBig int = 48 + FontSizeSmall int = 8 ) type Texter struct { - Renderer *etxt.Renderer - Font *font.Face + Renderer *etxt.Renderer + FontNormal *font.Face + FontBig *font.Face + FontSmall *font.Face } func LoadFonts(dir string) *Texter { @@ -32,7 +36,19 @@ func LoadFonts(dir string) *Texter { } gameface := truetype.NewFace(gamefont, &truetype.Options{ - Size: float64(FontSize), + Size: float64(FontSizeNormal), + DPI: 72, + Hinting: font.HintingFull, + }) + + biggameface := truetype.NewFace(gamefont, &truetype.Options{ + Size: float64(FontSizeBig), + DPI: 72, + Hinting: font.HintingFull, + }) + + smallgameface := truetype.NewFace(gamefont, &truetype.Options{ + Size: float64(FontSizeSmall), DPI: 72, Hinting: font.HintingFull, }) @@ -58,7 +74,7 @@ func LoadFonts(dir string) *Texter { renderer.SetCacheHandler(glyphsCache.NewHandler()) renderer.SetFont(fontlib.GetFont(GameFont)) - return &Texter{Renderer: renderer, Font: &gameface} + return &Texter{Renderer: renderer, FontNormal: &gameface, FontBig: &biggameface, FontSmall: &smallgameface} } // helper function used with FontLibrary.EachFont to make sure diff --git a/game/select_scene.go b/game/select_scene.go index 338f794..34c1db5 100644 --- a/game/select_scene.go +++ b/game/select_scene.go @@ -61,7 +61,7 @@ func (scene *SelectScene) SetupUI() { widget.ButtonOpts.Image(buttonImage), - widget.ButtonOpts.Text("Start new Game", *assets.FontRenderer.Font, &widget.ButtonTextColor{ + widget.ButtonOpts.Text("Start new Game", *assets.FontRenderer.FontNormal, &widget.ButtonTextColor{ Idle: color.NRGBA{0xdf, 0xf4, 0xff, 0xff}, }), @@ -81,7 +81,6 @@ func (scene *SelectScene) SetupUI() { rootContainer := widget.NewContainer( widget.ContainerOpts.BackgroundImage( - // FIXME: see https://github.com/ebitenui/ebitenui/issues/118 image.NewNineSlice(assets.Assets["background-transparent"], [3]int{0, 1, 639}, [3]int{0, 1, 479})), //widget.ContainerOpts.BackgroundImage(image.NewNineSliceColor(color.NRGBA{0x13, 0x1a, 0x22, 0xff})), //widget.ContainerOpts.BackgroundImage(image.NewNineSliceColor(color.NRGBA{0xff, 0x80, 0x00, 0x00})), diff --git a/game/welcome_scene.go b/game/welcome_scene.go index 42f3e78..2521d0f 100644 --- a/game/welcome_scene.go +++ b/game/welcome_scene.go @@ -2,11 +2,12 @@ package game import ( "image/color" - "log/slog" "openquell/assets" + "github.com/ebitenui/ebitenui" + "github.com/ebitenui/ebitenui/image" + "github.com/ebitenui/ebitenui/widget" "github.com/hajimehoshi/ebiten/v2" - "github.com/tinne26/etxt" ) type WelcomeScene struct { @@ -14,10 +15,12 @@ type WelcomeScene struct { Next SceneName Whoami SceneName UseCache bool + Ui *ebitenui.UI } func NewWelcomeScene(game *Game) Scene { scene := &WelcomeScene{Whoami: Welcome, Game: game, Next: Welcome} + scene.SetupUI() return scene } @@ -32,31 +35,102 @@ func (scene *WelcomeScene) GetNext() SceneName { func (scene *WelcomeScene) Update() error { switch { case ebiten.IsKeyPressed(ebiten.KeyEnter): - slog.Debug("welcome.Update() next") scene.SetNext(Select) } + scene.Ui.Update() + return nil } func (scene *WelcomeScene) Draw(screen *ebiten.Image) { screen.Clear() - op := &ebiten.DrawImageOptions{} + scene.Ui.Draw(screen) + /* + op := &ebiten.DrawImageOptions{} + background := assets.Assets["background-lila"] + screen.DrawImage(background, op) + + blue := color.RGBA{0, 255, 128, 255} + + assets.FontRenderer.Renderer.SetTarget(screen) + assets.FontRenderer.Renderer.SetColor(blue) + assets.FontRenderer.Renderer.SetAlign(etxt.YCenter, etxt.XCenter) + assets.FontRenderer.Renderer.SetSizePx(45) + assets.FontRenderer.Renderer.Draw("Welcome to Open Quell!", 320, 200) + + assets.FontRenderer.Renderer.SetAlign(etxt.Top, etxt.Left) + assets.FontRenderer.Renderer.SetSizePx(32) + assets.FontRenderer.Renderer.Draw("[press enter to start]", 100, 300) + */ +} + +func (scene *WelcomeScene) SetupUI() { + buttonImage, _ := loadButtonImage() background := assets.Assets["background-lila"] - screen.DrawImage(background, op) - blue := color.RGBA{0, 255, 128, 255} - assets.FontRenderer.Renderer.SetTarget(screen) - assets.FontRenderer.Renderer.SetColor(blue) - assets.FontRenderer.Renderer.SetAlign(etxt.YCenter, etxt.XCenter) - assets.FontRenderer.Renderer.SetSizePx(45) - assets.FontRenderer.Renderer.Draw("Welcome to Open Quell!", 320, 200) + uiContainer := widget.NewContainer( + widget.ContainerOpts.BackgroundImage( + image.NewNineSlice(background, [3]int{0, 1, 639}, [3]int{0, 1, 479})), + widget.ContainerOpts.Layout(widget.NewAnchorLayout()), + ) - assets.FontRenderer.Renderer.SetAlign(etxt.Top, etxt.Left) - assets.FontRenderer.Renderer.SetSizePx(32) - assets.FontRenderer.Renderer.Draw("[press enter to start]", 100, 300) + rowContainer := widget.NewContainer( + widget.ContainerOpts.WidgetOpts( + widget.WidgetOpts.LayoutData(widget.AnchorLayoutData{ + HorizontalPosition: widget.AnchorLayoutPositionCenter, + VerticalPosition: widget.AnchorLayoutPositionCenter, + }), + ), + widget.ContainerOpts.Layout(widget.NewRowLayout( + widget.RowLayoutOpts.Direction(widget.DirectionVertical), + widget.RowLayoutOpts.Padding(widget.NewInsetsSimple(20)), + widget.RowLayoutOpts.Spacing(20), + )), + ) + button := widget.NewButton( + widget.ButtonOpts.WidgetOpts( + widget.WidgetOpts.LayoutData(widget.RowLayoutData{ + Position: widget.RowLayoutPositionCenter, + Stretch: false, + MaxWidth: 200, + MaxHeight: 100, + }), + ), + + widget.ButtonOpts.Image(buttonImage), + + widget.ButtonOpts.Text("Start", *assets.FontRenderer.FontNormal, &widget.ButtonTextColor{ + Idle: color.NRGBA{0xdf, 0xf4, 0xff, 0xff}, + }), + + widget.ButtonOpts.TextPadding(widget.Insets{ + Left: 30, + Right: 30, + Top: 5, + Bottom: 5, + }), + + widget.ButtonOpts.ClickedHandler(func(args *widget.ButtonClickedEventArgs) { + scene.SetNext(Play) + }), + ) + + label := widget.NewText( + widget.TextOpts.Text("Welcome to OpenQuell", *assets.FontRenderer.FontBig, blue), + widget.TextOpts.Position(widget.TextPositionCenter, widget.TextPositionCenter), + ) + + rowContainer.AddChild(label) + rowContainer.AddChild(button) + + uiContainer.AddChild(rowContainer) + + scene.Ui = &ebitenui.UI{ + Container: uiContainer, + } }