1

記事やチュートリアルが見つかりませんでした。可能ですか? Effect クラスを呼び出そうとしましたが、得られるのは

E_INVALIDARG: 返される関数に無効なパラメーターが渡されました (-2147024809)

コード

[TestClass]
public class ForceFeedbackTest
{
    [TestMethod]
    public void Test()
    {
        using (var form = new Form())
        {
            var directInput = new DirectInput();

            foreach (var device in directInput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly))
            {
                var controller = new Joystick(directInput, device.InstanceGuid);
                controller.SetCooperativeLevel(form.Handle, CooperativeLevel.Exclusive | CooperativeLevel.Background);
                controller.Acquire();

                int xAxisOffset = 0, yAxisOffset = 0;
                int nextOffset = 0;
                foreach (DeviceObjectInstance d in controller.GetObjects())
                {
                    if ((d.ObjectType & ObjectDeviceType.ForceFeedbackActuator)
                        != 0)
                    {
                        if (nextOffset == 0)
                            xAxisOffset = d.Offset;
                        else
                            yAxisOffset = d.Offset;
                        nextOffset++;
                    }
                }

                int[] offsets = new int[2];
                offsets[0] = xAxisOffset;
                offsets[1] = yAxisOffset;
                int[] coords = { 0, 0 };

                var info = controller.GetEffects(EffectType.All).First();

                var args = new EffectParameters();
                args.Flags = EffectFlags.ObjectOffsets | EffectFlags.Cartesian;
                var typeSpec = new ConstantForce();


                args.Duration = 1000;
                args.SamplePeriod = controller.Capabilities.ForceFeedbackSamplePeriod;
                args.Parameters = typeSpec;


                args.Gain = 5000;

                args.SetAxes(offsets, coords);

                args.StartDelay = 500;

                var effect = new Effect(controller, info.Guid);
                effect.SetParameters(args); //This is the line i get the error on.
                effect.Start();
            }
        }
    }
}
4

2 に答える 2

1

DeviceObjectInstanceforから取得したオフセットを使用することはできませんSetAxes。MSDNはこれについて言及していますが、多少大雑把です。

デバイスのネイティブデータ形式でのオフセット。ネイティブデータ形式は、生のデバイスデータに対応しています。dwOfsメンバーは、このオブジェクトのDIJOFS_BUTTON0などのデバイス定数に対応していません。

http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.dideviceobjectinstance(v=vs.85).aspx

EffectFlags.ObjectIdsの代わりにを使用して、からEffectFlags.ObjectOffsetsを渡して、軸を識別することができます。ObjectTypeDeviceObjectInstance

私が覚えている限り、どの軸にアクチュエータがあるかがわかっている場合は、JoystickObjectsクラスの静的メンバーの1つをのオフセットとして使用することもできます。SetAxes

于 2012-09-09T13:22:18.677 に答える
0

Xbox 360 コントローラーまたは XInput をサポートするコントローラーを使用している場合は、DirectInput の代わりにそれを使用します。IMO を使用する方が簡単で、強制フィードバックは簡単です。SlimDX.XInput をチェックしてください。ここ数年の新しいゲームパッドのほとんどは、XInput をサポートしています。

VB.net コード:

Dim player As Integer = 1 'Player can be 1-4
Dim gamePad As SlimDX.XInput.Controller = New SlimDX.XInput.Controller(player)

Public Sub VibrateController(ByVal rSpeed As Short, ByVal lSpeed As Short)
   Dim vibSettings As New SlimDX.XInput.Vibration()
   vibSettings.LeftMotorSpeed = lSpeed
   vibSettings.RightMotorSpeed = rSpeed
   gamePad.SetVibration(vibSettings)
End Sub
于 2013-03-04T14:35:40.957 に答える