События SlimDx при нажатии кнопки

Я использую slimdx для интерпретации нажатий кнопок контроллера xbox. Я опрашиваю каждые 200 мс, чтобы прочитать состояния кнопки xbox, и у меня все работает. я использую

        JoystickState state = Joystick.GetCurrentState();
        // get buttons states
        bool[] buttonsPressed = state.GetButtons();

Есть ли способ генерировать события при нажатии кнопки вместо опроса? Чтобы объяснить, представьте, если бы время моего опроса составляло 5 секунд. И пользователь нажимает кнопку на 2-й секунде и отпускает ее. В следующий раз мое приложение никогда не узнает, что кнопка была нажата


person user2837961    schedule 06.07.2016    source источник


Ответы (2)


Нет - в DirectX надо опрашивать. Чтобы сделать это эффективно, вы хотите создать поток опроса и иметь класс, который вызывает события перекрестного потока в ваш потребляющий поток.

person PhillipH    schedule 06.07.2016

Я знаю, что этому 4 года, но ответ неверен. Наиболее эффективным способом может быть опрос, но вы можете инициировать событие при опросе.

Это незавершенная работа, но она должна заставить кого-то начать. Сохраните это как новый класс, он является производным от Timer, поэтому, как только вы добавите его в свой проект, создадите его и перетащите на форму, которую хотите использовать, вы сможете подписаться на событие buttonPressed.

public class GamePadController : Timer
{

    public delegate void ButtonPressedDelegate(object sender, int ButtonNumber);
    public event ButtonPressedDelegate ButtonPressed;

    List<DeviceInstance> directInputList = new List<DeviceInstance>();
    DirectInput directInput = new DirectInput();
    List<SlimDX.DirectInput.Joystick> gamepads = new List<Joystick>();
    SlimDX.DirectInput.JoystickState state;



    public GamePadController()
    {
        this.Interval = 10;
        this.Enabled = true;
        this.Tick += GamePadController_Tick;
        RefreshGamePads();
        
    }


    private void RefreshGamePads()
    {
        directInputList.Clear();
        directInputList.AddRange(directInput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly));
        gamepads.Clear();
        foreach (var device in directInputList)
        {
            gamepads.Add(new SlimDX.DirectInput.Joystick(directInput, directInputList[0].InstanceGuid));
        }
    }

    private void GamePadController_Tick(object sender, EventArgs e)
    {
        
        foreach (var gamepad in gamepads)
        {
            if (gamepad.Acquire().IsFailure)
                continue;
            if (gamepad.Poll().IsFailure)
                continue;
            if (SlimDX.Result.Last.IsFailure)
                continue;

            state = gamepad.GetCurrentState();

            bool[] buttons = state.GetButtons();

            for (int i = 0; i < buttons.Length; i++)
            {
                if (buttons[i])
                {
                    if (ButtonPressed != null)
                    {
                        ButtonPressed(gamepad, i);
                    }
                }
            }

            gamepad.Unacquire();
        }

    }
}
}
person General Grey    schedule 09.09.2020