M1: rörelse, kollision, kamera, scener, tileset, skärmdumpar, CI
Some checks failed
release / build-release (push) Failing after 27s
Some checks failed
release / build-release (push) Failing after 27s
- internal/sim: rutbaserad Mover (4 riktningar, riktningsbyte vid rutgräns, bildrute-exakt ankomst) och Camera (följer, klampar, centrerar små kartor), med tester - internal/game: scener meny -> bana -> resultat, tangentbord + gamepad, tileset och spelaranimation, HUD, skriptläge (-script) för deterministiska skärmdumpar och tester - tools/genart genererar placeholder-grafik (tiles.png, player.png); tools/shots tar doc/img/*.png som README och wiki visar - bana 002-shinjuku (33x21) för kamerascroll; level.List/LoadFile/TrainAt - .gitea/workflows/release.yaml: vet + test + linux/windows-zippar till rullande latest på brasse-linux01-runnern (linux-amd64) - docs: roadmap M1 klar, tester, plan, README med bilder och styrning Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
99
internal/game/input.go
Normal file
99
internal/game/input.go
Normal file
@@ -0,0 +1,99 @@
|
||||
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) }
|
||||
Reference in New Issue
Block a user