Joystick position: Difference between revisions

Content added Content deleted
(Added solution for Action!)
m (→‎{{header|Phix}}: added syntax colouring, marked p2js incompatible)
Line 1,088: Line 1,088:


First, joy.e:
First, joy.e:
<!--<lang Phix>(notonline)-->
<lang Phix>-- Joystick library for Euphoria (Windows)
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>
-- /Mic, 2002
<span style="color: #000080;font-style:italic;">-- Joystick library for Euphoria (Windows)
--
-- /Mic, 2002
-- integer joy_init()
--
-- returns the number of joysticks attached to the computer
-- integer joy_init()
--
-- returns the number of joysticks attached to the computer
-- sequence joy_get_state(integer joy_num)
--
-- returns the current state of joystick #joy_num (can be either 1 or 2).
-- sequence joy_get_state(integer joy_num)
-- the format of the return sequence is:
-- returns the current state of joystick #joy_num (can be either 1 or 2).
-- {X_direction, Y_direction, Z_direction, buttons}
-- the format of the return sequence is:
-- the X,Y and Z directions have 3 possible values; 0 (negative), 32768 (neutral) or 65535 (positive)
-- {X_direction, Y_direction, Z_direction, buttons}
-- the buttons' status are represented by a single bit (button up, button down). e.g. to get the status
-- the X,Y and Z directions have 3 possible values; 0 (negative), 32768 (neutral) or 65535 (positive)
-- of button #3 on joystick #1 you'd use:
-- the buttons' status are represented by a single bit (button up, button down). e.g. to get the status
-- sequence state
-- of button #3 on joystick #1 you'd use:
-- state = joy_get_state(1)
-- if and_bits(state[4],4) then ... end if
-- sequence state
-- state = joy_get_state(1)
--
-- if and_bits(state[4],4) then ... end if
include dll.e
--</span>
include machine.e
<span style="color: #008080;">include</span> <span style="color: #000000;">dll</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>

<span style="color: #008080;">include</span> <span style="color: #000000;">machine</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
constant joyinfo = allocate(32)
atom winmm
<span style="color: #008080;">constant</span> <span style="color: #000000;">joyinfo</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">32</span><span style="color: #0000FF;">)</span>
integer joyGetNumDevs,joyGetPos
<span style="color: #004080;">atom</span> <span style="color: #000000;">winmm</span>

<span style="color: #004080;">integer</span> <span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyGetPos</span>
winmm = open_dll("winmm.dll")
if (winmm <= 0) then
<span style="color: #000000;">winmm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">open_dll</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"winmm.dll"</span><span style="color: #0000FF;">)</span>
puts(1,"Unable to open winmm.dll")
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span> <span style="color: #0000FF;"><=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
abort(0)
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Unable to open winmm.dll"</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>

<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
joyGetNumDevs = define_c_func(winmm,"joyGetNumDevs",{},C_UINT)
joyGetPos = define_c_func(winmm,"joyGetPos",{C_INT,C_POINTER},C_INT)
<span style="color: #000000;">joyGetNumDevs</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"joyGetNumDevs"</span><span style="color: #0000FF;">,{},</span><span style="color: #000000;">C_UINT</span><span style="color: #0000FF;">)</span>
if (joyGetNumDevs<0) or (joyGetPos<0) then
<span style="color: #000000;">joyGetPos</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">winmm</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"joyGetPos"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">,</span><span style="color: #000000;">C_POINTER</span><span style="color: #0000FF;">},</span><span style="color: #000000;">C_INT</span><span style="color: #0000FF;">)</span>
puts(1,"Unable to link functions")
<span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;"><</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
abort(0)
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Unable to link functions"</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>

