Джойстик + c#: аналоговая кнопка

Я использую Microsoft DirectX для доступа к своему геймпаду. Вот такой usb-геймпад:

введите здесь описание изображения

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

Дело в том, что есть способ узнать, когда нажата аналоговая кнопка (горит красная лампочка).

Это возможно? Как?


person the_moon    schedule 24.04.2013    source источник
comment
Что вы имеете в виду: аналоговая кнопка, вы имеете в виду триггеры L2 / R2 или вы имеете в виду чувствительные к давлению лицевые кнопки?   -  person Nolonar    schedule 24.04.2013
comment
Я имею в виду кнопку, которая включает потенциометры для осей x, y, z. Тот, что зажигает красный свет...   -  person the_moon    schedule 24.04.2013
comment
Нет, это, вероятно, невозможно, так как это не кнопка ввода, это кнопка, которая изменяет способ работы оборудования.   -  person Robert J.    schedule 24.04.2013


Ответы (1)


Я бы рекомендовал SlimDX или SharpDX для вашего проекта. Они поддерживают DirectX API и очень просты.

SlimDX:

using SlimDX.DirectInput;

Создайте новый объект DirectInput:

DirectInput input = new DirectInput();

Затем класс GameController для обработки:

public class GameController
{
    private Joystick joystick;
    private JoystickState state = new JoystickState();
}

И используйте это так:

public GameController(DirectInput directInput, Game game, int number)
{
    // Search for Device
    var devices = directInput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly);
    if (devices.Count == 0 || devices[number] == null)
    {
        // No Device
        return;
    }

    // Create Gamepad
    joystick = new Joystick(directInput, devices[number].InstanceGuid);  
    joystick.SetCooperativeLevel(game.Window.Handle, CooperativeLevel.Exclusive | CooperativeLevel.Foreground);

    // Set Axis Range for the Analog Sticks between -1000 and 1000 
    foreach (DeviceObjectInstance deviceObject in joystick.GetObjects())
    {
        if ((deviceObject.ObjectType & ObjectDeviceType.Axis) != 0)
            joystick.GetObjectPropertiesById((int)deviceObject.ObjectType).SetRange(-1000, 1000);
    }
    joystick.Acquire();
}

Наконец, получите по методу состояние:

public JoystickState GetState()
{
    if (joystick.Acquire().IsFailure || joystick.Poll().IsFailure)
    {
        state = new JoystickState();
        return state;
    }

    state = joystick.GetCurrentState();

    return state;
}
person Smartis    schedule 24.04.2013
comment
Да, я использую что-то похожее по своей структуре. Просто используя Microsoft Direct X... Почему SLIM/SHARP лучше? Мог ли получить знание о состоянии красной лампочки геймпада? - person the_moon; 24.04.2013
comment
Это хорошая оболочка, и я предпочитаю некоторые функции Framework. Для красного света я предлагаю, чтобы он содержался в joystick.GetObjects(). - person Smartis; 24.04.2013
comment
Спасибо @Smartis, я проверю для этого joystick.GetObjects() ... Мне нужно знать, включен ли аналог, чтобы узнать, доступна ли ось z ... - person the_moon; 24.04.2013
comment
Для чего нужны игра и число в методе GameController? Игровой объект не распознается VS... - person the_moon; 25.04.2013
comment
В этом случае это игровой объект из XNA, и, извините, класс GameController, который я сейчас отредактирую... - person Smartis; 25.04.2013