120 lines
2.6 KiB
Go
120 lines
2.6 KiB
Go
package app
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
"github.com/hajimehoshi/ebiten/v2/inpututil"
|
|
|
|
"kidskeyboard/internal/assets"
|
|
kbaudio "kidskeyboard/internal/audio"
|
|
"kidskeyboard/internal/modes"
|
|
)
|
|
|
|
type Game struct {
|
|
cfg Config
|
|
audio *kbaudio.Manager
|
|
assets *assets.Manager
|
|
rng *rand.Rand
|
|
modes []modes.Mode
|
|
current int
|
|
}
|
|
|
|
func New(cfg Config) *Game {
|
|
audio := kbaudio.NewManager()
|
|
assets := assets.NewManager()
|
|
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
|
|
ctx := modes.Context{
|
|
Audio: audio,
|
|
Assets: assets,
|
|
RNG: rng,
|
|
}
|
|
|
|
game := &Game{
|
|
cfg: cfg,
|
|
audio: audio,
|
|
assets: assets,
|
|
rng: rng,
|
|
modes: []modes.Mode{
|
|
modes.NewKeyboardMode(ctx),
|
|
modes.NewGeometryMode(ctx),
|
|
modes.NewAnimalMode(ctx),
|
|
modes.NewCalculatorMode(ctx),
|
|
modes.NewFindKeyMode(ctx),
|
|
modes.NewNotImplementedMode("CTRL+F6"),
|
|
modes.NewNotImplementedMode("CTRL+F7"),
|
|
modes.NewNotImplementedMode("CTRL+F8"),
|
|
modes.NewNotImplementedMode("CTRL+F9"),
|
|
modes.NewNotImplementedMode("CTRL+F10"),
|
|
modes.NewNotImplementedMode("CTRL+F11"),
|
|
modes.NewNotImplementedMode("CTRL+F12"),
|
|
},
|
|
current: 0,
|
|
}
|
|
game.modes[game.current].OnEnter()
|
|
return game
|
|
}
|
|
|
|
func (g *Game) Update() error {
|
|
g.audio.Update()
|
|
|
|
if /*ctrlPressed() && */ shiftPressed() && inpututil.IsKeyJustPressed(ebiten.KeyEscape) {
|
|
return ebiten.Termination
|
|
}
|
|
|
|
if ctrlPressed() {
|
|
for i, key := range modeKeys() {
|
|
if inpututil.IsKeyJustPressed(key) {
|
|
g.switchMode(i)
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
g.modes[g.current].HandleInput()
|
|
g.modes[g.current].Update()
|
|
return nil
|
|
}
|
|
|
|
func (g *Game) Draw(screen *ebiten.Image) {
|
|
g.modes[g.current].Draw(screen)
|
|
}
|
|
|
|
func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
|
|
if outsideWidth <= 0 || outsideHeight <= 0 {
|
|
return g.cfg.WindowWidth, g.cfg.WindowHeight
|
|
}
|
|
return outsideWidth, outsideHeight
|
|
}
|
|
|
|
func (g *Game) switchMode(next int) {
|
|
if next < 0 || next >= len(g.modes) || next == g.current {
|
|
return
|
|
}
|
|
g.modes[g.current].OnLeave()
|
|
g.current = next
|
|
g.modes[g.current].OnEnter()
|
|
}
|
|
|
|
func ctrlPressed() bool {
|
|
return ebiten.IsKeyPressed(ebiten.KeyControlLeft) ||
|
|
ebiten.IsKeyPressed(ebiten.KeyControlRight) ||
|
|
ebiten.IsKeyPressed(ebiten.KeyControl)
|
|
}
|
|
|
|
func shiftPressed() bool {
|
|
return ebiten.IsKeyPressed(ebiten.KeyShiftLeft) ||
|
|
ebiten.IsKeyPressed(ebiten.KeyShiftRight) ||
|
|
ebiten.IsKeyPressed(ebiten.KeyShift)
|
|
}
|
|
|
|
func modeKeys() []ebiten.Key {
|
|
return []ebiten.Key{
|
|
ebiten.KeyF1, ebiten.KeyF2, ebiten.KeyF3, ebiten.KeyF4,
|
|
ebiten.KeyF5, ebiten.KeyF6, ebiten.KeyF7, ebiten.KeyF8,
|
|
ebiten.KeyF9, ebiten.KeyF10, ebiten.KeyF11, ebiten.KeyF12,
|
|
}
|
|
}
|