-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinput.py
More file actions
122 lines (115 loc) · 4.9 KB
/
input.py
File metadata and controls
122 lines (115 loc) · 4.9 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import vgamepad as vg
import sys
xbox_buttons = {
"a": vg.XUSB_BUTTON.XUSB_GAMEPAD_A,
"b": vg.XUSB_BUTTON.XUSB_GAMEPAD_B,
"x": vg.XUSB_BUTTON.XUSB_GAMEPAD_X,
"y": vg.XUSB_BUTTON.XUSB_GAMEPAD_Y,
"start": vg.XUSB_BUTTON.XUSB_GAMEPAD_START,
"select": vg.XUSB_BUTTON.XUSB_GAMEPAD_BACK,
"home": vg.XUSB_BUTTON.XUSB_GAMEPAD_GUIDE,
"l1": vg.XUSB_BUTTON.XUSB_GAMEPAD_LEFT_SHOULDER,
"r1": vg.XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_SHOULDER,
"lthumb": vg.XUSB_BUTTON.XUSB_GAMEPAD_LEFT_THUMB,
"rthumb": vg.XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_THUMB,
"dpad_up": vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_UP,
"dpad_down": vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_DOWN,
"dpad_left": vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT,
"dpad_right": vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_RIGHT
}
ps4_buttons = {
"a": vg.DS4_BUTTONS.DS4_BUTTON_CROSS,
"b": vg.DS4_BUTTONS.DS4_BUTTON_CIRCLE,
"x": vg.DS4_BUTTONS.DS4_BUTTON_SQUARE,
"y": vg.DS4_BUTTONS.DS4_BUTTON_TRIANGLE,
"start": vg.DS4_BUTTONS.DS4_BUTTON_SHARE,
"select": vg.DS4_BUTTONS.DS4_BUTTON_OPTIONS,
"home": vg.DS4_SPECIAL_BUTTONS.DS4_SPECIAL_BUTTON_PS,
"l1": vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_LEFT,
"r1": vg.DS4_BUTTONS.DS4_BUTTON_SHOULDER_RIGHT,
"lthumb": vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_LEFT,
"rthumb": vg.DS4_BUTTONS.DS4_BUTTON_TRIGGER_RIGHT,
"dpad_none": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NONE,
"dpad_up": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTH,
"dpad_upleft": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHWEST,
"dpad_upright": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_NORTHEAST,
"dpad_down": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTH,
"dpad_downleft": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHWEST,
"dpad_downright": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_SOUTHEAST,
"dpad_left": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_WEST,
"dpad_right": vg.DS4_DPAD_DIRECTIONS.DS4_BUTTON_DPAD_EAST
}
buttons_index = ["a","b","x","y","start","select","home","l1","r1","lthumb","rthumb"]
dpad_index = ["dpad_none","dpad_up","dpad_upleft","dpad_upright","dpad_down","dpad_downleft","dpad_downright","dpad_left","dpad_right"]
triggers_index = ["l2", "r2"]
joystick_index = ["lstick", "rstick"]
dpad_directions = {
"dpad_up": 0,
"dpad_down": 1,
"dpad_left": 2,
"dpad_right": 3
}
class Gamepad:
def __init__(self, type="xbox"):
if type == "xbox":
self.controller = "xbox"
self.gamepad = vg.VX360Gamepad()
self.button_map = xbox_buttons
elif type == "ps4":
self.controller = "ps4"
self.gamepad = vg.VDS4Gamepad()
self.button_map = ps4_buttons
self.dpad_status = [False,False,False,False] # up, down, left, right
else:
raise ValueError("invalid gamepad type, must be 'xbox' or 'ps4'")
def input(self,input,value):
if not self.gamepad:
print("gamepad not initialized")
return
if self.controller == "ps4" and input == "home":
if value == 1:
self.gamepad.press_special_button(self.button_map[input])
elif value == 0:
self.gamepad.release_special_button(self.button_map[input])
elif self.controller == "ps4" and input in dpad_index:
if value == 1:
self.dpad_status[dpad_directions[input]] = True
elif value == 0:
self.dpad_status[dpad_directions[input]] = False
if all(not status for status in self.dpad_status):
self.gamepad.directional_pad(direction=ps4_buttons["dpad_none"])
elif self.dpad_status[0]:
if self.dpad_status[2]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_upleft"])
elif self.dpad_status[3]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_upright"])
else:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_up"])
elif self.dpad_status[1]:
if self.dpad_status[2]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_downleft"])
elif self.dpad_status[3]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_downright"])
else:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_down"])
elif self.dpad_status[2]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_left"])
elif self.dpad_status[3]:
self.gamepad.directional_pad(direction=ps4_buttons["dpad_right"])
elif input in buttons_index or input in dpad_index:
if value == 1:
self.gamepad.press_button(self.button_map[input])
elif value == 0:
self.gamepad.release_button(self.button_map[input])
elif input == triggers_index[0]:
self.gamepad.left_trigger_float(value)
elif input == triggers_index[1]:
self.gamepad.right_trigger_float(value)
elif input == joystick_index[0]:
self.gamepad.left_joystick_float(value[0], value[1])
elif input == joystick_index[1]:
if sys.platform == "win32":
self.gamepad.right_joystick_float(value[0], value[1])
else:
self.gamepad.right_joystick_float(value[0], -value[1])
self.gamepad.update()