このメモはXNA3.1とVisual Studio 2008でXBOX 以外のコントローラーを使う方法を説明します。
XNAではXinputでサポートされている種類以外のコントローラー(例えばPS2コントローラー)は使えません。コレにより、PC用のゲーム開発はマウス、キーボード、XBOX用コントローラに限定されるので少し面倒になります。それを解決するには基本的に、3種類の方法があります。
– SlimDX等のライブラリを使う
– Managed Directx(Direct Input)を使う
このメモでは、外部ライブラリを何となく使いたくなかったのでManaged Directxを使用しての再利用性のあるクラスを作る方法を残します。
まず、プロジェクトにMicrosoft.DirectX.DirectInput とSystem.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