ジョイパッドの状態を取得(XInput)

「ジョイパッドの状態を取得(XInput)」の編集履歴(バックアップ)一覧はこちら

ジョイパッドの状態を取得(XInput)」(2014/12/29 (月) 13:30:30) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><strong>Xinput を使ってジョイパッドの情報を得ます。<br /> 現在は対応コントローラーが少ないですが、これからは増えてこの規格が標準に<br /> なるでしょう。多分。(マイクロソフトが、そうしたいらしいので。)<br /> どう見ても DirectInput の方が高機能ですが、これからは XInput を使いましょう。<br /> Xbox 360 Controller Emulator なる物もあるので Xbox 360 のPC用コントローラーを<br /> 持っていなくとも対応させる事はできます。<br /> 今回のプログラムはアナログ、デジタルの方向キーで緑の四角形を移動させます。<br /> XInput 対応コントローラーかエミュレータでなければ動きません。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=120&amp;file=pad.png" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"xinput.lib ")</p> <p>#include &lt;windows.h&gt;<br /> #include &lt;XInput.h&gt;<br /> #include &lt;GL/freeglut/freeglut.h&gt;</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>int x=150,y=80;</p> <p>#define MAX_CONTROLLERS  4  //XInputが認識できるのは4つまで<br /> #define Threshold   65535/4 //しきい値</p> <p>struct CONTROLER_STATE<br /> {<br />     XINPUT_STATE state;<br />     bool bConnected;<br /> };</p> <p>CONTROLER_STATE GAME_PAD[MAX_CONTROLLERS];</p> <p>//接続されているか調べる<br /> HRESULT UpdateControllerState()<br /> {<br />     DWORD dwResult;<br />     for( DWORD i = 0; i &lt; MAX_CONTROLLERS; i++ )<br />     {<br />         dwResult = XInputGetState( i, &amp;GAME_PAD[i].state );</p> <p>        if( dwResult == ERROR_SUCCESS )<br />             GAME_PAD[i].bConnected = true;<br />         else<br />             GAME_PAD[i].bConnected = false;<br />     }</p> <p>    return S_OK;<br /> }<br /> void SquareFill2D(int x1,int y1,int x2, int y2){<br />  glBegin(GL_QUADS);<br />  glVertex2i(x1,y1);<br />  glVertex2i(x2,y1);<br />  glVertex2i(x2,y2);<br />  glVertex2i(x1,y2);<br />  glEnd();<br /> }</p> <p>void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f,0.5f,0.0f,1.0f);<br />  SquareFill2D(x,y,x+50,y+50);<br />  glutSwapBuffers();</p> <p>}<br /> void idle(void)<br /> {<br />  UpdateControllerState();<br />  <br />     for( DWORD i = 0; i &lt; MAX_CONTROLLERS; i++ ){<br />         if( GAME_PAD[i].bConnected ){<br />             WORD Buttons = GAME_PAD[i].state.Gamepad.wButtons;</p> <p>   //アナログ方向キー<br />    if(GAME_PAD[i].state.Gamepad.sThumbLY&gt;Threshold)y-=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLY&lt;-Threshold)y+=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLX&gt;Threshold)x+=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLX&lt;-Threshold)x-=2;</p> <p>   //デジタル方向キー<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_UP )y-=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_DOWN )y+=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_LEFT )x-=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_RIGHT )x+=2;</p> <p>   //各種ボタン 空制御 コピペ用<br />    if( Buttons &amp; XINPUT_GAMEPAD_A );<br />    if( Buttons &amp; XINPUT_GAMEPAD_B );<br />    if( Buttons &amp; XINPUT_GAMEPAD_X );<br />    if( Buttons &amp; XINPUT_GAMEPAD_Y );<br />    if( Buttons &amp; XINPUT_GAMEPAD_START );<br />    if( Buttons &amp; XINPUT_GAMEPAD_BACK );<br />    if( Buttons &amp; XINPUT_GAMEPAD_LEFT_THUMB );//左アナログ方向キーをパッド奥に押した場合<br />    if( Buttons &amp; XINPUT_GAMEPAD_RIGHT_THUMB );//右アナログ方向キーをパッド奥に押した場合<br />    if( Buttons &amp; XINPUT_GAMEPAD_LEFT_SHOULDER );<br />    if( Buttons &amp; XINPUT_GAMEPAD_RIGHT_SHOULDER );<br />    if(GAME_PAD[i].state.Gamepad.bLeftTrigger);<br />    if(GAME_PAD[i].state.Gamepad.bRightTrigger);<br />         }else{<br />             //接続されていない場合<br />         }<br />  }<br />  Sleep(1);<br />  glutPostRedisplay();<br /> }</p> <p>void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA);<br />  glutCreateWindow("ジョイパッド");<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p><strong>Xinput を使ってジョイパッドの情報を得ます。<br /> 現在は対応コントローラーが少ないですが、これからは増えてこの規格が標準に<br /> なるでしょう。多分。(マイクロソフトが、そうしたいらしいので。)<br /> どう見ても DirectInput の方が高機能ですが、これからは XInput を使いましょう。<br /> Xbox 360 Controller Emulator なる物もあるので Xbox 360 のPC用コントローラーを<br /> 持っていなくとも対応させる事はできます。<br /> 今回のプログラムはアナログ、デジタルの方向キーで緑の四角形を移動させます。<br /> XInput 対応コントローラーかエミュレータでなければ動きません。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=120&amp;file=pad.png" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" style="width:100px;"><tbody><tr><td>ファイル</td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=120&amp;file=main.cpp"> main.cpp</a></td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"xinput.lib ")</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #include &lt;windows.h&gt;<br /> #include &lt;XInput.h&gt;<br /> #include &lt;GL/freeglut/freeglut.h&gt;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #define WIDTH 320<br /> #define HEIGHT 240</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> int x=150,y=80;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #define MAX_CONTROLLERS  4  //XInputが認識できるのは4つまで<br /> #define Threshold   65535/4 //しきい値</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> struct CONTROLER_STATE<br /> {<br />     XINPUT_STATE state;<br />     bool bConnected;<br /> };</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> CONTROLER_STATE GAME_PAD[MAX_CONTROLLERS];</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> //接続されているか調べる<br /> HRESULT UpdateControllerState()<br /> {<br />     DWORD dwResult;<br />     for( DWORD i = 0; i &lt; MAX_CONTROLLERS; i++ )<br />     {<br />         dwResult = XInputGetState( i, &amp;GAME_PAD[i].state );</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">         if( dwResult == ERROR_SUCCESS )<br />             GAME_PAD[i].bConnected = true;<br />         else<br />             GAME_PAD[i].bConnected = false;<br />     }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">     return S_OK;<br /> }<br /> void SquareFill2D(int x1,int y1,int x2, int y2){<br />  glBegin(GL_QUADS);<br />  glVertex2i(x1,y1);<br />  glVertex2i(x2,y1);<br />  glVertex2i(x2,y2);<br />  glVertex2i(x1,y2);<br />  glEnd();<br /> }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f,0.5f,0.0f,1.0f);<br />  SquareFill2D(x,y,x+50,y+50);<br />  glutSwapBuffers();</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> }<br /> void idle(void)<br /> {<br />  UpdateControllerState();<br />  <br />     for( DWORD i = 0; i &lt; MAX_CONTROLLERS; i++ ){<br />         if( GAME_PAD[i].bConnected ){<br />             WORD Buttons = GAME_PAD[i].state.Gamepad.wButtons;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">    //アナログ方向キー<br />    if(GAME_PAD[i].state.Gamepad.sThumbLY&gt;Threshold)y-=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLY&lt;-Threshold)y+=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLX&gt;Threshold)x+=2;<br />    if(GAME_PAD[i].state.Gamepad.sThumbLX&lt;-Threshold)x-=2;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">    //デジタル方向キー<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_UP )y-=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_DOWN )y+=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_LEFT )x-=2;<br />    if( Buttons &amp; XINPUT_GAMEPAD_DPAD_RIGHT )x+=2;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">    //各種ボタン 空制御 コピペ用<br />    if( Buttons &amp; XINPUT_GAMEPAD_A );<br />    if( Buttons &amp; XINPUT_GAMEPAD_B );<br />    if( Buttons &amp; XINPUT_GAMEPAD_X );<br />    if( Buttons &amp; XINPUT_GAMEPAD_Y );<br />    if( Buttons &amp; XINPUT_GAMEPAD_START );<br />    if( Buttons &amp; XINPUT_GAMEPAD_BACK );<br />    if( Buttons &amp; XINPUT_GAMEPAD_LEFT_THUMB );//左アナログ方向キーをパッド奥に押した場合<br />    if( Buttons &amp; XINPUT_GAMEPAD_RIGHT_THUMB );//右アナログ方向キーをパッド奥に押した場合<br />    if( Buttons &amp; XINPUT_GAMEPAD_LEFT_SHOULDER );<br />    if( Buttons &amp; XINPUT_GAMEPAD_RIGHT_SHOULDER );<br />    if(GAME_PAD[i].state.Gamepad.bLeftTrigger);<br />    if(GAME_PAD[i].state.Gamepad.bRightTrigger);<br />         }else{<br />             //接続されていない場合<br />         }<br />  }<br />  Sleep(1);<br />  glutPostRedisplay();<br /> }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA);<br />  glutCreateWindow("ジョイパッド");<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: