added implementation in GO lang

This commit is contained in:
2026-05-22 13:00:28 +02:00
parent 67ee6c268c
commit ddac1d02cd
21 changed files with 1447 additions and 0 deletions

119
internal/app/app.go Normal file
View File

@ -0,0 +1,119 @@
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,
}
}