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, } }