2

DirectInput APIを使用して、アプリケーションでさまざまなゲームパッドコントローラーを使用しようとしています。私の知る限り、軸はデバイス間で異なってマッピングされています。

DeviceInformation.ProductName / InstanceNameを使用してコントローラーを区別し、異なる軸制御の割り当てを可能にする以外に、コントローラーのタイプを決定するための一般的な方法はありますか?

4

1 に答える 1

0

コントローラーの種類(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)と、対応する軸の値を自動的に取得できます。

于 2010-08-23T09:38:55.147 に答える