1 from lib
.gameobject
import GameObject
2 from lib
.lib
.p3d
.joystick
import P3dJoystickMgr
as JoystickMgrLib
8 self
.x
= self
.y
= self
.b0
= self
.b1
= self
.b2
= self
.b3
= \
9 self
.dpad_l
= self
.dpad_r
= self
.dpad_u
= self
.dpad_d
= \
10 self
.ltrigger
= self
.rtrigger
= self
.ltrigger_known
= \
11 self
.rtrigger_known
= self
.lshoulder
= self
.rshoulder
= \
12 self
.lstick
= self
.rstick
= 0
13 #TODO: rename bi to btni
16 class JoystickMgr(GameObject
):
18 def __init__(self
, emulate_keyboard
, functional_test
):
19 GameObject
.__init
__(self
)
20 self
.emulate_keyboard
= emulate_keyboard
21 self
._fun
_tst
= functional_test
22 self
.old
= [JoystickState() for i
in range(3)]
24 self
.is_recording
= False
25 self
.joystick_lib
= JoystickMgrLib()
26 self
.joystick_lib
.init_joystick()
27 self
.eng
.do_later(.01, self
.eng
.attach_obs
, [self
.on_frame
])
28 # eng.event doesn't exist
29 #if self.emulate_keyboard:
30 self
.set_keyboard_emulation()
32 def set_keyboard_emulation(self
):
33 num_joysticks
=1 if self
._fun
_tst
else self
.joystick_lib
.num_joysticks
34 for i
in range(num_joysticks
):
35 base
.accept('joypad%s-dpad_left-up' % i
, self
.__keyb
_evt
, [i
, 'left'])
36 base
.accept('joypad%s-dpad_right-up' % i
, self
.__keyb
_evt
, [i
, 'right'])
37 base
.accept('joypad%s-dpad_up-up' % i
, self
.__keyb
_evt
, [i
, 'up'])
38 base
.accept('joypad%s-dpad_down-up' % i
, self
.__keyb
_evt
, [i
, 'down'])
39 base
.accept('joypad%s-face_a-up' % i
, self
.__keyb
_evt
, [i
, 'fire'])
41 def __keyb_evt(self
, i
, evt
):
42 if not self
.is_recording
and self
.nav
:
43 self
.eng
.send(str(getattr(self
.nav
[i
], evt
)) + '-up')
44 # if the user chose a number
47 #if not self.emulate_keyboard: return
48 for i
in range(self
.joystick_lib
.num_joysticks
): self
.__process
(i
)
50 def __process(self
, i
):
51 j_x
, j_y
, btn0
, btn1
, btn2
, btn3
, dpad_l
, dpad_r
, dpad_u
, dpad_d
, \
52 trigger_l
, trigger_r
, shoulder_l
, shoulder_r
, stick_l
, stick_r
, \
53 trigger_l_known
, trigger_r_known
= \
54 self
.joystick_lib
.get_joystick(i
)
55 # if not self.is_recording:
56 # if self.old[i].x <= -.4 <= j_x or self.old[i].dpad_l and \
58 # if self.nav and i < len(self.nav) and self.nav[i]:
59 # self.eng.send(self.nav[i].left)
60 # if self.old[i].x >= .4 >= j_x or self.old[i].dpad_r and not dpad_r:
61 # if self.nav and i < len(self.nav) and self.nav[i]:
62 # self.eng.send(self.nav[i].right)
63 # if self.old[i].y >= .4 >= j_y or self.old[i].dpad_d and not dpad_d:
64 # if self.nav and i < len(self.nav) and self.nav[i]:
65 # self.eng.send(self.nav[i].down)
66 # if self.old[i].y <= -.4 <= j_y or self.old[i].dpad_u and not dpad_u:
67 # if self.nav and i < len(self.nav) and self.nav[i]:
68 # self.eng.send(self.nav[i].up)
69 # if self.old[i].b0 and not btn0:
70 # if self.nav and i < len(self.nav) and self.nav[i] and \
71 # not self.is_recording:
72 # self.eng.send(self.nav[i].fire)
73 # self.eng.send('joypad%s_face_x' % i)
74 # if self.old[i].b1 and not btn1:
75 # self.eng.send('joypad%s_face_y' % i)
76 # if self.old[i].b2 and not btn2:
77 # self.eng.send('joypad%s_face_a' % i)
78 # if self.old[i].b3 and not btn3:
79 # self.eng.send('joypad%s_face_b' % i)
80 if self
.old
[i
].ltrigger
and not trigger_l
and not trigger_l_known
:
81 #self.eng.send('joypad_trigger_l')
82 self
.eng
.send('joypad%s-ltrigger-up' % i
)
83 if self
.old
[i
].rtrigger
and not trigger_r
and not trigger_r_known
:
84 #self.eng.send('joypad_trigger_r')
85 self
.eng
.send('joypad%s-rtrigger-up' % i
)
86 # if self.old[i].shoulder_l and not shoulder_l:
87 # self.eng.send('joypad_shoulder_l')
88 # self.eng.send('joypad%s_shoulder_l' % i)
89 # if self.old[i].shoulder_r and not shoulder_r:
90 # self.eng.send('joypad_shoulder_r')
91 # self.eng.send('joypad%s_shoulder_r' % i)
92 # if self.old[i].stick_l and not stick_l:
93 # self.eng.send('joypad_stick_l')
94 # self.eng.send('joypad%s_stick_l' % i)
95 # if self.old[i].stick_r and not stick_r:
96 # self.eng.send('joypad_stick_r')
97 # self.eng.send('joypad%s_stick_r' % i)
98 self
.old
[i
].x
, self
.old
[i
].y
, self
.old
[i
].b0
, self
.old
[i
].b1
, \
99 self
.old
[i
].b2
, self
.old
[i
].b3
, self
.old
[i
].dpad_l
, \
100 self
.old
[i
].dpad_r
, self
.old
[i
].dpad_u
, self
.old
[i
].dpad_d
, \
101 self
.old
[i
].ltrigger
, self
.old
[i
].rtrigger
, \
102 self
.old
[i
].lshoulder
, self
.old
[i
].rshoulder
, \
103 self
.old
[i
].lstick
, self
.old
[i
].rstick
= \
104 j_x
, j_y
, btn0
, btn1
, btn2
, btn3
, dpad_l
, dpad_r
, dpad_u
, dpad_d
, \
105 trigger_l
, trigger_r
, shoulder_l
, shoulder_r
, stick_l
, stick_r
107 def get_joystick(self
, player_idx
):
108 x
, y
, face_a
, face_b
, face_x
, face_y
, dpadl
, dpadr
, dpadu
, dpadd
, triggl
, \
109 triggr
, shl
, shr
, st_l
, st_r
, trl_k
, trr_k
= \
110 self
.joystick_lib
.get_joystick(player_idx
)
111 jstate
= JoystickState()
114 jstate
.face_a
= face_a
115 jstate
.face_b
= face_b
116 jstate
.face_x
= face_x
117 jstate
.face_y
= face_y
118 jstate
.dpad_l
= dpadl
119 jstate
.dpad_r
= dpadr
120 jstate
.dpad_u
= dpadu
121 jstate
.dpad_d
= dpadd
122 jstate
.ltrigger
= triggl
123 jstate
.ltrigger_known
= trl_k
124 jstate
.rtrigger
= triggr
125 jstate
.rtrigger_known
= trr_k
126 jstate
.lshoulder
= shl
127 jstate
.rshoulder
= shr
132 def get_joystick_val(self
, player_idx
, code
):
133 j_x
, j_y
, btn0
, btn1
, btn2
, btn3
, dpad_l
, dpad_r
, dpad_u
, dpad_d
, \
134 trigger_l
, trigger_r
, shoulder_l
, shoulder_r
, stick_l
, stick_r
= \
135 self
.joystick_lib
.get_joystick(player_idx
)
145 'trigger_l': trigger_l
,
146 'trigger_r': trigger_r
,
147 'shoulder_l': shoulder_l
,
148 'shoulder_r': shoulder_r
,
151 return code2val
[code
]
153 def bind_keyboard(self
, nav
): self
.nav
= nav
155 def unbind_keyboard(self
): self
.nav
= None
158 try: self
.eng
.detach_obs(self
.on_frame
)
159 except KeyError: pass
160 # it happens in unit tests since it destroys in the same frame
161 # remove this catch when i've refactored the object's building
162 # and i don't use the director anymore
163 self
.joystick_lib
.destroy()
164 GameObject
.destroy(self
)