Member 13322907 Ответов: 1

Нужна помощь в реализации примера обратной связи directinput force в C#


Код ниже. То, что я пытаюсь сделать, - это создать exe-файл, который при запуске выполняет силовую обратную связь, определенную в переменных, а затем завершает работу. Пользователь не должен видеть никакого графического интерфейса. В качестве второго шага я хотел бы включить аргументы для exe, чтобы контролировать продолжительность, но это уже другая история.

DeviceList xDeviceList = Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly); 
        DeviceInstance someDeviceInstance; 
        foreach (DeviceInstance deviceInstance in xDeviceList) 
        { 
            someDeviceInstance = deviceInstance; 
            break; 
        } 

        Device someDevice = new Device(someDeviceInstance.InstanceGuid); 
        someDevice.SetCooperativeLevel(this.Handle, CooperativeLevelFlags.Exclusive | CooperativeLevelFlags.Background); 
        int[] axis = new int[0]; 
        foreach (DeviceObjectInstance doi in someDevice.Objects) 
        { 
            if((doi.Flags & (int)ObjectInstanceFlags.Actuator) != 0) 
            { 
                axis = new int[axis.Length + 1]; 
                axis[axis.Length - 1] = doi.Offset; 
            } 
        } 

        someDevice.Acquire(); 

        Effect effect = new Effect(); 
        effect.SetDirection(new int[axis.Length]); 
        effect.SetAxes(new int[axis.Length]); 
        effect.ConditionStruct = new Condition[axis.Length]; 

        effect.Flags = EffectFlags.Cartesian | EffectFlags.ObjectOffsets; 
        effect.Duration = int.MaxValue; 
        effect.SamplePeriod = 0; 
        effect.Gain = 10000; 
        effect.TriggerButton = (int)Microsoft.DirectX.DirectInput.Button.NoTrigger; 
        effect.TriggerRepeatInterval = 0; 
        effect.UsesEnvelope = false; 
        effect.EffectType = Microsoft.DirectX.DirectInput.EffectType.ConstantForce; 
        effect.StartDelay = 0; 
        effect.Constant = new Microsoft.DirectX.DirectInput.ConstantForce(); 
        effect.Constant.Magnitude = -5000; 
        EffectObject effectObject = null; 
        foreach (EffectInformation ei in someDevice.GetEffects(EffectType.ConstantForce)) 
        { 
            effectObject = new EffectObject(ei.EffectGuid, effect, someDevice); 
        } 

        effectObject.SetParameters(effect, EffectParameterFlags.Start ); 


Что я уже пробовал:

Добавил ссылки на DirectX, удалил графический интерфейс и запихнул код в классы, но часть дескриптора вызывает ошибки.

Patrice T

И у вас есть проблемы с этим кодом ?

Member 13322907

Ну, да. Это, вероятно, чрезвычайно тривиально решить. Главная проблема заключается в том, что я не могу поместить его в статическую пустоту, а когда я использую публичную пустоту, я не могу получить к ней доступ из статической пустоты.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13322907

Я опустил эту часть, потому что не знаю, правильный ли это подход.

1 Ответов

Рейтинг:
0

Member 13322907

Спасибо, но я уже обыскался вокруг себя. На самом деле вы связались с обрезанным кодом, который я опубликовал выше и сейчас пытаюсь реализовать. В принципе, я хочу создать проект на c#, избавиться от пользовательского интерфейса и вставить код туда, куда он должен идти (это та часть, которую я не мог понять).

Graeme_Grant

Вы не упоминаете, в чем заключаются ошибки, так что для кого-то очень мало, чтобы продолжать. У всех нас нет джойстиков с обратной связью. Знаете ли вы, как использовать отладчик? Если нет, то вот отличное место для начала: Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Member 13322907

Это не имеет значения. Я просто хочу использовать приведенный выше фрагмент кода, не получая ошибок компилятора. Только это. В простых терминах:

1. Откройте VS
2. Создайте новое приложение Windows Form
3. закомментируйте материал приложения, чтобы никакой графический интерфейс не открывался
4.Добавьте с помощью Microsoft.Совместимая с DirectX.И DirectInput;
5. Что делать с приведенным выше кодом?

Я не могу просто засунуть его в статическую пустоту Main (), потому что VS ноет о том, что "это" недопустимо в статическом свойстве, я не могу поместить его в другое место, потому что VS ноет о том, что не может ссылаться на вещи из нестатических классов, и я, очевидно, не могу изменить их на статические, потому что тогда он снова ноет о том, что "это" находится в статическом классе.

Graeme_Grant

Из моих ссылок выше: Принудительная обратная связь в управляемом DirectX[^] есть рабочая версия.

Member 13322907

Уже попробовать. Он полон вещей, которые мне не нужны, гораздо более запутанных, чем приведенный выше пример, и попытка разобрать его приводит к десяткам ошибок.

Graeme_Grant

Желаю удачи...

Member 13322907

Спасибо за ответы!