「ジョイパッドの状態を取得(XInput)」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
<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&act=open&pageid=120&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 <windows.h><br />
#include <XInput.h><br />
#include <GL/freeglut/freeglut.h></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 < MAX_CONTROLLERS; i++ )<br />
{<br />
dwResult = XInputGetState( i, &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 < 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>Threshold)y-=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLY<-Threshold)y+=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLX>Threshold)x+=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLX<-Threshold)x-=2;</p>
<p> //デジタル方向キー<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_UP )y-=2;<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_DOWN )y+=2;<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_LEFT )x-=2;<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_RIGHT )x+=2;</p>
<p> //各種ボタン 空制御 コピペ用<br />
if( Buttons & XINPUT_GAMEPAD_A );<br />
if( Buttons & XINPUT_GAMEPAD_B );<br />
if( Buttons & XINPUT_GAMEPAD_X );<br />
if( Buttons & XINPUT_GAMEPAD_Y );<br />
if( Buttons & XINPUT_GAMEPAD_START );<br />
if( Buttons & XINPUT_GAMEPAD_BACK );<br />
if( Buttons & XINPUT_GAMEPAD_LEFT_THUMB );//左アナログ方向キーをパッド奥に押した場合<br />
if( Buttons & XINPUT_GAMEPAD_RIGHT_THUMB );//右アナログ方向キーをパッド奥に押した場合<br />
if( Buttons & XINPUT_GAMEPAD_LEFT_SHOULDER );<br />
if( Buttons & 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(&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&act=open&pageid=120&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&act=open&pageid=120&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 <windows.h><br />
#include <XInput.h><br />
#include <GL/freeglut/freeglut.h></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 < MAX_CONTROLLERS; i++ )<br />
{<br />
dwResult = XInputGetState( i, &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 < 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>Threshold)y-=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLY<-Threshold)y+=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLX>Threshold)x+=2;<br />
if(GAME_PAD[i].state.Gamepad.sThumbLX<-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 & XINPUT_GAMEPAD_DPAD_UP )y-=2;<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_DOWN )y+=2;<br />
if( Buttons & XINPUT_GAMEPAD_DPAD_LEFT )x-=2;<br />
if( Buttons & 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 & XINPUT_GAMEPAD_A );<br />
if( Buttons & XINPUT_GAMEPAD_B );<br />
if( Buttons & XINPUT_GAMEPAD_X );<br />
if( Buttons & XINPUT_GAMEPAD_Y );<br />
if( Buttons & XINPUT_GAMEPAD_START );<br />
if( Buttons & XINPUT_GAMEPAD_BACK );<br />
if( Buttons & XINPUT_GAMEPAD_LEFT_THUMB );//左アナログ方向キーをパッド奥に押した場合<br />
if( Buttons & XINPUT_GAMEPAD_RIGHT_THUMB );//右アナログ方向キーをパッド奥に押した場合<br />
if( Buttons & XINPUT_GAMEPAD_LEFT_SHOULDER );<br />
if( Buttons & 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(&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>