package game import ( "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" "gitea.brasse-pc.eu/brasse/metro-puzzle-jp/internal/sim" ) const stickDeadzone = 0.5 // dirInput returnerar hållen riktning från tangentbord (pilar/WASD) eller // gamepad (d-pad / vänster spak). None om inget hålls. func dirInput() sim.Dir { if virtual.held != sim.None { return virtual.held } switch { case ebiten.IsKeyPressed(ebiten.KeyArrowUp) || ebiten.IsKeyPressed(ebiten.KeyW): return sim.Up case ebiten.IsKeyPressed(ebiten.KeyArrowDown) || ebiten.IsKeyPressed(ebiten.KeyS): return sim.Down case ebiten.IsKeyPressed(ebiten.KeyArrowLeft) || ebiten.IsKeyPressed(ebiten.KeyA): return sim.Left case ebiten.IsKeyPressed(ebiten.KeyArrowRight) || ebiten.IsKeyPressed(ebiten.KeyD): return sim.Right } for _, id := range ebiten.AppendGamepadIDs(nil) { if !ebiten.IsStandardGamepadLayoutAvailable(id) { continue } switch { case ebiten.IsStandardGamepadButtonPressed(id, ebiten.StandardGamepadButtonLeftTop): return sim.Up case ebiten.IsStandardGamepadButtonPressed(id, ebiten.StandardGamepadButtonLeftBottom): return sim.Down case ebiten.IsStandardGamepadButtonPressed(id, ebiten.StandardGamepadButtonLeftLeft): return sim.Left case ebiten.IsStandardGamepadButtonPressed(id, ebiten.StandardGamepadButtonLeftRight): return sim.Right } x := ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisLeftStickHorizontal) y := ebiten.StandardGamepadAxisValue(id, ebiten.StandardGamepadAxisLeftStickVertical) switch { case y < -stickDeadzone: return sim.Up case y > stickDeadzone: return sim.Down case x < -stickDeadzone: return sim.Left case x > stickDeadzone: return sim.Right } } return sim.None } // confirmJustPressed: Enter/mellanslag eller gamepadens nedre knapp (A/kryss). func confirmJustPressed() bool { if virtual.pressed["enter"] { return true } if inpututil.IsKeyJustPressed(ebiten.KeyEnter) || inpututil.IsKeyJustPressed(ebiten.KeySpace) { return true } return gamepadJustPressed(ebiten.StandardGamepadButtonRightBottom) } // backJustPressed: Escape eller gamepadens högra knapp (B/cirkel). func backJustPressed() bool { return virtual.pressed["esc"] || inpututil.IsKeyJustPressed(ebiten.KeyEscape) || gamepadJustPressed(ebiten.StandardGamepadButtonRightRight) } // menuMove returnerar -1/+1 när användaren just tryckte upp/ner i en meny. func menuMove() int { switch { case virtual.pressed["up"]: return -1 case virtual.pressed["down"]: return 1 case inpututil.IsKeyJustPressed(ebiten.KeyArrowUp) || inpututil.IsKeyJustPressed(ebiten.KeyW) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftTop): return -1 case inpututil.IsKeyJustPressed(ebiten.KeyArrowDown) || inpututil.IsKeyJustPressed(ebiten.KeyS) || gamepadJustPressed(ebiten.StandardGamepadButtonLeftBottom): return 1 } return 0 } func gamepadJustPressed(b ebiten.StandardGamepadButton) bool { for _, id := range ebiten.AppendGamepadIDs(nil) { if ebiten.IsStandardGamepadLayoutAvailable(id) && inpututil.IsStandardGamepadButtonJustPressed(id, b) { return true } } return false } // inpututil_R: R = spela om banan. func inpututil_R() bool { return virtual.pressed["r"] || inpututil.IsKeyJustPressed(ebiten.KeyR) }