十字ボタンのデータについて

このQ&Aのポイント
  • ジョイスティックからのデータの受け取りで、十字ボタンからのデータを、うまく認識してくれません。
  • ポリゴン一つ表示させているのですが、十字ボタンを押していないのに勝手に下側に動き出してしまうのです。
  • この十字ボタンがうまく動かない現象どうかご教授おねがいします。
回答を見る
  • ベストアンサー

十字ボタンのデータについて

連続して質問して申し訳ありませんがどうか質問させてください。 早速ですがDirectInputのモジュールを作っているんですが、 ジョイスティックからのデータの受け取りで、 各ボタンは問題ないのですが、十字ボタンからのデータを、 うまく認識してくれません。 ●Input.h --省略-- class Input{ public: BOOL JoyData(int ButtonNo); BOOL UP() {return JoyData(0);} BOOL DOWN() {return JoyData(1);} }; ●Input.cpp BOOL Input::JoyData(int No) { DIJOYSTATE2 js; m_pJoystick->Acquire(); m_pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js); switch(ButtonNo){ case 0: if(js.lY < 0) return TRUE; // Up break; case 1: if(js.lY > 0) return TRUE; // DOWN break; } } ●Main.cpp HRESULT hr; if( FAILED( hr = CMyD3DApplication::FrameMove(fElapsedTime))) return hr; D3DXMATRIX matWorld; D3DXMATRIX matRotY; D3DXMATRIX matRotX; m_DInput.JoyUpdate(); if(m_DInput.UP()) m_fWorldRotX += m_fElapsedTime * 0.5f; //UP if(m_DInput.DOWN()) m_fWorldRotX -= m_fElapsedTime * 0.5f; //DOWN D3DXMatrixRotationX( &matRotX, m_fWorldRotX ); ポリゴン一つ表示させているのですが、十字ボタンを押していないのに勝手に 下側に動き出してしまうのです。 十字ボタンはどの様な値でゲームパッドからデータを受け取っているのでしょうか この十字ボタンがうまく動かない現象どうかご教授おねがいします。

  • nVIDIA
  • お礼率46% (520/1121)

質問者が選んだベストアンサー

  • ベストアンサー
  • aho0xff
  • ベストアンサー率12% (218/1772)
回答No.1

いい加減に物言うと、まあ大体のジョイパットって、入力値に微妙なゴミの 値が必ずと言っていいほど入るので、 if(js.lY < 0) return TRUE; // Up とかみたいに 0 で判定取るのはよくないです。 デバックで常にどんな値が入っているか確認してみてください。 定まっていないはずです。 まあ初期化時の軸範囲次第ですが、軸範囲が 10000 なら 2000 ~ 4000 位で取ると 良いかもです。 まあどうしても 0 でやりたいと言うのなら DirectInput の初期化時にデットゾーンを指定してみてください。 DIPROP_DEADZONE がキーワードです。 ただ、デットゾーンに関してはなんか上手いこと簡単な資料がぱっと 見つからないんですよ。コレが 参考URLはMSDNです。 簡単にやるやら、0 で判定しないのが楽です。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/input/using/devices/deviceproperties

関連するQ&A

  • error C2679 がとれません><

    HRESULT hr; if( FAILED( hr = CMyD3DApplication::FrameMove(fElapsedTime))) return hr; D3DXMATRIX matWorld; D3DXMATRIX matRotY; D3DXMATRIX matRotX; m_DInput.JoyUpdate(); if(m_DInput.UP()) matRotX += fElapsedTime * 0.5f; D3DXMatrixRotationX( &matRotX, m_fWorldRotX ); D3DXMatrixRotationY( &matRotY, m_fWorldRotY ); D3DXMatrixMultiply( &matWorld, &matRotX, &matRotY ); m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld ); リファレンスを参考に3Dを動かすコードを打ちましが、 最後次のエラーがなかなか取れません。 構文もミスはないし、あちこちを調べましたが原因が分かりません。 どうか対処方法をおしえてください。 問題のコンパイルエラー error C2679: 二項演算子 '+=' : 型 'float' の右オペランドを扱う演算子が見つかりません (または変換できません)。

  • DirectInput でのエラー

    LPDIRECTINPUT8 m_pDI; LPDIRECTINPUTDEVICE8 m_pJoystick; 省略 // ゲームコントローラーの列挙 if(FAILED(hr = m_pDI->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumJoysticksCalback, NULL, DIEDFL_ATTACHEDONLY))) return hr; //********************************************************/ BOOL CALLBACK InputDevice::EnumJoysticksCallback(const DIDEVICEINSTANCE* pdidInstance, VOID* pContext ) { HRESULT hr; hr = m_pDI->CreateDevice(pdidInstance->guidInstance, &m_pJoystick, NULL); if(FAILED(hr)){ return DIENUM_CONTINUE; }else{ return DIENUM_STOP; } } ゲームコントローラーの列挙をするためのコードを msdn や DirectXSDK のサンプルを 参考に書きました。でもどうしても以下のようなエラーがでます。 キャストなど試してみましたが解決にはいたりませんでした。 どうかご教授おねがいします。 d:\○○△△.cpp(30) : error C2664: 'IDirectInput8A::EnumDevices' : 2 番目の引数を 'BOOL (const DIDEVICEINSTANCE *,void *)' から 'LPDIENUMDEVICESCALLBACKA' に変換できません。

  • 描画について

    サイズを綺麗に描画したいのですが(サイズの範囲(rightとbottom)が微妙にずれている)どうしたら描画できるでしょうか? ここら辺かな?と思うところを載せます。 HRESULT ReadBMP(ID3DXSprite** g_pSprite,LPCTSTR lpszFilename,DDXTEX* g_pTexture) { HRESULT hr = S_FALSE; UINT uLevel = 0; IDirect3DSurface9* pSurface = NULL; lstrcpy(g_pTexture->m_Filename,lpszFilename); g_pTexture->m_clrAlpha=g_colorKey; g_pTexture->m_pTexture=NULL; // スプライト情報の生成 if (SUCCEEDED(hr)) hr = ::D3DXCreateSprite(g_pd3dDevice, g_pSprite); if (SUCCEEDED(hr)) hr = ::D3DXCreateTextureFromFileEx(g_pd3dDevice, g_pTexture->m_Filename, 680, 460, 1, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, g_pTexture->m_clrAlpha, NULL, NULL, &g_pTexture->m_pTexture); if (SUCCEEDED(hr)) hr = g_pTexture->m_pTexture->GetSurfaceLevel(uLevel, &pSurface); // サーフェイス取得 if (SUCCEEDED(hr)) hr = pSurface->GetDesc(&g_sSurfaceInfo); if (pSurface != NULL) pSurface->Release(); pSurface = NULL; // 失敗したら破棄 if (FAILED(hr)) DestroySplite(*g_pSprite,g_pTexture); return hr; } よろしくお願いします。

  • MFC CSplitter内にコントロールを表示させるには

    Viewクラスを作り中に表示させる方法はわかったのですが、 分割ウィンドウ内にListCtrlなどを表示させるにはどうすればいいのでしょうか? コンパイルはできるのですが、afxcmn.inl Line:266の ASSERT(::IsWindow(m_hWnd));でエラーが出てしまいます。 何がいけないのか教えてください。お願いします。 //.h CSplitterWnd m_wndSplitter; virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); //.cpp BOOL CWnd::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CListCtrlA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlB) ,CSize( 200,300),pContext)) return FALSE; }

  • ボタンを画像に変更したい

    iframe内のコンテンツを親からスクロールさせる URLを参考に http://moto-mono.net/2009/07/10/scroll-content-is-contained-in-iframe.html のデモのように、なんとか出来ましたが、ボタンを押下して上下のスクロールしているので、画像を配置し、上下にスクロールできるようにしたいのです。 <input type="button" id="down" value="↑" /> <input type="button" id="up" value="↓" /></p> ↓とやってみたのですが出来ませんでした。 <img id="up" src="up.jpg" alt=""> <img id="doun" src="doun.jpg" alt=""> ボタンでなければ、出来ないのでしょうか? 出来なければ、ボタンを画像のように見せる方法はありますか?

  • Directxについて

    1つご教授お願い申したいのですが、 HRESULT DrowInitialize(HWND hWnd) { LPDIRECT3D9 g_pD3D; D3DPRESENT_PARAMETERS g_D3DPP; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); if(g_pD3D==NULL) { return S_FALSE; } ZeroMemory(&g_D3DPP,sizeof(g_D3DPP)); g_D3DPP.Windowed =TRUE; g_D3DPP.SwapEffect =D3DSWAPEFFECT_DISCARD; g_D3DPP.BackBufferFormat = D3DFMT_UNKNOWN; HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { hr =g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&g_D3DPP,&pd3dDevice); if(FAILED(hr)) { return S_FALSE; } } } return S_OK; } なのですが、これが通らなくて困っています。(S_FALSEを通ってしまいます)S_OKを通るにはどうしたらいいのでしょうか。わかる方いらしたらよろしくお願いします。

  • DirectXを用いたActiveXを用いてVistaで情報が取れない

    ActiveXからDirectXを叩いてOSやCPUなどの情報を 取得しようとしています。 XPでは問題なく情報が取れますが、Vistaでは 情報が取れる項目と取れない項目があります。 この現象について、教えてください。 APIは正常に終了しています。 OS(szOSExLongEnglish) → 正常取得 ベンダー(szSystemManufacturerEnglish) → n/a 型番(szSystemModelEnglish) → n/a CPU(szProcessorEnglish) → (空白) 物理メモリ(szPhysicalMemoryEnglish)  → 正常取得 IEのデフォルトの設定では上記のような状態ですが、 設定を変えて保護モードを外すと正常動作し、 すべての情報が取得できます。 しかし、保護モードが有効の状態で、 情報取得したいです。 以下にコードを書きます。 ※このコードはあるサンプルソースをほとんどそのまま使っています。 //////////////////////////////////////////////////////////////////////////////// // 初期化 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::Init(void) { HRESULT hr; DXDIAG_INIT_PARAMS dxDiagInitParam; m_pDxDiagProvider = NULL; m_pDxDiagRoot = NULL; g_DxDiagInfo = NULL; g_DxSoundInfo = NULL; // COMライブラリを使用できるように初期化 hr = CoInitialize(NULL); if (FAILED(hr)) { return false; } hr = CoCreateInstance( CLSID_DxDiagProvider, NULL, CLSCTX_INPROC_SERVER, IID_IDxDiagProvider, (LPVOID*) &m_pDxDiagProvider); if( FAILED(hr) || m_pDxDiagProvider == NULL) { return false; } // DXDIAG_INIT_PARAMSを初期化 ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) ); dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS); dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; // WHQLを確認するかどうか // ネットを経由するので基本的にはfalseにしておく dxDiagInitParam.bAllowWHQLChecks = AllowWHQLChecks; dxDiagInitParam.pReserved = NULL; hr = m_pDxDiagProvider->Initialize( &dxDiagInitParam ); if( FAILED(hr) ) { return false; } hr = m_pDxDiagProvider->GetRootContainer( &m_pDxDiagRoot ); if( FAILED(hr) ) { return false; } return true; } //////////////////////////////////////////////////////////////////////////////// // DxDiag でSystem情報を取得 //////////////////////////////////////////////////////////////////////////////// bool CDxDiagLib::GetSyatemInfo( void ) { HRESULT hr; IDxDiagContainer* pObject = NULL; DWORD nInstanceCount = 0; DWORD nItem = 0; DWORD nCurCount = 0; // "DxDiag_SystemInfo" を取得 if( FAILED( hr = m_pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject ) ) ) { return false; } // 情報保存領域の確保 ZeroMemory(&g_DxDiagSysInfo, sizeof(g_DxDiagSysInfo)); if( FAILED( hr = GetStringValue( pObject, L"szOSExLongEnglish", g_DxDiagSysInfo.cOS , sizeof(g_DxDiagSysInfo.cOS) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemManufacturerEnglish", g_DxDiagSysInfo.cManufacturer , sizeof(g_DxDiagSysInfo.cManufacturer) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szSystemModelEnglish", g_DxDiagSysInfo.cModel , sizeof(g_DxDiagSysInfo.cModel) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szProcessorEnglish", g_DxDiagSysInfo.cProcessor , sizeof(g_DxDiagSysInfo.cProcessor) ) ) ) { SAFE_RELEASE( pObject ); return false; } if( FAILED( hr = GetStringValue( pObject, L"szPhysicalMemoryEnglish", g_DxDiagSysInfo.cMemory , sizeof(g_DxDiagSysInfo.cMemory) ) ) ) { SAFE_RELEASE( pObject ); return false; } SAFE_RELEASE( pObject ); return true; } よろしくお願いいたします。

  • ラジオボタンのNullチェック

    ラジオボタンがひとつもチェックが入ってない時にエラーを出したいのですがうまくいきません。 <script language="JavaScript1.2"> function chk_Riyu(){ for(idRadio=0; idRadio<frmEntry.optRiyu.length; idRadio++){ if(frmEntry.optRiyu[idRadio].checked) { return true; break; } alert("チェックされてません"); return false; } } </script> <form name="frmEntry" action="aaa.htm" method="post"> <input type="submit" value="理由" onclick="return chk_Riyu()"> <input type="Radio" name="optRiyu" value="1">あああ</td> <input type="Radio" name="optRiyu" value="2">いいい</td> <input type="Radio" name="optRiyu" value="3">ううう</td> このソースだと、一度目はチェックにひっかかるのですが、再度ラジオボタンにチェックを入れて理由ボタンを押してもエラーになってしまいます。 どこかおかしいところがありましたら教えていただけないでしょうか。 すみませんが宜しくお願いいたします。

  • プロパティーシートでOKボタンを押しても終わらなくするには?

    VC++ Ver6.0  プロパティーシートを使用した場合に自動で表示されるOK、キャンセルのボタンで、OK処理を実行した時は継続して処理を行う事はできないのでしょうか? キャンセル処理だけ終わるようにしたいのです。 BOOL CTESTApp::InitInstance() { AfxEnableControlContainer(); //省略 CPSheet Dialog("テストタイトル"); m_pMainWnd = &Dialog; if (Dialog.DoModal() == IDOK) { // [OK]が押されたときの処理 //処理後は、次のイベント待ちにしたい・・・ } else if (Dialog.DoModal() == IDCANCEL) { // [キャンセル]が押されたときの処理 //何もせず終了する(現状のまま) } return FALSE; }

  • 1つのform内に2つのsubmitボタンがあり、action属性がそれぞれで異なる場合

    一般的な検索画面で、中身はjavaで作っているのですが、 検索して結果が下に一覧で表示され、個々の結果ごとに「修正」「削除」ボタンを作っております。 結果1つを1formとして囲っておりまして、hiddenに一意に識別できるパラメータをvalueを入れて飛ばして、その結果情報を修正できたり削除できたりする機能を作っております。 修正ボタンをクリックした場合と削除ボタンをクリックした場合で呼ばれるServletが異なるのですが、うまくJavascriptを書けておりません。 以下はソースです。ちなみにこの要素の上に検索ボタンがあり、現在の挙動だとなぜか検索条件入力フォームチェック用のJSが呼ばれてしまっております。FireFoxのプラグインに表示されるエラーには何もでませんでした。 *****JSP(view)側***** <form method="post" onSubmit="return callServlet(this)" id="mstSearchR" name="mstSearchR"> <input type="hidden" id="mdNoH" name="mdNoH" value="???????" /><br> <input type="submit" id="modify" name="modify" value=" 変更 " /> <input type="submit" id="delete" name="delete" value=" 削除 " /> </form> *****JS側***** function callServlet(caller){ caller.modify.onsubmit = function(){ flagD = this.form.modify.disabled; flag = confirm("修正しますか?"); if(flag == true){ flagD = !flagD; this.form.modify.disabled = flagD; this.form.action = "????????????????" return true; } return false; } caller.delete.onsubmit = function(){ flagD = this.form.delete.disabled; flag = confirm("削除しますか?"); if(flag == true){ flagD = !flagD; this.form.delete.disabled = flagD; this.form.action = "!!!!!!!!!!!!!!!!" return true; } return false; } }

専門家に質問してみよう