diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2025-06-25 17:15:13 -0500 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2025-07-03 22:01:22 -0400 |
| commit | 6d59a2240f4f68f9e9a818e33e5759e910c0ae60 (patch) | |
| tree | e23b8b1c4b10a8a9a8af6b6e1d2f5d99e6bd7c29 | |
| parent | d3e190fd03ef7363d72152fa55c79ed46547d695 (diff) | |
| download | muhqs-game-6d59a2240f4f68f9e9a818e33e5759e910c0ae60.tar.gz muhqs-game-6d59a2240f4f68f9e9a818e33e5759e910c0ae60.zip | |
rework the client's input handling
| -rw-r--r-- | go/client/game.go | 34 | ||||
| -rw-r--r-- | go/client/keybindings.go | 98 |
2 files changed, 66 insertions, 66 deletions
diff --git a/go/client/game.go b/go/client/game.go index 0870450e..c0724547 100644 --- a/go/client/game.go +++ b/go/client/game.go @@ -7,7 +7,6 @@ import ( "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/ebitenutil" - "github.com/hajimehoshi/ebiten/v2/inpututil" "muhq.space/muhqs-game/go/game" "muhq.space/muhqs-game/go/ui" @@ -75,10 +74,11 @@ func newGame(app *app, gameState game.State) *Game { } // default key bindings - g.keyBindings[ebiten.MouseButtonLeft] = clickSelection - g.keyBindings[ui.TouchTypes.Tap] = touchSelection + g.keyBindings[ebiten.MouseButtonLeft] = selection + g.keyBindings[ui.Tap] = selection g.keyBindings[ebiten.KeySpace] = pass g.keyBindings[ebiten.KeyEscape] = reset + g.keyBindings[ebiten.KeyQ] = func(ui.InputEvent, *Game) (bool, error) { return false, ebiten.Termination } g.passButton = ui.NewSimpleButton(g.Width-PASS_BUTTON_WIDTH, g.Height-DEFAULT_BUTTON_HEIGHT, @@ -427,6 +427,23 @@ func (g *Game) updateButtons() { g.passButton.UpdateLabel(passButtonLabel) } +func (g *Game) reset() { + g.removeChoice() + g.selectedObject = nil + g.ResetHover() + g.clearHighlights() + g.hideStore() + g.RemoveWidget(g.discardPileView) + g.RemoveWidget(g.resetButton) + if g.prompt != nil { + if g.prompt.Action().Targets().NoSelections() { + g.removePrompt() + } else { + g.prompt.ClearSelections() + } + } +} + func (g *Game) passPriority() { g.declareAction(game.NewPassPriority(g.activePlayer())) } @@ -585,11 +602,7 @@ func (g *Game) updateHighlight() { } func (g *Game) Update() error { - if inpututil.IsKeyJustPressed(ebiten.KeyQ) { - return ebiten.Termination - } - - if err := ui.TouchManager.Update(); err != nil { + if err := ui.Update(); err != nil { return err } @@ -598,7 +611,10 @@ func (g *Game) Update() error { } g.handlePlayerNotifications() - g.handleKeyBindings(g.keyBindings) + + if err := g.handleKeyBindings(g.keyBindings); err != nil { + return err + } g.updateButtons() return nil diff --git a/go/client/keybindings.go b/go/client/keybindings.go index ebc66c22..1dbf6bea 100644 --- a/go/client/keybindings.go +++ b/go/client/keybindings.go @@ -10,58 +10,55 @@ import ( ) type ( - keyAction func(*Game) bool - keyBindings map[interface{}]keyAction + // keyAction is a function applying an action for an input event to the game. + // It reports if it should be removed after its invocation. + // An unsuccessful action returns err != nil. + keyAction func(ui.InputEvent, *Game) (bool, error) + // keyBindings maps inputs to actions + keyBindings map[any]keyAction ) -var tapToHandle ui.Tap +func (g *Game) handleKeyBindings(bindings keyBindings) (err error) { + for i, ev := range ui.Input { -func (g *Game) handleKeyBindings(bindings keyBindings) { - // FIXME: Use new ui.InputEvent queue + for _k, a := range bindings { + var remove bool + switch k := _k.(type) { + case ebiten.MouseButton: + if ev.Kind == ui.Click && ev.Ctx.(ui.ClickCtx).Btn == k { + remove, err = a(ev, g) + ui.ConsumeInput(i) + } - for _k, a := range bindings { - var remove bool - switch k := _k.(type) { - case ebiten.MouseButton: - if inpututil.IsMouseButtonJustPressed(k) { - remove = a(g) - } + case ui.InputType: + if k != ev.Kind { + continue + } + + remove, err = a(ev, g) + ui.ConsumeInput(i) - case ui.TouchType: - if k == ui.TouchTypes.Tap { - for _, tap := range ui.TouchManager.Taps { - tapToHandle = tap - log.Println("handle tap", tap) - remove := a(g) - if remove { - break - } + // TODO: model simple key presses using the inout queue + case ebiten.Key: + if inpututil.IsKeyJustPressed(k) { + remove, err = a(ev, g) } } - case ebiten.Key: - if inpututil.IsKeyJustPressed(k) { - remove = a(g) + if remove { + delete(bindings, _k) } - } - if remove { - delete(bindings, _k) + if err != nil { + return + } } } + return } -func clickSelection(g *Game) bool { - x, y := ebiten.CursorPosition() - return selection(g, x, y) -} - -func touchSelection(g *Game) bool { - log.Println("touch selection") - return selection(g, tapToHandle.X, tapToHandle.Y) -} - -func selection(g *Game, x, y int) bool { +func selection(ev ui.InputEvent, g *Game) (bool, error) { + x, y := ev.X, ev.Y obj := g.findObjectAt(x, y) if g.prompt != nil { @@ -77,28 +74,15 @@ func selection(g *Game, x, y int) bool { g.handleSelection(obj, x, y) } - return false + return false, nil } -func pass(g *Game) bool { +func pass(_ ui.InputEvent, g *Game) (bool, error) { g.passButton.Click(0, 0) - return false + return false, nil } -func reset(g *Game) bool { - g.removeChoice() - g.selectedObject = nil - g.ResetHover() - g.clearHighlights() - g.hideStore() - g.RemoveWidget(g.discardPileView) - g.RemoveWidget(g.resetButton) - if g.prompt != nil { - if g.prompt.Action().Targets().NoSelections() { - g.removePrompt() - } else { - g.prompt.ClearSelections() - } - } - return false +func reset(_ ui.InputEvent, g *Game) (bool, error) { + g.reset() + return false, nil } |
