Start work on menu interactivity.
With this commit, we get a ui.Interface and ui.Widget type. The interface monitors hover and mouse click state and tells the widgets about them; the widgets execute code specified by the application when events occur. Next step: have wh40k load the main menu and play sound, etc.
This commit is contained in:
@@ -12,6 +12,11 @@ import (
|
||||
"github.com/hajimehoshi/ebiten/inpututil"
|
||||
)
|
||||
|
||||
type Game interface {
|
||||
Update(screenX, screenY int) error
|
||||
Draw(*ebiten.Image) error
|
||||
}
|
||||
|
||||
var (
|
||||
screenScale = flag.Float64("screen-scale", 1.0, "Scale the window by this factor")
|
||||
|
||||
@@ -26,9 +31,8 @@ type Window struct {
|
||||
KeyUpHandlers map[ebiten.Key]func()
|
||||
MouseWheelHandler func(float64, float64)
|
||||
|
||||
// User-provided update actions
|
||||
updateFn func() error
|
||||
drawFn func(*ebiten.Image) error
|
||||
// Allow the "game" to be switched out at any time
|
||||
game Game
|
||||
|
||||
debug bool
|
||||
firstRun bool
|
||||
@@ -37,7 +41,7 @@ type Window struct {
|
||||
// 0,0 is the *top left* of the window
|
||||
//
|
||||
// ebiten assumes a single window, so only call this once...
|
||||
func NewWindow(title string) (*Window, error) {
|
||||
func NewWindow(game Game, title string) (*Window, error) {
|
||||
ebiten.SetRunnableInBackground(true)
|
||||
|
||||
return &Window{
|
||||
@@ -45,6 +49,7 @@ func NewWindow(title string) (*Window, error) {
|
||||
KeyUpHandlers: make(map[ebiten.Key]func()),
|
||||
debug: true,
|
||||
firstRun: true,
|
||||
game: game,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -57,13 +62,12 @@ func (w *Window) OnMouseWheel(f func(x, y float64)) {
|
||||
w.MouseWheelHandler = f
|
||||
}
|
||||
|
||||
func (w *Window) run(screen *ebiten.Image) error {
|
||||
if w.firstRun {
|
||||
ebiten.SetScreenScale(*screenScale)
|
||||
w.firstRun = false
|
||||
}
|
||||
func (w *Window) Layout(_, _ int) (int, int) {
|
||||
return *winX, *winY
|
||||
}
|
||||
|
||||
if err := w.updateFn(); err != nil {
|
||||
func (w *Window) Update(screen *ebiten.Image) error {
|
||||
if err := w.game.Update(screen.Size()); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -83,16 +87,18 @@ func (w *Window) run(screen *ebiten.Image) error {
|
||||
}
|
||||
}
|
||||
|
||||
if !ebiten.IsDrawingSkipped() {
|
||||
if err := w.drawFn(screen); err != nil {
|
||||
return err
|
||||
}
|
||||
if ebiten.IsDrawingSkipped() {
|
||||
return nil
|
||||
}
|
||||
|
||||
if w.debug {
|
||||
// Draw FPS, etc, to the screen
|
||||
msg := fmt.Sprintf("tps=%0.2f fps=%0.2f", ebiten.CurrentTPS(), ebiten.CurrentFPS())
|
||||
ebitenutil.DebugPrint(screen, msg)
|
||||
}
|
||||
if err := w.game.Draw(screen); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if w.debug {
|
||||
// Draw FPS, etc, to the screen
|
||||
msg := fmt.Sprintf("tps=%0.2f fps=%0.2f", ebiten.CurrentTPS(), ebiten.CurrentFPS())
|
||||
ebitenutil.DebugPrint(screen, msg)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -101,10 +107,7 @@ func (w *Window) run(screen *ebiten.Image) error {
|
||||
// TODO: a stop or other cancellation mechanism
|
||||
//
|
||||
// Note that this must be called on the main OS thread
|
||||
func (w *Window) Run(updateFn func() error, drawFn func(*ebiten.Image) error) error {
|
||||
w.updateFn = updateFn
|
||||
w.drawFn = drawFn
|
||||
|
||||
func (w *Window) Run() error {
|
||||
if *cpuprofile != "" {
|
||||
f, err := os.Create(*cpuprofile)
|
||||
if err != nil {
|
||||
@@ -117,5 +120,7 @@ func (w *Window) Run(updateFn func() error, drawFn func(*ebiten.Image) error) er
|
||||
defer pprof.StopCPUProfile()
|
||||
}
|
||||
|
||||
return ebiten.Run(w.run, *winX, *winY, 1, w.Title) // Native game resolution: 640x480
|
||||
ebiten.SetWindowSize(int(float64(*winX)**screenScale), int(float64(*winY)**screenScale))
|
||||
ebiten.SetWindowTitle(w.Title)
|
||||
return ebiten.RunGame(w) // Native game resolution: 640x480
|
||||
}
|
||||
|
Reference in New Issue
Block a user