使用SharpDX获取操纵杆

本文关键字:操纵杆 获取 SharpDX 使用 | 更新日期: 2023-09-27 18:29:02

我对C#和Sharpdx很陌生。我在几天内遇到了这个代码问题,我不明白这种方法不起作用!这是一项关于获取操纵杆一个轴的值并将其显示在Form中的文本框上的简单任务。

我在VisualStudio2010express上做了一个新项目,我用一个按钮和一个文本框来显示操纵杆轴(X轴)的值。

下面的第一部分代码是sharpdx文档中的示例,第二部分有点不同。

问题是,每次我按下按钮时,数值都不会改变

出了问题,但我不知道是什么

private void button3_Click(object sender, EventArgs e)
{
  // 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 e stato
  Joystick joystick = new Joystick(directInput, joystickGuid);
  JoystickState stato = new JoystickState();
  // specifico se relativo o assoluto
  joystick.Properties.AxisMode = DeviceAxisMode.Absolute;
  // effettuo un collegamento con il joystick
  joystick.Acquire();
  // qui faccio una acquisizione dello stato che memorizzo
  joystick.Poll();
  // effettuo una lettura dello stato
  joystick.GetCurrentState(ref stato);
  // stampo il valore dell'ordinata
  textBox1.Text = stato.X.ToString();
}

使用SharpDX获取操纵杆

我认为问题在于您同时调用PollGetCurrentState——您只需要执行其中一个操作。

从你的问题中,听起来像是后者——也就是说,当按下按钮时,你想要GetCurrentState——而不是循环中的Poll

如果你确实想得到当前状态,那么你想要这样的东西。

var directInput = new DirectInput();
var joystickState = new JoystickState();
var joystick = new Joystick(directInput, joystickGuid);
joystick.Acquire();
joystick.GetCurrentState(ref joystickState);
textBox1.Text = joystickState.X.ToString();

如果你想对更改进行民意调查,你就想要这样的东西。

var directInput = new DirectInput();
var joystick = new Joystick(directInput, joystickGuid);
joystick.Acquire();
joystick.Properties.BufferSize = 128;
while (true)
{
  joystick.Poll();
  var data = joystick.GetBufferedData();
  foreach (var state in data) 
  {
    if (state.Offset == JoystickOffset.X)
    {
       textBox1.Text = state.Value;
    }
  }
}