93 lines
1.8 KiB
Go
93 lines
1.8 KiB
Go
|
package gui
|
||
|
|
||
|
import (
|
||
|
"image/color"
|
||
|
|
||
|
"github.com/hajimehoshi/ebiten/v2"
|
||
|
"github.com/hajimehoshi/ebiten/v2/ebitenutil"
|
||
|
"github.com/hajimehoshi/ebiten/v2/examples/resources/fonts"
|
||
|
|
||
|
_ "embed"
|
||
|
)
|
||
|
|
||
|
type App struct {
|
||
|
Root View
|
||
|
Background color.Color
|
||
|
|
||
|
defaultCtx *appCtx
|
||
|
|
||
|
oldMouseEvent MouseEvent
|
||
|
}
|
||
|
|
||
|
func NewApp(root View) (*App, error) {
|
||
|
fnt, err := LoadFontFromBytes(fonts.MPlus1pRegular_ttf)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &App{
|
||
|
Root: root,
|
||
|
Background: color.White,
|
||
|
|
||
|
defaultCtx: &appCtx{
|
||
|
font: fnt,
|
||
|
fontSize: 16,
|
||
|
fg: color.Black,
|
||
|
bg: color.Transparent,
|
||
|
},
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func (a *App) Update() error {
|
||
|
if a.Root == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
winw, winh := ebiten.WindowSize()
|
||
|
window := D(0, 0, winw, winh)
|
||
|
|
||
|
// handle mouse events
|
||
|
mouseEvent := makeMouseEvent()
|
||
|
if mouseEvent.IsScrollEvent() {
|
||
|
a.Root.OnMouseScroll(mouseEvent)
|
||
|
}
|
||
|
if mouseEvent.HasMouseMoved(a.oldMouseEvent) && mouseEvent.Position.In(window) {
|
||
|
a.Root.OnMouseMove(mouseEvent)
|
||
|
}
|
||
|
if mouseEvent.Buttons.anyClicked() {
|
||
|
a.Root.OnMouseClick(mouseEvent)
|
||
|
}
|
||
|
a.oldMouseEvent = mouseEvent
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (a *App) Draw(screen *ebiten.Image) {
|
||
|
if a.Root == nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// layout phase
|
||
|
a.Root.Layout(a.defaultCtx)
|
||
|
|
||
|
// draw phase
|
||
|
screen.Fill(a.Background)
|
||
|
a.Root.Draw(newImage(screen), a.defaultCtx)
|
||
|
|
||
|
// show fps
|
||
|
ebitenutil.DebugPrint(screen, "") //fmt.Sprintf("fps: %g", ebiten.CurrentFPS()))
|
||
|
}
|
||
|
|
||
|
func (a *App) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
|
||
|
return outsideWidth, outsideHeight
|
||
|
}
|
||
|
|
||
|
func (a *App) Start() error {
|
||
|
ebiten.SetScreenTransparent(true)
|
||
|
ebiten.SetWindowResizingMode(ebiten.WindowResizingModeEnabled)
|
||
|
//ebiten.SetFPSMode(ebiten.FPSModeVsyncOffMinimum)
|
||
|
ebiten.SetFPSMode(ebiten.FPSModeVsyncOffMaximum)
|
||
|
ebiten.SetRunnableOnUnfocused(true)
|
||
|
return ebiten.RunGame(a)
|
||
|
}
|