added implementation in GO lang
This commit is contained in:
119
internal/app/app.go
Normal file
119
internal/app/app.go
Normal 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,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user