使用SharpDX获取操纵杆

时间:2013-08-24 07:12:35

标签: c# joystick sharpdx

我是关于C#和Sharpdx的新手。我有几天的代码问题,我不明白的方式不起作用!这是一个简单的任务,即获取操纵杆的一个轴的值​​并将其显示在表格的文本框中。

我在Visual Studio 2010 express上做了一个新项目,我做了一个带有按钮和textBox的Form,用于显示操纵杆轴(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();
}

1 个答案:

答案 0 :(得分:2)

我认为问题在于您同时致电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;
    }
  }
}