aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2025-06-25 17:15:13 -0500
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:57:21 +0200
commit90a4cdf902547dfe70421dd6abfefd22b1079d0d (patch)
tree76fee519d492057a57f6d25c19c55b0bf91aa937
parent2a155fd111d8de5bd3317fb146271d2237f7bd16 (diff)
downloadmuhqs-game-90a4cdf902547dfe70421dd6abfefd22b1079d0d.tar.gz
muhqs-game-90a4cdf902547dfe70421dd6abfefd22b1079d0d.zip
rework the client's input handling
-rw-r--r--go/client/game.go34
-rw-r--r--go/client/keybindings.go98
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
}