現在、ゲームコントローラを使ったアプリの作成を行っています。
まず、XBox360コントローラをPCに接続し、DirectInputを使用して
スティックや、ボタンの状態を取得することはできました。
(ハットスイッチのみ取得できません。(^_^;))
次にWiiコントローラをBluetoothでPCと接続し、
Wiiコントローラのセンサの状態の取得を試みましたが
うまく出来ませんでした。
(Wiiコントローラのデバイスクラスは周辺機器(ジョイスティック)と
認識されています。)
XBox360のコントローラと同じように値を取得することはできないのでしょうか?
ご教授御願い致します。
自己レスです。
その後、調べたところ、
1. http://paken.s1.hayasoft.com/down/denno2007.html
や
2. http://wiiyourself.gl.tter.org/
に説明が記載されておりました。
そこで、「1.」の「Wiiリモコンをもう一回見直してみます。」を参考にしながら、
プロジェクト名を「WiiControl」を作成し、Wiiコントローラ制御用のクラス
「WiiRemote」を追加し、「WiiRemote.cpp」を以下の様に作成しました。
****************************************************************
// WiiRemote.cpp : 実装ファイル
//
#include stdafx.h
#include <hidsdi.h>
#include <setupapi.h>
#include WiiControl.h
#include WiiRemote.h
// CWiiRemote
IMPLEMENT_DYNAMIC(CWiiRemote, CWnd)
CWiiRemote::CWiiRemote()
{
}
CWiiRemote::~CWiiRemote()
{
}
BEGIN_MESSAGE_MAP(CWiiRemote, CWnd)
END_MESSAGE_MAP()
// CWiiRemote メッセージ ハンドラ
int CWiiRemote::WiiRemoteInit(void)
{
GUID device_id;
HidD_GetHidGuid(&device_id);
return 0;
}
****************************************************************
この状態でコンパイルを行ったところ
1>WiiRemote.obj : error LNK2001: 外部シンボル "void __stdcall HidD_GetHidGuid
(struct _GUID *) (?HidD_GetHidGuid@@YGXPAU_GUID@@@Z) は未解決です。
1>C:\WiiControl\Debug\WiiControl.exe : fatal error LNK1120: 外部参照 1 が未解決
です。
1>ビルドログは file://c:\iiControl\WiiControl\Debug\BuildLog.htm に保存されま
した。
とのエラーが発生しました。
現在、以下の作業・設定は完了しています。
1.WDKのダウンロード・インストール
2.VCの「ツール」→「オプション」→「プロジェクトおよびソリューション」
→「VC++ディレクトリ」内のインクルードファイル・ライブラリファイル
にWDKのパスを追加
エラーを取るにはどうすればよろしいのでしょうか?
ご教授御願い致します。
リンカの追加の依存ファイルに ***.lib を追加するとか必要はないでしょうか?
リンク先を見る限りsetupapi.libとhid.libの
ライブラリリンクが必要なようですね。
setupapi.libはPlatformSDKにあるけど
hid.libはDDKのライブラリのようですね。
>Blue様・subaru様
有り難う御座います。
「プロジェクト」→「WiiControlのプロパティ」→「構成プロパティ」→「リンカ」
→「入力」→「追加の依存ファイル」
内にhid.libとsetupapi.libを追加しましたが、変化なしでした。
また、
#include stdafx.h
の前に
# pragma comment(lib, setupapi.lib)
# pragma comment(lib, hid.lib)
も追加してみましたが、エラー発生は変わりませんでした。
また、自己レスです。すいません。
#include stdafx.h
#include <hidsdi.h>
#include <setupapi.h>
#include WiiControl.h
#include WiiRemote.h
を
#include stdafx.h
#include <setupapi.h>
extern C {
#include hidsdi.h
}
#include WiiControl.h
#include WiiRemote.h
のように変更したらコンパイルは通りました。
有り難う御座いました。
引き続き、Wiiコントローラのセンサ値取得を行っていきます。
追加質問ですが、
>まず、XBox360コントローラをPCに接続し、DirectInputを使用して
>スティックや、ボタンの状態を取得することはできました。
>(ハットスイッチのみ取得できません。(^_^;))
ハットスイッチの値はDirectInputでは取得できないのでしょうか?
void CDirectInput::KeyCheck(void)
{
DIJOYSTATE2 dijs;
HRESULT hr;
if (g_pDIDev) {
hr = g_pDIDev->Poll();
if (FAILED(hr))
{
g_pDIDev->Acquire();
}
hr = g_pDIDev->GetDeviceState(sizeof(DIJOYSTATE2), &dijs);
if (SUCCEEDED(hr))
{
SendMessage(g_hWnd,WM_JOYSTIC_OK,(WPARAM)&dijs,0);
} else if (hr==DIERR_INPUTLOST) {
g_pDIDev->Acquire();
}
}
}
上記の様に作成し、GetDeviceState()でXboxコントローラの値を取得したところ
ハットスイッチ(POV)のみ取得できませんでした。
dijs.rgdwPOVの値が「4294967295」と不定になっているようです。
ハットスイッチはその他のスイッチ・ボタンを取得方法が
違うのでしょうか?
宜しく御願い致します。
Xbox コントローラ向けには XInput という新しい API があります。
Xbox コントローラ専用と言うわけではなく、Microsoft は DirectInput を XInput に置
き換えていくつもりのようで、Xbox コントローラはその対応第一弾ということかと思い
ますが。
で、Wikipedia
http://ja.wikipedia.org/wiki/DirectInput
によると、
> Xbox 360用コントローラーとマイクロソフトのデフォルトのドライバでDirectInputを
使う場合、XInputと比較して以下の制約がある。
> 左右のトリガーは単一のデジタルな方向として動作し、独立したアナログの軸としては
動作しない。
というのがありますが、これでしょうか?
Xbox360コントローラーの純正ドライバはハットスイッチをサポートしていない(割り当
てられていない)のでは?
トリガの話は、純正ドライバでは左右のトリガが同じスライダの+方向と-方向とに割り
当てられるため左右同時押しが認識できないということです。レースゲームなんかでは
けっこう致命的ですね。
ごめんなさい。
DirectInputでXbox360コントローラー(+純正ドライバ)の十字キーはPOVであってまし
た。
> dijs.rgdwPOVの値が「4294967295」と不定になっているようです。
16進で0xFFFFFFFFですから、十字キーが押されて無い状態の正常値にも見えます。
aetos様・ISLe様有り難う御座います。
十字キーの上を押下した状態で「GetDeviceState()」を行っても
dijs.rgdwPOVの値は全て「4294967295」となっています。
十字キーを使用するときはEnumObjects関数や、EnumDevices関数などで
「十字キーを使用する」といった設定が必要なのでしょうか?