@@ -6,29 +6,107 @@ import (
66 "github.com/maxpoletaev/dendy/input"
77)
88
9- var keyMap = map [int32 ]input.Button {
10- rl .KeyW : input .ButtonUp ,
11- rl .KeyS : input .ButtonDown ,
12- rl .KeyA : input .ButtonLeft ,
13- rl .KeyD : input .ButtonRight ,
14- rl .KeyK : input .ButtonA ,
15- rl .KeyJ : input .ButtonB ,
16- rl .KeyEnter : input .ButtonStart ,
17- rl .KeyRightShift : input .ButtonSelect ,
9+ const (
10+ turboRate = 4
11+ gamepadIndex = 0
12+ stickDeadzone = 0.25
13+ stickThreshold = 0.5
14+ )
15+
16+ type keyMapping struct {
17+ key int32
18+ button input.Button
19+ turbo bool
20+ }
21+
22+ var keyboardMappings = []keyMapping {
23+ {rl .KeyW , input .ButtonUp , false },
24+ {rl .KeyS , input .ButtonDown , false },
25+ {rl .KeyA , input .ButtonLeft , false },
26+ {rl .KeyD , input .ButtonRight , false },
27+ {rl .KeyJ , input .ButtonB , false },
28+ {rl .KeyK , input .ButtonA , false },
29+ {rl .KeyU , input .ButtonB , true },
30+ {rl .KeyI , input .ButtonA , true },
31+ {rl .KeyEnter , input .ButtonStart , false },
32+ {rl .KeyRightShift , input .ButtonSelect , false },
33+ }
34+
35+ var gamepadMappings = []keyMapping {
36+ {rl .GamepadButtonLeftFaceUp , input .ButtonUp , false },
37+ {rl .GamepadButtonLeftFaceDown , input .ButtonDown , false },
38+ {rl .GamepadButtonLeftFaceLeft , input .ButtonLeft , false },
39+ {rl .GamepadButtonLeftFaceRight , input .ButtonRight , false },
40+ {rl .GamepadButtonRightFaceDown , input .ButtonA , false },
41+ {rl .GamepadButtonRightFaceLeft , input .ButtonB , false },
42+ {rl .GamepadButtonRightFaceRight , input .ButtonB , true },
43+ {rl .GamepadButtonRightFaceUp , input .ButtonA , true },
44+ {rl .GamepadButtonMiddleRight , input .ButtonStart , false },
45+ {rl .GamepadButtonMiddleLeft , input .ButtonSelect , false },
1846}
1947
2048func (w * Window ) UpdateJoystick () {
2149 if w .InputDelegate == nil {
2250 return
2351 }
2452
53+ w .turboCounter ++
54+ if w .turboCounter >= turboRate {
55+ w .turboCounter = 0
56+ }
57+
2558 var buttons uint8
2659
27- for key , button := range keyMap {
28- if rl .IsKeyDown (key ) {
29- buttons |= button
60+ if w .gamepadAvailable {
61+ buttons = readAnalogInput (buttons )
62+
63+ for _ , km := range gamepadMappings {
64+ if km .turbo && w .turboCounter != 0 {
65+ continue
66+ }
67+ if rl .IsGamepadButtonDown (gamepadIndex , km .key ) {
68+ buttons |= km .button
69+ }
70+ }
71+ }
72+
73+ for _ , km := range keyboardMappings {
74+ if km .turbo && w .turboCounter != 0 {
75+ continue
76+ }
77+ if rl .IsKeyDown (km .key ) {
78+ buttons |= km .button
3079 }
3180 }
3281
3382 w .InputDelegate (buttons )
3483}
84+
85+ func readAnalogInput (buttons uint8 ) uint8 {
86+ leftX := rl .GetGamepadAxisMovement (gamepadIndex , rl .GamepadAxisLeftX )
87+ leftY := rl .GetGamepadAxisMovement (gamepadIndex , rl .GamepadAxisLeftY )
88+
89+ // Apply deadzone
90+ if leftX < stickDeadzone && leftX > - stickDeadzone {
91+ leftX = 0
92+ }
93+ if leftY < stickDeadzone && leftY > - stickDeadzone {
94+ leftY = 0
95+ }
96+
97+ // Convert analog input to digital directional buttons
98+ if leftX < - stickThreshold {
99+ buttons |= input .ButtonLeft
100+ }
101+ if leftX > stickThreshold {
102+ buttons |= input .ButtonRight
103+ }
104+ if leftY < - stickThreshold {
105+ buttons |= input .ButtonUp
106+ }
107+ if leftY > stickThreshold {
108+ buttons |= input .ButtonDown
109+ }
110+
111+ return buttons
112+ }
0 commit comments