0

私はC#とSharpdxについては初めてです。数日前からこのコードの問題があり、うまくいかない方法がわかりません! これは、ジョイスティックの 1 つの軸の値を取得し、それをフォームのテキスト ボックスに表示する簡単なタスクです。

Visual Studio 2010 Express で新しいプロジェクトを作成し、ジョイスティック軸 (X 軸) の値を表示するためのボタンと textBox を使用してフォームを作成しました。

ここにあるコードの最初の部分は、sharpdx ドキュメントの例で、2 番目の部分は少し異なります。

問題は、ボタンを押すたびに値が変わらないことです

何かが間違っているが、私は何がわからない

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();
}
4

1 に答える 1

2

問題は、あなたが両方を呼び出していることだと思いますPoll-どちらGetCurrentStateか一方だけを行う必要があります。

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;
    }
  }
}
于 2013-12-06T20:10:30.997 に答える