-
Notifications
You must be signed in to change notification settings - Fork 0
/
controller.go
79 lines (70 loc) · 1.4 KB
/
controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package nes
import (
"github.com/faiface/pixel/pixelgl"
)
type Controller struct {
buttonState []bool // Key press state: on/off
}
func NewController() *Controller {
return &Controller{
buttonState: make([]bool, len(controllerKeys)),
}
}
// Available NES controller buttons and their keyboard binds
// Keyboard binds:
/*
0: Right ---> D
1: Left ---> A
2: Down ---> S
3: Up ---> W
4: Start ---> Enter
5: Select ---> Right Shift
6: B ---> K
7: A ---> J
*/
const (
keyRight int = iota
keyLeft
keyDown
keyUp
keyStart
keySelect
keyB
keyA
)
// TODO: add 2nd controller keys
var controllerKeys = map[int]pixelgl.Button{
keyRight: pixelgl.KeyD,
keyLeft: pixelgl.KeyA,
keyDown: pixelgl.KeyS,
keyUp: pixelgl.KeyW,
keyStart: pixelgl.KeyEnter,
keySelect: pixelgl.KeyRightShift,
keyB: pixelgl.KeyK,
keyA: pixelgl.KeyJ,
}
// GetState returns a byte, with each bit representing the state of a button on
// the controller.
func (c *Controller) GetState() byte {
var state byte
for pos, s := range c.buttonState {
if s {
state |= (1 << pos)
}
}
return state
}
func (c *Controller) updateControllerInput(win *pixelgl.Window) {
// Key down
for idx, key := range controllerKeys {
if win.JustPressed(key) {
c.buttonState[idx] = true
}
}
// Key up
for idx, key := range controllerKeys {
if win.JustReleased(key) {
c.buttonState[idx] = false
}
}
}