ゲームパッド

gamepad.png

WinAPIの場合

関数

joySetCapture()
joyGetDevCaps
joyGetNumDevs
joyGetPos….xの位置とか、どのボタンが押されてるとか言う情報をゲットする。
joyGetPosEx
joyGetThreshold
joyReleaseCapture
joySetThreshold

構造体

JOYCAPS
JOYINFO
JOYINFOEX

ジョイパッドの性能を調べる

#include <Windows.h>
#include <Mmsystem.h>//for joystick
JOYCAPS joycaps;
JoyInfo.dwSize = sizeof(JOYINFOEX);
JoyInfo.dwFlags = JOY_RETURNALL; // 全ての情報を取得
joyGetDevCaps(JOYSTICKID1,&joycaps,sizeof(JOYCAPS));

WinAPIのコード

完全なコードではない。WinProcが必要。

typedef enum{JOYLEFT,JOYRIGHT,JOYUP,JOYDOWN,BUTTONX,BUTTONY,BUTTONA,BUTTONB,START,SELECT,BUTTONL,BUTTONR}BTNSTATE;
LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
    switch(message)
    {
        case WM_CREATE:
            /* Capture the joystick. If this fails, beep and display
             * error, then quit.
             */
            if(joySetCapture(m_hWnd, JOYSTICKID1, 0, FALSE))
            {
                MessageBeep(MB_ICONEXCLAMATION);
                MessageBox(L"Couldn't capture the joystick", NULL, MB_OK | MB_ICONEXCLAMATION);
                return -1;
            }
 
            break;
 
        case MM_JOY1MOVE :
            //if (m_Control) Rotate(lParam);
            //if (m_Control){
                gamepadDealing();//}
            break;
 
        case WM_DESTROY:
            /* We're shutting down. Release capture on the joystick, 
             * make sure any sounds that are playing are stopped.
             */
            joyReleaseCapture(JOYSTICKID1);
            PostQuitMessage(0);
            break;
    }
    return CDialogEx::WindowProc(message, wParam, lParam);
}
void gamepadDealing(){
    JOYINFOEX joyinfo;
    joyinfo.dwSize=sizeof(joyinfo);
    joyinfo.dwFlags=JOY_RETURNALL;//すべての情報をゲット
 
    JOYCAPS joypad_caps;
    //ジョイスティックを照会してその性能を調べます。
    if(joypad_caps.wMid==1411){//クラシックコントローラだったら
    joyGetDevCaps(JOYSTICKID1, &joypad_caps, sizeof(joypad_caps));
    if(joyGetPosEx(JOYSTICKID1,&joyinfo) == JOYERR_NOERROR){
 
        if(joyinfo.dwButtonNumber>0){//どれかボタンが押されてる時だけ(矢印以外のボタン
            switch(joyinfo.dwButtons){
            case BUTTONX:
                break;
            case BUTTONB:
                break;
            case BUTTONY:
                break;
            case BUTTONA:
                break;
            case SELECT:
                break;
            case START:
                break;
            case BUTTONL:
                break;
            case BUTTONR:
                break;
        }
 
        }//どれかボタン押されてるときだけ
        else{//丸っこいボタンが何も押されてないときだけ、矢印は反応する
 
        }
    }else{    
    }                
}
#ifndef MIFFY_GAMEPAD
#define MIFFY_GAMEPAD
namespace glut{
    typedef enum _gamepad{
        //SNESの場合
        A=1,
        B=2,
        X=4,
        Y=8,
        //PSPの場合
        CROSS =1,
        CIRCLE=2,
        SQUARE=4,
        TRIANGLE=8,
        //PSP,SNES共通のもの
        L=16,
        R=32,
        SELECT=64,
        START=128,
        //PSPのみのボタン
        PLAYSTATION=256,
        MINUS=512,
        PLUS=1024
    }GamePadButton;
 
};
namespace glfw{
    typedef enum _gamepad{
        //SNESの場合
        A=0,
        B=1,
        X=2,
        Y=3,
        //PSPの場合
        CROSS =1,
        CIRCLE=2,
        SQUARE=4,
        TRIANGLE=8,
        //PSP,SNES共通のもの
        L=4,
        R=5,
        SELECT=6,
        START=7,
        //PSPのみのボタン
        PLAYSTATION=256,
        MINUS=512,
        PLUS=1024
    }GamePadButton;
 
};
#endif

サポートサイト Wikidot.com