我在谷歌上搜索了这个,但我想出的唯一东西已经过时并且不起作用。
有没有人有关于如何使用 C# .NET 获取操纵杆数据的任何信息?
我在谷歌上搜索了这个,但我想出的唯一东西已经过时并且不起作用。
有没有人有关于如何使用 C# .NET 获取操纵杆数据的任何信息?
由于这是我在研究 C# 中的操纵杆/游戏手柄输入时在谷歌上获得的最高热门,我想我应该发布一个回复供其他人查看。
我发现最简单的方法是使用 SharpDX 和 DirectInput。您可以通过 NuGet (SharpDX.DirectInput) 安装它
之后,只需调用几个方法即可:
static void Main()
{
// Initialize DirectInput
var directInput = new DirectInput();
// Find a Joystick Guid
var joystickGuid = Guid.Empty;
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Gamepad not found, look for a Joystick
if (joystickGuid == Guid.Empty)
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Joystick not found, throws an error
if (joystickGuid == Guid.Empty)
{
Console.WriteLine("No joystick/Gamepad found.");
Console.ReadKey();
Environment.Exit(1);
}
// Instantiate the joystick
var joystick = new Joystick(directInput, joystickGuid);
Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid);
// Query all suported ForceFeedback effects
var allEffects = joystick.GetEffects();
foreach (var effectInfo in allEffects)
Console.WriteLine("Effect available {0}", effectInfo.Name);
// Set BufferSize in order to use buffered data.
joystick.Properties.BufferSize = 128;
// Acquire the joystick
joystick.Acquire();
// Poll events from joystick
while (true)
{
joystick.Poll();
var datas = joystick.GetBufferedData();
foreach (var state in datas)
Console.WriteLine(state);
}
}
我希望这有帮助。
我什至让它与 DualShock3 和 MotioninJoy 驱动程序一起使用。
一:使用SlimDX。
二:它看起来像这样(GamepadDevice
我自己的包装器在哪里,代码被精简到相关部分)。
查找操纵杆 / 垫 GUID:
public virtual IList<GamepadDevice> Available()
{
IList<GamepadDevice> result = new List<GamepadDevice>();
DirectInput dinput = new DirectInput();
foreach (DeviceInstance di in dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly))
{
GamepadDevice dev = new GamepadDevice();
dev.Guid = di.InstanceGuid;
dev.Name = di.InstanceName;
result.Add(dev);
}
return result;
}
用户从列表中选择后,获取游戏手柄:
private void acquire(System.Windows.Forms.Form parent)
{
DirectInput dinput = new DirectInput();
pad = new Joystick(dinput, this.Device.Guid);
foreach (DeviceObjectInstance doi in pad.GetObjects(ObjectDeviceType.Axis))
{
pad.GetObjectPropertiesById((int)doi.ObjectType).SetRange(-5000, 5000);
}
pad.Properties.AxisMode = DeviceAxisMode.Absolute;
pad.SetCooperativeLevel(parent, (CooperativeLevel.Nonexclusive | CooperativeLevel.Background));
pad.Acquire();
}
轮询 pad 如下所示:
JoystickState state = new JoystickState();
if (pad.Poll().IsFailure)
{
result.Disconnect = true;
return result;
}
if (pad.GetCurrentState(ref state).IsFailure)
{
result.Disconnect = true;
return result;
}
result.X = state.X / 5000.0f;
result.Y = state.Y / 5000.0f;
int ispressed = 0;
bool[] buttons = state.GetButtons();
坏消息是微软似乎停止支持他们的 DirectX NET 库,转而专注于 XNA。我不在 GameDev 工作,所以我不需要使用 XNA,但如果你开发电脑游戏,你可以尝试一下。好消息是还有其他方法。一个是SlimDX新框架,可帮助您从 C# 中使用 DirectX。另一种方法是直接将“Microsoft.DirectX.dll”和“Microsoft.DirectX.DirectInput.dll”的引用添加到您的项目中。您可以找到它们“..\Windows\Microsoft.NET\DirectX for Managed Code\”。如果您要使用最后一种方法,这里是codeproject的链接,您可以在其中阅读如何使用操纵杆。
编辑: 如果您的应用程序基于 NET 版本较新然后 2.0 应用程序可能会挂起。要解决此问题,请更改配置文件并添加以下内容:
<startup useLegacyV2RuntimeActivationPolicy="true">
谷歌把我带到了这里,虽然不是这个问题的要求,但OpenTK是 Windows 和 Linux(在单声道下)支持的一个不错的选择。
从OpenTK 文档中,此代码适用于 Raspberry Pi + Raspbian + Mono 3.12.0:
for (int i = 0; i < 4; i++)
{
var state = Joystick.GetState(i);
if (state.IsConnected)
{
float x = state.GetAxis(JoystickAxis.Axis0);
float y = state.GetAxis(JoystickAxis.Axis1);
// Print the current state of the joystick
Console.WriteLine(state);
}
}