首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SlimDX的ForceFeedback?

使用SlimDX的ForceFeedback?
EN

Stack Overflow用户
提问于 2012-08-29 01:54:01
回答 2查看 1.4K关注 0票数 1

我还没有找到任何文章或教程,可以吗?它试图调用一个Effect类,但我得到的结果是

E_INVALIDARG:传递给返回函数的参数无效(-2147024809)

代码

代码语言:javascript
运行
复制
[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();
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2012-09-09 21:22:19

您不能使用从SetAxesDeviceObjectInstance获得的偏移量。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,并从DeviceObjectInstance传入ObjectType来标识轴。

据我所知,如果您知道哪些轴有执行器,您还可以使用JoystickObjects类的静态成员之一作为SetAxes的偏移量。

票数 1
EN

Stack Overflow用户

发布于 2013-03-04 22:35:41

如果你使用的是Xbox360控制器或任何支持XInput的控制器,我会用它来代替DirectInput。它更容易使用IMO,而且强制反馈也很简单。查看SlimDX.XInput。最近几年大多数较新的游戏手柄都支持XInput。

VB.net代码:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12164807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档