DirectInput APIを使用して、アプリケーションでさまざまなゲームパッドコントローラーを使用しようとしています。私の知る限り、軸はデバイス間で異なってマッピングされています。
DeviceInformation.ProductName / InstanceNameを使用してコントローラーを区別し、異なる軸制御の割り当てを可能にする以外に、コントローラーのタイプを決定するための一般的な方法はありますか?
DirectInput APIを使用して、アプリケーションでさまざまなゲームパッドコントローラーを使用しようとしています。私の知る限り、軸はデバイス間で異なってマッピングされています。
DeviceInformation.ProductName / InstanceNameを使用してコントローラーを区別し、異なる軸制御の割り当てを可能にする以外に、コントローラーのタイプを決定するための一般的な方法はありますか?
コントローラーの種類(FirstPerson、Joystick、Gamepadなど)を知る必要がある場合は、DeviceInformation.DeviceTypeを使用します。
接続されている特定のコントローラーを知るには、ProductName以上のProductGuidを使用します。ProductNameは、2つの異なるコントローラーで同じである可能性があります。一方、ProductGuidは、同じ生産料金の2つのコントローラーでも異なる場合があります。
ProductGuidを使用することによってのみ、接続されたデバイスインスタンスを間違いなく識別できます。
軸の名前(およびオフセット)を調べて確認したくなるかもしれませんがdev.GetObjects(DeviceObjectTypeFlags.Axis)
、「X軸」という名前の軸が実際ににマップされるという保証はありませんsomeDevice.CurrentJoystickState.X
。
接続されるコントローラーについて事前にすべてのマッピングを自分で行い(これは、自分でアプリケーションを開発する場合にのみ受け入れられます)、その情報をアプリの構成ファイルに保存する必要があります。または、提供する必要があります。ユーザーが新しいデバイスを自分でマップできるフォーム。私は現在それだけを開発していますが、その答えはこの質問の範囲を超えています...
この基本情報を(ProductGuidとして)取得するために、デバイスを作成する必要がないことも考慮してください。これらのプロパティは、DeviceInstance(Microsoft.DirectX.DirectInput.Manager.GetDevices()のDeviceList内)で既に使用可能です。
更新:私自身の答えが私を悩ませていたので、私はもう少しトピックに飛び込みました。
したがって、どの軸をどの値にマップするかを決定する方法は次のとおりです。
// loop through the axes of an acquired device:
foreach (DeviceObjectInstance doi in
_currentDevice.GetObjects(DeviceObjectTypeFlags.Axis))
{
doi.Name; // the name of the axis, e.g. 'X-Achse' (that's a german device...)
doi.Offset / 4; // the enumeration 'index' of the axis
doi.UsagePage; // the UsagePage determines the context of the axis value
// vvvv
doi.Usage; // the Usage tells you which JoystickState field to map to.
// ^^^^
}
これまで、私はこれらの使用価値表現を見つけました:
(with JoystickState s = _currentDevice.CurrentJoystickState)
Usage Axis value
48 s.X
49 s.Y
50 s.Z
51 s.Rx
52 s.Ry
53 s.Rz
54 s.GetSlider()[0]
したがって、を使用するswitch(doi.Usage)
と、対応する軸の値を自動的に取得できます。