前提・実現したいこと
環境:64bit版windows10,VC++2019,DirectX SDK(2010)を利用
最終的にDirectInputでコマンドプロント上にジョイスティックのデータを表示しながら、ボタンを押すことでフォースフィードバックを行うプログラムを作ることを目標に設定。
まずDirectInputの練習もかねて、1秒ごとにコマンドプロント上にジョイスティックの情報の表示を行いたいと考えていました。
発生している問題・エラーメッセージ
DirectX9実践プログラミングという本を参考に以下の様なコードを書いてみましたが、最初のインターフェースの取得の時点で ”オブジェクトの作成に失敗” と表示され、IDirectInput8インターフェースの取得すらできていない状態です。まだプログラミングについての知識が浅く、書き方に問題があるせいだと思うのですが、DirectInput関連の本を読んでも原因がよく分からなった為質問させて頂きました。 またその他書き方として不味い点などがあれば教えていただけると幸いです。
該当のソースコード
c++
1 2#include <iostream> 3 4#define STRICT 5#define DIRECTINPUT_VERSION 0x0800 6 7#include <windows.h> 8#include <crtdbg.h> 9 10#pragma warning( disable : 4996 ) // 警告を一時的に無効にする 11#include <strsafe.h> 12#pragma warning( default : 4996 ) 13 14#include <dinput.h> 15#include <dxerr.h> 16 17 18#define SAFE_RELEASE(x) {if(x){(x)->Release();x=NULL;}} 19 20// 必要なライブラリをリンクする 21#pragma comment( lib, "dinput8.lib" ) 22#pragma comment( lib, "dxerr.lib" ) 23#pragma comment( lib, "dxguid.lib" ) 24 25 26HWND hWlg; 27HINSTANCE hInstApp; // インスタンス・ハンドル 28 29// DirectInputの変数 30LPDIRECTINPUT8 g_pDInput = NULL; // DirectInput 31LPDIRECTINPUTDEVICE8 g_pDIDevice = NULL; // DirectInputデバイス 32LPDIRECTINPUTEFFECT g_pDIEffect = NULL; // エフェクト 33DIDEVCAPS g_diDevCaps; // ジョイスティックの能力 34#define DIDEVICE_BUFFERSIZE 100 // デバイスに設定するバッファ・サイズ 35 36 37BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext); 38BOOL CALLBACK EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef); 39 40int main() 41{ DIJOYSTATE2 dijs; 42 HWND hWlg = GetConsoleWindow(); 43 HRESULT hr; 44 45 // IDirectInput8の作成 46 hr = DirectInput8Create(hInstApp, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDInput, NULL); 47 // 48 if (FAILED(hr)) 49 { 50 printf("オブジェクト作成に失敗\n"); 51 return -1; 52 } 53 54 // ジョイスティックの列挙 55 hr = g_pDInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, NULL, 56 DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY); 57 if (FAILED(hr) || g_pDIDevice == NULL) { 58 printf("デバイスオブジェクト作成に失敗\n"); 59 g_pDInput->Release(); 60 return -1; 61 } 62 //データ設定およびモードを設定(フォアグラウンド&排他モード) 63 g_pDIDevice->SetDataFormat(&c_dfDIJoystick2); 64 g_pDIDevice->SetCooperativeLevel(hWlg, DISCL_EXCLUSIVE | DISCL_FOREGROUND); 65 66 67 // 軸モードを設定 68 DIPROPDWORD diprop; 69 diprop.diph.dwSize = sizeof(diprop); 70 diprop.diph.dwHeaderSize = sizeof(diprop.diph); 71 diprop.diph.dwObj = 0; 72 diprop.diph.dwHow = DIPH_DEVICE; 73 diprop.dwData = DIPROPAXISMODE_ABS; 74 hr = g_pDIDevice->SetProperty(DIPROP_AXISMODE, &diprop.diph); 75 if (FAILED(hr)) 76 { 77 printf("軸モードの設定に失敗"); 78 return -1; 79 } 80 //コールバック関数を使って各軸のモードを設定 81 hr = g_pDIDevice->EnumObjects(EnumAxesCallback, NULL, DIDFT_AXIS); 82 if (FAILED(hr)) 83 { 84 printf("軸モードの設定に失敗"); 85 return -1; 86 } 87 88 // バッファリング・データを取得するため、バッファ・サイズを設定 89 diprop.dwData = DIDEVICE_BUFFERSIZE; 90 hr = g_pDIDevice->SetProperty(DIPROP_BUFFERSIZE, &diprop.diph); 91 if (FAILED(hr)) 92 { 93 printf("バッファ・サイズの設定に失敗"); 94 return -1; 95 } 96 97 hr = g_pDIDevice->Poll(); 98 hr = g_pDIDevice->Acquire(); 99 int i; 100 101 for (i = 0; i <= 10; i++) 102 { 103 hr = g_pDIDevice->GetDeviceState(sizeof(DIJOYSTATE2), &dijs); 104 printf("X = % d Y = % d Z = % d][Rx = % d Ry = % d Rz = % d Slider1 = % d Slider2 = % d\n", 105 dijs.lX, dijs.lY, dijs.lZ, 106 dijs.lRx, dijs.lRy, dijs.lRz, 107 dijs.rglSlider[0], dijs.rglSlider[1]); 108 Sleep(1000); 109 } 110 111 g_pDIDevice->Unacquire(); 112 if (g_pDIDevice != NULL)g_pDIDevice->Release(); 113 if (g_pDInput != NULL)g_pDInput->Release(); 114 115 printf("正常終了\n"); 116 return 0; 117 118} 119 120BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext) 121{ 122 HRESULT hr; 123 124 // 列挙されたジョイスティックへのインターフェイスを取得する。 125 hr = g_pDInput->CreateDevice(pdidInstance->guidInstance, &g_pDIDevice, NULL); 126 if (FAILED(hr))return DIENUM_CONTINUE; 127 128 // ジョイスティックの能力を調べる 129 g_diDevCaps.dwSize = sizeof(DIDEVCAPS); 130 hr = g_pDIDevice->GetCapabilities(&g_diDevCaps); 131 if (FAILED(hr)) 132 { 133 // ジョイスティック能力の取得に失敗 134 SAFE_RELEASE(g_pDIDevice); 135 return DIENUM_CONTINUE; 136 } 137 138 return DIENUM_STOP; // 1つ見付けたら列挙を止める 139} 140 141// ジョイスティックの軸を列挙する関数 142BOOL CALLBACK EnumAxesCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) 143{ 144 HRESULT hr; 145 146 // 軸の値の範囲を設定(-1000~1000) 147 DIPROPRANGE diprg; 148 ZeroMemory(&diprg, sizeof(diprg)); 149 diprg.diph.dwSize = sizeof(diprg); 150 diprg.diph.dwHeaderSize = sizeof(diprg.diph); 151 diprg.diph.dwObj = lpddoi->dwType; 152 diprg.diph.dwHow = DIPH_BYID; 153 diprg.lMin = -1000; 154 diprg.lMax = +1000; 155 hr = g_pDIDevice->SetProperty(DIPROP_RANGE, &diprg.diph); 156 if (FAILED(hr)) 157 return DIENUM_STOP; 158 159 return DIENUM_CONTINUE; 160} 161
試したこと
補足情報(FW/ツールのバージョンなど)
参考にしたもの
http://www.kohgakusha.co.jp/support/sdx9xpv7/index.html
のサンプルプログラム4
利用したジョイスティック
Cyborg Evo Force Joystick
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。