nes
> А чо, с сырым инпутом заморачиваться не стал?
Потому что xbox контроллер нужен, а не просто клавиатура
Aroch
> а флажка для буферизированного опроса там нет?
нету
Имбирная Ведьмочка
XInput геймпады умеют прикидываться DInput
monobogdan
> XInput геймпады умеют прикидываться DInput
Только без обратной связи типа вибраций
=A=L=X=
> И она пригодилась где то?
Даже если и не пригодилась конкретно в дх — это не причина его убирать, точно так же, как если ты никогда не попадал в аварию на своей машине — это не причина выбрасывать аптечку и огнетушитель.
На счёт конкретно дх я не знаю, а вот по винапи в целом — прецеденты определённо есть, когда добавляли новую версию с новым двСайз, так что нельзя сказать, якобы пожаров вообще никогда не случалось и нигде и огнетушители не нужны как концепция.
Юзайте SDL.
Там если геймпад поддерживает DInput он может стать объектом вида Joystick.
Но если он поддерживает XInput, то он так же может стать объектом вида Gamepad.
Но даже если геймпад не поддерживает XInput, но GUID его драйвера есть во встроенной в SDL базе данных геймпадов, то он тоже сможет стать объектом вида Gamepad и SDL сама автоматически замапит кнопки куда надо.
Имбирная Ведьмочка
DX базирован на COM-интерфейсах - сущности которая уже прекрасно расширяется в любых степенях и возможностях через QueryInterface и все эти ублюдские dwSize там с самого начала не были нужны. Всё это было одной большой ошибкой той же степени в какой OpenGL никак не могли проапгрейдить на по настоящему новую версию с новыми функциями без старых функций.
=A=L=X=
> DX базирован на COM-интерфейсах - сущности которая уже прекрасно расширяется в любых степенях и возможностях через QueryInterface и все эти ублюдские dwSize там с самого начала не были нужны.
Контр-аргумент: зачем плодить кучу новых интерфейсов, когда можно просто добавить селектор dwSize в структуру-параметр?
MrShoor
> нету
ну тогда страдать и довольствоваться хотя бы тем что есть dwPacketNumber и не делать лишнюю работу если опрос слишком частый и изменений не было. Его всё равно не имеет смысла использовать за пределами игровых устройств и потеря стэйта при лаге обрабатывающего потока не должно быть большой потерей, в сравнении с тем что у пользователя есть куда большая проблема раз начались лаги.
Имбирная Ведьмочка
> Контр-аргумент: зачем плодить кучу новых интерфейсов, когда можно просто добавить селектор dwSize в структуру-параметр?
Затем чтобы не превращать код в мешанину когда вместо того чтобы передать параметры в функцию их сперва запихивают в структуру-передатчик.
Давай возьмём пример из первопоста, один метод:
// Fill format Format.dwSize = sizeof(DIDATAFORMAT); Format.dwObjSize = sizeof( DIOBJECTDATAFORMAT); Format.dwFlags = 2, Format.dwDataSize = sizeof( State ); Format.dwNumObjs = 7; Format.rgodf = RGDOF; HRESULT Result; ... Result = Device->SetDataFormat( &Format );
Если переписать по другому, то это могло бы выглядеть так:
// параметры: Flags, DataSize, NumObjs, ArrayOfFormatDescriptiors Result = Device->SetDataFormat(2, sizeof( State ), 7, RGDOF );
Код чище, проще, не пестрит ненужными идентификаторами и тому подобное.
Если закладывать возможность расширения параметров, то лучше сделать последний параметр void *extInfo и в него пихать возможные расширения в будущем. Но это крайние меры и они не должны быть популярными - MS отличие от OpenGL справедливо делала новую версию DX полностью выкидывая устаревшие интерфейсы на мороз.
=A=L=X=
> полностью выкидывая устаревшие интерфейсы на мороз.
это было бы так если бы приложения использующие старые версии dx не запускались. На уровне интерфейса ты может и можешь творить любую дичь, но уровнем ниже при работе с драйверами и железом это всё равно придется как-то разруливать и делать совсем уж резкие изменения это многократно усложнять себе работу.
На самом деле это частный случай крестопроблем,... ну что стоило добавить в стандарт именованные инициализаторы для структур, например.
=A=L=X=
> И она пригодилась где то?
Она кстати таки пригодилась. Я сейчас сходу не скажу, но точно помню, что встречал несколько функций, в которых структура расширялась именно за счет dwSize
Aroch
> это было бы так если бы приложения использующие старые версии dx не запускались.
Это так, просто дистрибутивы DirectX несут в себе и старые версии тоже.
MrShoor
> Я сейчас сходу не скажу, но точно помню, что встречал несколько функций, в которых структура расширялась именно за счет dwSize
И код еще более ублюдским становился, потому что теперь надо передавать указатель не на расширенную структуру, а на её подструктуру.
Уж лучше void *extInfo.
=A=L=X=
> потому что теперь надо передавать указатель не на расширенную структуру, а на её подструктуру.
Всмысле? На расширенную структуру указатель и передавался. Ты о чем?
=A=L=X=
> И код еще более ублюдским становился
Как по мне, то вот этот код:
// Fill format Format.dwSize = sizeof(DIDATAFORMAT); Format.dwObjSize = sizeof( DIOBJECTDATAFORMAT); Format.dwFlags = 2, Format.dwDataSize = sizeof( State ); Format.dwNumObjs = 7; Format.rgodf = RGDOF; HRESULT Result; ... Result = Device->SetDataFormat( &Format );
Читается намного проще, чем твой:
Result = Device->SetDataFormat(2, sizeof( State ), 7, RGDOF );
Ты в своем примере сходу сможешь сказать что такое 2 и что такое 7 ты передал в свой SetDataFormat? Читабельность кода важнее удобства набора (да и с современными IDE по поводу удобства набора - спорный аргумент)