DirectInput

| | コメント(0) | トラックバック(0)
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軸固定しての回転する方向??
という認識で合ってるのかしら(´・ω・`)?

数学っぽい内容は、画像描画に移った頃にでも。。

さて、次は、うちのパッドぶるぶる機能もあるので、
フォースフィードバックの方法調べよう。

コントローラ内Objectのループのところで、
軸のレンジ設定してるけど、軸入力だけに絞る方法、コッチのほうがかっこいいなぁ。
変なbit計算もいらないし。

// コントローラ内のobjectについてループ。軸のみ。
foreach (DirectInput.DeviceObjectInstance doi in game_diDevice.GetObjects(DeviceObjectTypeFlags.Axis))
{
   // アナログ方向キーのレンジを、-1000~1000にする。
     game_diDevice.Properties.SetRange(
         Microsoft.DirectX.DirectInput.ParameterHow.ById,
         doi.ObjectId,
         new Microsoft.DirectX.DirectInput.InputRange(-1000, 1000));
}



トラックバック(0)

このブログ記事を参照しているブログ一覧: DirectInput

このブログ記事に対するトラックバックURL: http://www.lirim.net/mt/mt-tb.cgi/7

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、Lirimが2008年7月 1日 00:01に書いたブログ記事です。

ひとつ前のブログ記事は「懲りずに.mono」です。

次のブログ記事は「ForceFeedBack」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2008/01/22以前のコンテンツは2008/01/22以前のアーカイブのページで見られます。

Powered by Movable Type 4.01a