<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
global function joy_init()
integer joy1Attached,joy2Attached
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">joy_init</span><span style="color: #0000FF;">()</span>
integer numDevs = c_func(joyGetNumDevs,{})
<span style="color: #004080;">integer</span> <span style="color: #000000;">joy1Attached</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joy2Attached</span>
if numDevs=0 then
<span style="color: #004080;">integer</span> <span style="color: #000000;">numDevs</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetNumDevs</span><span style="color: #0000FF;">,{})</span>
return 0
<span style="color: #008080;">if</span> <span style="color: #000000;">numDevs</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">return</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
joy1Attached = (c_func(joyGetPos,{0,joyinfo}) != 167)
joy2Attached = (numDevs=2) and (c_func(joyGetPos,{1,joyinfo}) != 167)
<span style="color: #000000;">joy1Attached</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">})</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">167</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">joy2Attached</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">numDevs</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">})</span> <span style="color: #0000FF;">!=</span> <span style="color: #000000;">167</span><span style="color: #0000FF;">)</span>
return joy1Attached + (joy2Attached*2)
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">joy1Attached</span> <span style="color: #0000FF;">+</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">joy2Attached</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>

<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
global function joy_get_state(integer joy_num)
if joy_num=1 or joy_num=2 then
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">joy_get_state</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">)</span>
joy_num -= 1
<span style="color: #008080;">if</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">or</span> <span style="color: #000000;">joy_num</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
if c_func(joyGetPos,{joy_num,joyinfo+(joy_num*16)}) then
<span style="color: #000000;">joy_num</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
-- ERROR
<span style="color: #008080;">if</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">joyGetPos</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">*</span><span style="color: #000000;">16</span><span style="color: #0000FF;">)})</span> <span style="color: #008080;">then</span>
return {}
<span style="color: #000080;font-style:italic;">-- ERROR</span>
end if
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{}</span>
return peek4u({joyinfo+(joy_num*16),4})
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">return</span> <span style="color: #7060A8;">peek4u</span><span style="color: #0000FF;">({</span><span style="color: #000000;">joyinfo</span><span style="color: #0000FF;">+(</span><span style="color: #000000;">joy_num</span><span style="color: #0000FF;">*</span><span style="color: #000000;">16</span><span style="color: #0000FF;">),</span><span style="color: #000000;">4</span><span style="color: #0000FF;">})</span>
return {}
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end function</lang>
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{}</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<!--</lang>-->
And a test program:
And a test program:
<lang Phix>include joy.ew
<!--<lang Phix>(notonline)-->
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span>

<span style="color: #008080;">include</span> <span style="color: #000000;">joy</span><span style="color: #0000FF;">.</span><span style="color: #000000;">ew</span>
if joy_init()=0 then
puts(1,"No joystick(s) attached!")
<span style="color: #008080;">if</span> <span style="color: #000000;">joy_init</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
abort(0)
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"No joystick(s) attached!"</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #7060A8;">abort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>

<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
sequence joy_info = {}, s
integer button_mask
<span style="color: #004080;">sequence</span> <span style="color: #000000;">joy_info</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000000;">s</span>

<span style="color: #004080;">integer</span> <span style="color: #000000;">button_mask</span>
puts(1,"Joystick test\nEntering input loop. Press a key to exit..\n\n")

<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Joystick test\nEntering input loop. Press a key to exit..\n\n"</span><span style="color: #0000FF;">)</span>
while get_key()=-1 do
-- Get the state of joystick #1
<span style="color: #008080;">while</span> <span style="color: #7060A8;">get_key</span><span style="color: #0000FF;">()=-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
s = joy_get_state(1)
<span style="color: #000080;font-style:italic;">-- Get the state of joystick #1</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">joy_get_state</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
-- Do not print info unless the state has changed
if not equal(s,joy_info) then
<span style="color: #000080;font-style:italic;">-- Do not print info unless the state has changed</span>
joy_info = s
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">equal</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">joy_info</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>

<span style="color: #000000;">joy_info</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
printf(1,"X = %d, Y= %d ",{floor((s[1]-32767)/32768),floor((s[2]-32767)/32768)})

<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"X = %d, Y= %d "</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">32767</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">32768</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">32767</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">32768</span><span style="color: #0000FF;">)})</span>
button_mask = 1
for i=1 to 8 do
<span style="color: #000000;">button_mask</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
if and_bits(s[4],button_mask) then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">8</span> <span style="color: #008080;">do</span>
printf(1,"BTN%d ",i)
<span style="color: #008080;">if</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">],</span><span style="color: #000000;">button_mask</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
else
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"BTN%d "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)</span>
puts(1," ")
end if
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
button_mask *= 2
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #000000;">button_mask</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">2</span>
puts(1,"\n")
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end if
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
end while</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<!--</lang>-->


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==