CDirectInput.cpp

説明を見る。
00001 #include "../ZakiLib.hpp"
00002 
00003 //============================================================================
00004 //コンストラクタ
00005 //============================================================================
00006 CDirectInput::CDirectInput()
00007 {
00008         this->m_lpDInputDevice = NULL;
00009         this->m_dwBufferSize = 0;
00010         ZeroMemory(&this->m_DiInst,sizeof(this->m_DiInst));
00011 }
00012 
00013 //============================================================================
00014 //デバイスの初期化
00015 //引数                :デバイスのインスタンス
00016 //                      :バッファリングの有無
00017 //                      :親ウインドウハンドル
00018 //                      :操作レベル(DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)
00019 //戻り値     :エラーコード
00020 //処理概要  :
00021 //                       デバイスの初期化に使う
00022 //                       デバイスの列挙、ボタン等、操作レベル、バッファリングの設定
00023 //                       アクセス許可を行う
00024 //============================================================================
00025 HRESULT CDirectInput::InitDevice(DIDEVICEINSTANCE DiDevInst,DWORD dwBufferSize,HWND hWindow,DWORD dwLevel)
00026 {
00027         HRESULT hr;
00028 
00029         if(this->g_lpDInput == NULL)
00030                 return E_FAIL;
00031 /*
00032         //============================================
00033         //デバイスの列挙
00034         //============================================
00035         hr = this->g_lpDInput->EnumDevices(DI8DEVCLASS_ALL,EmunJoysticksCallback,(LPVOID)this,DIEDFL_ATTACHEDONLY);
00036         if(FAILED(hr))
00037                 return DXTRACE_ERR_MSGBOX("Error",hr);
00038         if(this->m_lpDInputDevice == NULL)
00039                 return D3DERR DEVICELOST
00040 */
00041 
00042         //============================================
00043         //デバイスインスタンスの登録
00044         //============================================
00045         this->m_DiInst = DiDevInst;
00046 
00047         //============================================
00048         //GUID重複チェック
00049         //============================================
00050         if(this->CheckDeviceGuid(DiDevInst.guidInstance))
00051                 return E_FAIL;
00052 
00053         //============================================
00054         //使用するGUIDの登録
00055         //============================================
00056         this->SetGuid(DiDevInst.guidInstance);
00057 
00058         //============================================
00059         //デバイスの作成
00060         //============================================
00061         hr = g_lpDInput->CreateDevice(this->m_DiInst.guidInstance,&this->m_lpDInputDevice,NULL);
00062         if(FAILED(hr))
00063                 return DXTRACE_ERR_MSGBOX("Input¥nInitDevice¥nCreateDevice",hr);
00064 
00065         //============================================
00066         //デバイスの条件チェック
00067         //============================================
00068         hr = this->DeviceCondition(&DiDevInst);
00069         if(FAILED(hr))
00070         {
00071                 this->Release();
00072                 return DXTRACE_ERR_MSGBOX("Input¥nInitDevice¥nDeviceCondition",hr);
00073         }
00074 
00075         //============================================
00076         //軸の設定
00077         //============================================
00078         hr = this->m_lpDInputDevice->EnumObjects(EnumAxesCallback,(LPVOID)this,DIDFT_ALL);
00079         if(FAILED(hr))
00080         {
00081                 this->Release();
00082                 return DXTRACE_ERR_MSGBOX("Input¥nInitDevice¥nEumObjects",hr);
00083         }
00084 
00085         //============================================
00086         //操作レベル(排他的、フォア、バックなど)
00087         //============================================
00088         hr = this->m_lpDInputDevice->SetCooperativeLevel(hWindow,dwLevel);//DISCL_FOREGROUND | DISCL_NONEXCLUSIVE
00089         if(FAILED(hr))
00090         {
00091                 this->Release();
00092                 return DXTRACE_ERR_MSGBOX("Input¥nInitDevice¥nSetCooperativeLevel",hr);
00093         }
00094 
00095         //============================================
00096         //デバイスの直接データのセット
00097         //============================================
00098         switch(GET_DIDEVICE_TYPE(this->m_DiInst.dwDevType)) {
00099                 case DI8DEVTYPE_MOUSE:
00100                         hr = this->m_lpDInputDevice->SetDataFormat(&c_dfDIMouse2);
00101                         break;
00102                 case DI8DEVTYPE_KEYBOARD:
00103                         hr = this->m_lpDInputDevice->SetDataFormat(&c_dfDIKeyboard);
00104                         break;
00105 //              case DI8DEVTYPE_JOYSTICK:
00106 //              case DI8DEVTYPE_GAMEPAD:
00107                 default:
00108                         hr = this->m_lpDInputDevice->SetDataFormat(&c_dfDIJoystick2);
00109                         break;
00110         }
00111 
00112         this->m_dwBufferSize = dwBufferSize;
00113         //============================================
00114         //バッファリング
00115         //============================================
00116         if(dwBufferSize)
00117         {
00118                 DIPROPDWORD diprop;
00119                 diprop.diph.dwSize = sizeof(diprop);
00120                 diprop.diph.dwHeaderSize = sizeof(diprop.diph);
00121                 diprop.diph.dwObj = 0;
00122                 diprop.diph.dwHow = DIPH_DEVICE;
00123                 diprop.dwData = dwBufferSize;
00124 
00125                 //============================================
00126                 //バッファサイズセット
00127                 //============================================
00128                 hr = this->m_lpDInputDevice->SetProperty(DIPROP_BUFFERSIZE,&diprop.diph);
00129                 if(FAILED(hr))
00130                 {
00131                         MessageBox(hWindow,"バッファサイズの設定に失敗","error",MB_OK);
00132                         this->Release();
00133                         return DXTRACE_ERR_MSGBOX("Input¥nInitDevice¥nSetProp¥nSetBufferSize",hr);
00134                 }
00135         }
00136 
00137         return D3D_OK;
00138 }
00139 
00140 //============================================================================
00141 //デバイスの開放
00142 //引数                :なし
00143 //戻り値     :なし
00144 //処理概要  :
00145 //                       アクセスの拒否、記憶したGUIDの削除、デバイスのリリースを行う
00146 //============================================================================
00147 VOID CDirectInput::Release()
00148 {
00149         this->RemoveGuid(this->m_DiInst.guidInstance);
00150         this->AcquireDevice(FALSE);
00151         SAFE_RELEASE(this->m_lpDInputDevice);
00152 
00153         delete this;
00154 }
00155 /*
00156 //============================================================================
00157 //デバイスの作成
00158 //引数                :デバイスのインスタンス
00159 //戻り値     :エラーコード
00160 //処理概要  :
00161 //                       EmunJoysticksCallback()から呼ばれる
00162 //                       列挙されたデバイスを作成する
00163 //============================================================================
00164 HRESULT CDirectInput::DeviceCreate(const DIDEVICEINSTANCE *lpDdInst)
00165 {
00166         HRESULT hr;
00167 
00168         //============================================
00169         //デバイスのタイプ確認
00170         //============================================
00171         //DWORD dwDevType = GET_DIDEVICE_TYPE(lpDdInst->dwDevType);
00172         //DWORD dwDevSubType = GET_DIDEVICE_SUBTYPE(lpDdInst->dwDevType);
00173 
00174         //if(dwDevType != this->g_dwDeviceType && dwDevSubType != this->g_dwDeviceType)
00175         //      return E_FAIL;
00176 
00177         //============================================
00178         //デバイスの作成
00179         //============================================
00180         hr = g_lpDInput->CreateDevice(lpDdInst->guidInstance,&this->m_lpDInputDevice,NULL);
00181         if(FAILED(hr))
00182                 return DXTRACE_ERR_MSGBOX("Error",hr);
00183 
00184         //============================================
00185         //デバイスの条件確認
00186         //============================================
00187         hr = this->DeviceCondition(lpDdInst);
00188         if(FAILED(hr))
00189         {
00190                 SAFE_RELEASE(this->m_lpDInputDevice);
00191                 this->RemoveGuid(lpDdInst->guidInstance);
00192                 return E_FAIL;
00193         }
00194 
00195         //============================================
00196         //インスタンスの保持
00197         //============================================
00198         this->m_DiInst = *lpDdInst;
00199 
00200         return D3D_OK;
00201 }
00202 */
00203 //============================================================================
00204 //デバイス列挙の条件
00205 //引数                :デバイスのインスタンス
00206 //戻り値     :エラーコード
00207 //処理概要  :
00208 //                       デバイス作成のDeviceCreate()から呼ばれる
00209 //                       デバイスを作る上での条件をつける
00210 //                       条件に合わなければE_FAILを返す
00211 //============================================================================
00212 HRESULT CDirectInput::DeviceCondition(const DIDEVICEINSTANCE *lpDdInst)
00213 {
00214         HRESULT hr;
00215         DIDEVCAPS DiDevCaps;
00216 
00217         //デバイスの能力チェック
00218         DiDevCaps.dwSize = sizeof(DiDevCaps);
00219         hr = this->m_lpDInputDevice->GetCapabilities(&DiDevCaps);
00220         if(FAILED(hr))
00221                 return DXTRACE_ERR_MSGBOX("Input:DeviceCondition:DevCaps",hr);
00222 
00223         return D3D_OK;
00224 }
00225 
00226 //============================================================================
00227 //インターフェイス自体の設定
00228 //引数                :デバイスのボタンなどのインスタンス
00229 //戻り値     :エラーコード
00230 //処理概要  :
00231 //                       EnumAxesCallback()から呼ばれる
00232 //                       デバイスから列挙されたオブジェクト(ボタン、軸など)をの設定を行う
00233 //============================================================================
00234 HRESULT CDirectInput::DeviceAxes(LPCDIDEVICEOBJECTINSTANCE lpDdoInst)
00235 {
00236         HRESULT hr;
00237         DIPROPRANGE diprp;
00238         DIPROPDWORD diprop;
00239 
00240         ZeroMemory(&diprp,sizeof(diprp));
00241         ZeroMemory(&diprop,sizeof(diprop));
00242         if(GET_DIDEVICE_TYPE(this->m_DiInst.dwDevType) == DI8DEVTYPE_MOUSE)
00243         {
00244 
00245                 //軸の値モード
00246                 diprop.diph.dwSize                      = sizeof(diprop);
00247                 diprop.diph.dwHeaderSize        = sizeof(diprop.diph);
00248                 diprop.diph.dwObj                       = 0;
00249                 diprop.diph.dwHow                       = DIPH_DEVICE;
00250         //      diprop.dwData                           = DIPROPAXISMODE_ABS;   //絶対値モードの場合
00251                 diprop.dwData                           = DIPROPAXISMODE_REL;   //相対値モード
00252                 hr = this->m_lpDInputDevice->SetProperty(DIPROP_AXISMODE,&diprop.diph);
00253                 if(FAILED(hr))
00254                         return DXTRACE_ERR_MSGBOX("DeviceAxes¥nSetPrperty",hr);
00255         }
00256         else
00257         {
00258                 if(
00259                         lpDdoInst->guidType == GUID_XAxis ||
00260                         lpDdoInst->guidType == GUID_YAxis ||
00261                         lpDdoInst->guidType == GUID_ZAxis ||
00262                         lpDdoInst->guidType == GUID_RxAxis ||
00263                         lpDdoInst->guidType == GUID_RyAxis ||
00264                         lpDdoInst->guidType == GUID_RzAxis
00265                         )
00266                 {
00267 
00268                         //軸の最大値
00269                         diprp.diph.dwSize = sizeof(diprp);
00270                         diprp.diph.dwHeaderSize = sizeof(diprp.diph);
00271                         diprp.diph.dwObj = lpDdoInst->dwType;
00272                         diprp.diph.dwHow = DIPH_BYID;
00273                         diprp.lMin = -1000;//SHRT_MIN;//shortの最小値
00274                         diprp.lMax = 1000;//SHRT_MAX;//shortの最大値
00275                         hr = this->m_lpDInputDevice->SetProperty(DIPROP_RANGE,&diprp.diph);
00276                         if(FAILED(hr))
00277                                 return DXTRACE_ERR_MSGBOX("DeviceAxes¥nSetPrperty",hr);
00278                 }
00279         }
00280         return D3D_OK;
00281 }
00282 
00283 //============================================================================
00284 //バッファリングデータの取得
00285 //引数                :受け取るバッファのデータ
00286 //                      :データ取得数
00287 //戻り値     :エラーコード
00288 //処理内容  :
00289 //                              個々のデバイス状態の取得
00290 //============================================================================
00291 HRESULT CDirectInput::GetState(DIDEVICEOBJECTDATA *DiDevData,DWORD *dwItemNum)
00292 {
00293         HRESULT hr;
00294         //============================================
00295         // デバイスの直接データを取得する
00296         //============================================
00297         hr = this->m_lpDInputDevice->Poll();
00298         if (FAILED(hr))
00299         {
00300                 hr = this->AcquireDevice(TRUE);
00301                 while (hr == DIERR_INPUTLOST)
00302                         hr = this->AcquireDevice(TRUE);
00303         }
00304 
00305         //============================================
00306         //状態取得
00307         //============================================
00308         hr = this->m_lpDInputDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA)*(*dwItemNum),DiDevData,dwItemNum,0);
00309         if(hr == DIERR_INPUTLOST)
00310         {
00311                 while (hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED)
00312                         hr = this->AcquireDevice(TRUE);
00313         }
00314         else if(FAILED(hr))
00315         {
00316                 return DXTRACE_ERR_MSGBOX("Input¥nGetState¥nGetDeviceData",hr);//データが読めない
00317         }
00318 
00319         return hr;
00320 }
00321 
00322 /*
00323 //============================================================================
00324 //バッファリングデータの取得
00325 //引数                :イベントの処理をする関数へのポインタ
00326 //                      :データ取得数
00327 //                      :常にNULLを指定(アクションマッピング用)
00328 //戻り値     :成否、データ無し
00329 //処理内容  :
00330 //                              個々のデバイス状態の取得
00331 //============================================================================
00332 HRESULT CDirectInput::GetState(CONTROL_EVENT fnKey,DWORD dwItemNum,LPDIRECTINPUTDEVICE8 lpDIdevice)
00333 {
00334         DWORD dwItem;
00335 
00336         //============================================
00337         //アクションマップ用処理
00338         //============================================
00339         if(lpDIdevice == NULL)
00340                 lpDIdevice = this->m_lpDInputDevice;
00341 
00342         while(true)
00343         {
00344                 HRESULT hr;
00345                 DIDEVICEOBJECTDATA od;          //取得データがここにはいる
00346                 dwItem = dwItemNum;
00347 
00348                 //============================================
00349                 //状態取得
00350                 //============================================
00351                 hr = lpDIdevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&od,&dwItem,0);
00352                 if(hr == DIERR_INPUTLOST)
00353                         lpDIdevice->Acquire();                  //アクセスを再許可
00354                 else if(FAILED(hr) || dwItem <= 0)
00355                 {
00356                         return DXTRACE_ERR_MSGBOX("Error",hr);//データが読めないか、ない。
00357                 }
00358                 else
00359                 {
00360                         //============================================
00361                         //イベントの処理
00362                         //============================================
00363                         fnKey(od);
00364                         break;
00365                 }
00366         }
00367 
00368         return D3D_OK;
00369 }
00370 */

FPStestに対してWed Nov 14 09:55:20 2007に生成されました。  doxygen 1.5.2