XNA メモ – XBOX以外のコントローラーの使用方法 (XNA 3.1)

Posted: 2011年8月1日 カテゴリー: プログラミングメモ, XNA, XNAメモ
タグ:, , , , , ,

このメモはXNA3.1とVisual Studio 2008でXBOX 以外のコントローラーを使う方法を説明します。

XNAではXinputでサポートされている種類以外のコントローラー(例えばPS2コントローラー)は使えません。コレにより、PC用のゲーム開発はマウス、キーボード、XBOX用コントローラに限定されるので少し面倒になります。それを解決するには基本的に、3種類の方法があります。

–          SlimDX等のライブラリを使う

–          Managed Directx(Direct Input)を使う

–          XBOX 360コントローラーのエミュレーターを使う

このメモでは、外部ライブラリを何となく使いたくなかったのでManaged Directxを使用しての再利用性のあるクラスを作る方法を残します。

 

まず、プロジェクトにMicrosoft.DirectX.DirectInputSystem.Windows.Formsの参照を足してください(System.Windows.FormsはMicrosoft.DirectX.DirectInput.Deviceクラスを初期化するために必要です)。

参照を足した後はまず、コントローラーへの参照を得るための初期化コードを書きます:

Device _pad;
JoystickState _padStates;

// 接続されている全てのゲーム用入力デバイスを獲得する
DeviceList deviceList = Manager.GetDevices( DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly );

//接続されているジョイパッドを探し、保存する

foreach ( DeviceInstance i in deviceList )
{
_pad = new Device( i.InstanceGuid );
if ( _pad )
break;
}

もしコントローラーの参照を得られれば、アナログスティックの戻り値の最高値を決めます:

// アナログスティックの戻り値の最高値を決める
foreach ( DeviceObjectInstance devObjIns in pad.Objects )
{
if ( ( devObjIns.ObjectId & (int)DeviceObjectTypeFlags.Axis ) != 0 )
    {
_pad.Properties.SetRange(ParameterHow.ById, devObjIns.ObjectId, new InputRange( -100, 100 ) );
}
}

デバイス(コントローラー)の設定を終了し、デバイスへのアクセスを取得します:

// セットアップ
_pad.Properties.AxisModeAbsolute = true;
_pad.SetCooperativeLevel( window.Handle, CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background );
_pad.Acquire();

コントローラーの設定が終了した後、フレーム毎にコントローラの状態を更新し、保存するのを忘れないようにしてください(これが入力判定に使われるので):

public void Update()
{
 _pad.Poll();
 _padStates = _pad.CurrentJoystickState;
}

入力のテスト:


if ( _padStates.GetButtons()[0] != 0 )
{
  message = "ボタン 0 が押されています"
}

コレで動かすための基本的な事は終わりですが、この時点でプログラムを実行すると例外が投げられ、ちゃんと動きませんでした。

この例外はMDA(Managed Debugging Assistant)の一部に有るLoaderLockによって投げられたものです。詳しい事は今のところわからないのですが、この例外はManaged Directxが原因みたいです。この例外を回避するには、Visual Studio上でLoaderLockを無効にします。無効にするにはメニュー上から「デバッグー>例外・・・」に行き、LoaderLockの部分のチェックを外します。

これらが全て終わったら、動くはずです(今の所PS2コントローラーでのみ確認済み)。

 

ちなみに、コントローラー用のクラスを書いた時に実際に行った作業は結構省きましたので、クラスの中身に興味が有る方はプロジェクトへのリンク置いておくので(主にバックアップ用ですが)見てみてください。あと、プロジェクト内に有るクラスは複数のコントローラーをサポートする用に書きましたが、実際にコントローラーが一つしか無かったので、今の所はテストしていません。

プロジェクトへのリンク:

http://www.mediafire.com/download.php?ew06bbiz08drcp9

追記:sourcecodeと/sourcecodeを使用してソースコード貼り付けた時のインデント方法を知っている方が居たらコメントください m_ _m

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中