りりむの気まぐれ日記 2.0でタグ「DirectX c# Managed」が付けられているもの
DirectX 9 SDKを入れてみた。
時代はC#ということで、Managed DirectXを試してみる。
unmanagedの方は触ったことないので、初DirectX。
ゲームパッドの入力取るところからはじめてみることに。
これが結構てこずった。
結論からすると、ネット上のサンプルで、ほとんど取得は出来てたんだけど、
どこの値見ればいいのかとか、詳しく乗ってなくて困った。
//============================================
// ゲームコントローラ デバイスリスト取得
DirectInput.DeviceList diDeviceList = DirectInput.Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
Guid instanceGuid = Guid.Empty;
Guid ffDriverGuid = Guid.Empty;
foreach (DeviceInstance di in diDeviceList)
{
// コントローラのGuid取得。複数あるときの方法考えないと。
ffDriverGuid = di.FFDriverGuid;
instanceGuid = di.InstanceGuid;
}
// コントローラデバイス初期化
DirectInput.Device game_diDevice = new Device(instanceGuid);
// コントローラとの協調性の設定
game_diDevice.SetCooperativeLevel(null, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.NoWindowsKey);
// データ書式を、Joystickにする
game_diDevice.SetDataFormat(DeviceDataFormat.Joystick);
// コントローラ内すべてのobjectについてループ。ボタン、軸
foreach (DirectInput.DeviceObjectInstance doi in game_diDevice.Objects)
{
// アナログ方向キーのレンジを、-1000~1000にする。
if ((doi.ObjectId & (Int32)Microsoft.DirectX.DirectInput.DeviceObjectTypeFlags.Axis) != 0)
{
game_diDevice.Properties.SetRange(
Microsoft.DirectX.DirectInput.ParameterHow.ById,
doi.ObjectId,
new Microsoft.DirectX.DirectInput.InputRange(-1000, 1000));
}
}
// 絶対値で取得
game_diDevice.Properties.AxisModeAbsolute = true;
// 監視開始
game_diDevice.Acquire();
//==============================================
ここまでが初期化部分。
んで、
//==============================================
// ゲームデバイスはState取得前に、Poll実施
game_diDevice.Poll();
JoystickState diJoystickState = game_diDevice.CurrentJoystickState;
// ボタン
// Id1が押されていると、buttons[0]=128 となる。押されてないとbuttons[0]=0
Byte[] buttons = diJoystickState.GetButtons();
// ビュースイッチ pointoObView[0] に数値が入る。上が0 右回り45度毎に4500増加
Int32[] pointObView = diJoystickState.GetPointOfView();
//==============================================
この部分を、ループで取得すれば、パッドの状態がわかるっと。
てこずったのは、十字キーとアナログスティックの入力。
持ってるゲームパッドには、十字キーと、アナログスティックが2個付いてる。
どこで3つの入力がわかるんだろう??
いろいろいじってたら、デフォルトでは、
十字キー = ビュースイッチ(POV) となっているようだ。
なので、pointObViewで取得できた。
アナログスティックは、2つではなく、 2軸x2の4軸として扱うようだ。
// 左側スティック
diJoysticState.X
diJoysticState.Y
// 右側スティック
diJoysticState.Z
diJoysticState.Rz
X軸、Y軸 Z軸 は、直交座標系だろうけど、Z回転 なんてのは初耳。
Z軸固定しての回転する方向??
という認識で合ってるのかしら(´・ω・`)?
数学っぽい内容は、画像描画に移った頃にでも。。
さて、次は、うちのパッドぶるぶる機能もあるので、
フォースフィードバックの方法調べよう。
時代はC#ということで、Managed DirectXを試してみる。
unmanagedの方は触ったことないので、初DirectX。
ゲームパッドの入力取るところからはじめてみることに。
これが結構てこずった。
結論からすると、ネット上のサンプルで、ほとんど取得は出来てたんだけど、
どこの値見ればいいのかとか、詳しく乗ってなくて困った。
//============================================
// ゲームコントローラ デバイスリスト取得
DirectInput.DeviceList diDeviceList = DirectInput.Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly);
Guid instanceGuid = Guid.Empty;
Guid ffDriverGuid = Guid.Empty;
foreach (DeviceInstance di in diDeviceList)
{
// コントローラのGuid取得。複数あるときの方法考えないと。
ffDriverGuid = di.FFDriverGuid;
instanceGuid = di.InstanceGuid;
}
// コントローラデバイス初期化
DirectInput.Device game_diDevice = new Device(instanceGuid);
// コントローラとの協調性の設定
game_diDevice.SetCooperativeLevel(null, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.NoWindowsKey);
// データ書式を、Joystickにする
game_diDevice.SetDataFormat(DeviceDataFormat.Joystick);
// コントローラ内すべてのobjectについてループ。ボタン、軸
foreach (DirectInput.DeviceObjectInstance doi in game_diDevice.Objects)
{
// アナログ方向キーのレンジを、-1000~1000にする。
if ((doi.ObjectId & (Int32)Microsoft.DirectX.DirectInput.DeviceObjectTypeFlags.Axis) != 0)
{
game_diDevice.Properties.SetRange(
Microsoft.DirectX.DirectInput.ParameterHow.ById,
doi.ObjectId,
new Microsoft.DirectX.DirectInput.InputRange(-1000, 1000));
}
}
// 絶対値で取得
game_diDevice.Properties.AxisModeAbsolute = true;
// 監視開始
game_diDevice.Acquire();
//==============================================
ここまでが初期化部分。
んで、
//==============================================
// ゲームデバイスはState取得前に、Poll実施
game_diDevice.Poll();
JoystickState diJoystickState = game_diDevice.CurrentJoystickState;
// ボタン
// Id1が押されていると、buttons[0]=128 となる。押されてないとbuttons[0]=0
Byte[] buttons = diJoystickState.GetButtons();
// ビュースイッチ pointoObView[0] に数値が入る。上が0 右回り45度毎に4500増加
Int32[] pointObView = diJoystickState.GetPointOfView();
//==============================================
この部分を、ループで取得すれば、パッドの状態がわかるっと。
てこずったのは、十字キーとアナログスティックの入力。
持ってるゲームパッドには、十字キーと、アナログスティックが2個付いてる。
どこで3つの入力がわかるんだろう??
いろいろいじってたら、デフォルトでは、
十字キー = ビュースイッチ(POV) となっているようだ。
なので、pointObViewで取得できた。
アナログスティックは、2つではなく、 2軸x2の4軸として扱うようだ。
// 左側スティック
diJoysticState.X
diJoysticState.Y
// 右側スティック
diJoysticState.Z
diJoysticState.Rz
X軸、Y軸 Z軸 は、直交座標系だろうけど、Z回転 なんてのは初耳。
Z軸固定しての回転する方向??
という認識で合ってるのかしら(´・ω・`)?
数学っぽい内容は、画像描画に移った頃にでも。。
さて、次は、うちのパッドぶるぶる機能もあるので、
フォースフィードバックの方法調べよう。
DirectInputの続きを読む
2008/01/22以前のコンテンツは2008/01/22以前のアーカイブのページで見られます。
