RawGameController.GetCurrentReading не обновляет массивы в UWP

У меня есть поток-член для работающего объекта, который также содержит RawGameController.

Поток находится в цикле while и должен постоянно обновлять проверку контроллера, но когда я проверяю значения, ничего не меняется. Я могу подтвердить, что контроллер есть в Windows, и кнопки работают. (это проводной xbox 360, но он должен поддерживать много разных контроллеров, поэтому я не могу использовать объект Gamepad.)

 public class myController
    {
    public RawGameController rgController;
    public Thread Poller;


public void ControllerPoller()
    {
        bool[] buttonArray = new bool[rgController.ButtonCount];
        GameControllerSwitchPosition[] switchArray = new GameControllerSwitchPosition[rgController.SwitchCount];
        double[] axisArray = new double[rgController.AxisCount];

        bool[] oldButtonArray = new bool[rgController.ButtonCount];
        GameControllerSwitchPosition[] oldSwitchArray = new GameControllerSwitchPosition[rgController.SwitchCount];
        double[] oldAxisArray = new double[rgController.AxisCount];

        while (true)
        {
            //roughly polling 60hz so...
            using (var waitHandle = new ManualResetEventSlim(initialState: false))
            {
                waitHandle.Wait(TimeSpan.FromMilliseconds(1000 / 60));
            }
            rgController.GetCurrentReading(buttonArray, switchArray, axisArray);
            if (buttonArray.Equals(oldButtonArray) && switchArray.Equals(oldSwitchArray) && axisArray.Equals(oldAxisArray))
            {
                continue;
            }

Затем я занимаюсь изменениями ввода.

Любая помощь будет здорово.


person Viché    schedule 27.04.2020    source источник
comment
Вы имеете в виду, что когда вы использовали свой контроллер Xbox360 для тестирования приведенного выше кода, метод GetCurrentReading() не ответил, но мог другой сторонний контроллер?   -  person Faywang - MSFT    schedule 30.04.2020


Ответы (1)


Array.Equals — это проверка личности (ссылаются ли они на один и тот же объект). Для ваших массивов всегда будет false, так как это разные объекты:

using System;

namespace Test
{
  public class Program
  {
    public static void Main(string[] args)
    {
      var nums1 = new int[] { 1, 2, 3 };
      var nums2 = new int[] { 1, 2, 3 };
      var nums1ref = nums1;

      Console.WriteLine(nums1.Equals(nums2));    // False
      Console.WriteLine(nums1.Equals(nums1ref)); // True
    }
  }
}

Вы можете найти примеры того, как проверить равенство содержимого массива здесь.

Кроме того, если у вас есть правильный тест на равенство, вы, вероятно, не захотите использовать && (и), а вместо этого будете использовать || (или) в своих проверках. содержимое массива изменилось, а не все сразу.

person Peter Torr - MSFT    schedule 27.04.2020
comment
Спасибо за это. Я обнаружил, что массивы на самом деле были одним и тем же адресом в памяти, поэтому, когда изменение было получено, оно изменило оба. Хотя это устраняет мою проблему с массивом (еще раз спасибо.), это не говорит мне, почему GetCurrentReading не отвечает. Только для контроллера Xbox360. У меня есть еще один сторонний контроллер, который работает нормально... - person Viché; 28.04.2020