我还没有找到任何文章或教程,可以吗?它试图调用一个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();
}
}
}
}发布于 2012-09-09 21:22:19
您不能使用从SetAxes的DeviceObjectInstance获得的偏移量。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的偏移量。
发布于 2013-03-04 22:35:41
如果你使用的是Xbox360控制器或任何支持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 Subhttps://stackoverflow.com/questions/12164807
复制相似问题