Я в основном использую таймер и проверяю состояние моего контроллера в каждый тик.
Проблема в том, что он недостаточно последователен. Иногда я нажимаю правую кнопку, и она работает, а иногда не работает. (Хотя я делаю интервал таймера равным 1 микросекунде, что является самым низким интервалом)
Мой код такой.
Код: Выделить всё
public static Controller Controller { get; set; }
public static State ControllerState { get; set; }
Controller = new Controller(UserIndex.One);
if (Controller.IsConnected == false)
return;
_deviceType = SharpDX.DirectInput.DeviceType.Gamepad;
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 0,1);
_dispatcherTimer.Start();
private static async void dispatcherTimer_Tick(object? sender, EventArgs e)
{
await TimerTick(_deviceType);
}
private static async Task TimerTick(SharpDX.DirectInput.DeviceType deviceType)
{
try
{
ControllerState = Controller.GetState();
_stateY = ControllerState.Gamepad.LeftThumbY;
_stateX = ControllerState.Gamepad.LeftThumbX;
_gamepadButtonFlags = ControllerState.Gamepad.Buttons.ToString();
if (_gamepadButtonFlags == "None")
{
HandleDPadButtons(true);
HandleDirections(true);
HandleDirectionCount(0);
return;
}
switch (_gamepadButtonFlags)
{
case "DPadRight":
Right();
break;
case "DPadUp":
Up();
break;
case "DPadLeft":
Left();
break;
case "DPadDown":
Down();
break;
case "A":
PressA();
break;
case "B":
PressB();
break;
case "X":
PressX();
break;
case "Y":
PressY();
break;
default:
break;
}
if (!_gamepadButtonFlags.Contains("A") &&
!_gamepadButtonFlags.Contains("B") &&
!_gamepadButtonFlags.Contains("X") &&
!_gamepadButtonFlags.Contains("Y"))
{
HandleDPadButtons(true);
}
if (!_gamepadButtonFlags.Contains("DPadRight") &&
!_gamepadButtonFlags.Contains("DPadUp") &&
!_gamepadButtonFlags.Contains("DPadLeft") &&
!_gamepadButtonFlags.Contains("DPadDown"))
{
HandleDirections(true);
HandleDirectionCount(0);
}
}
catch (SharpDXException sharpDXException)
{
_dispatcherTimer.Stop();
_buttonTimer.Stop();
MessageController.ShowMessage("Controller lost!", "Error on joystick timer.", System.Windows.MessageBoxButton.OK, MessageBoxImage.Error);
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... mer-in-wpf