Таки взглянем на хатку. Пристально. Внимательно. На первый взгляд - грибок, четыре кнопки, восемь позиций.
Это - обычно-привычная хатка, все производители игр/симуляторов только так её и видят.
Производители джойстиков только так её и делают, ибо игры/симы по другому её и не представляют.
Теперь посмотрим в структуру DIJOYSTATE, из которой собственно практически все игры и берут данные от контроллеров джойстиков:
typedef struct DIJOYSTATE {
LONG lX; /* x-axis position */
LONG lY; /* y-axis position */
LONG lZ; /* z-axis position */
LONG lRx; /* x-axis rotation */
LONG lRy; /* y-axis rotation */
LONG lRz; /* z-axis rotation */
LONG rglSlider[2]; /* extra axes positions */
DWORD rgdwPOV[4]; /* POV directions */
BYTE rgbButtons[32]; /* 32 buttons */
} DIJOYSTATE, *LPDIJOYSTATE;
В DIJOYSTATE2 ( DX8 ) собственно больше кнопок и дополнительных осей, но нам сейчас это неинтересно.
Интересно больше что rgdwPOV - это DWORD и никак не три бита.
Формально любой контроллер обьявляет хатку как аналоговое (не дискретное!) устройство с диапазоном 360°, но сужает её дискретность до 3 бит. Игры в конечном итоге из директинпута получают значения от 0 до 36000 - и ничего не знают о изначальной дискретности хатки.
Самое интересное начинается дальше.После ввода значений хатки игра/сим делит полученное значение из DX на 4500 - и получает наши знакомые три бита и восемь положений. Потом игра, получив эти данные, преобразует их в восемь кнопок, которые затем уже мапятся на обзор. Логично? Мне кажется не совсем. Это просто костыль для поддержки четырехкнопочных хаток - иных не было.
Но, ещё более интересно, что соответсвующий апплет Windows XP - вполне нормально понимает хатки с числом позиций больше 8( правда больше 315° не видит - ну не было таких устройств для теста тогда). Если позволить игре сразу, минуя дополнительные преобразования принять данные и установить "поинт оф вью" согласно того что выдала хатка - получим и совместимость с 8-ми позиционными хатками, и с аналоговыми.
Ради интереса создал хатку на 8 бит ( 240°, дискретность 1,5°) - винда отлично её понимает, директ инпут вполне успешно выдает эти данные.
И текущий DX позволяет их иметь в девайсе аж 4 штуки. И все полностью аналоговые. Что это означает на практике? Что уже больше десятка лет существуют дополнительных 4 аналоговых оси в любом контроллере - просто ими никто не пользуется. Не пользуется во-первых - потому что до сего дня не существовало таких устройств, которые давали бы такую возможность, а во-вторых - не существует игр/симов, которые позволяли бы эту возможность использовать. Замкнутый круг. Приблизительно такая же ситуация была когда я попробовал первую вибронакидку - но тогда благодаря недоразумению Ил2Ш позволил получить вибрацию на "левое" устройство.
После перехода на DX8 игровые устройтсва получили три дополнительных оси (5+3 , +60% ).Это была революция своего рода. Однако возможность использования структур POV как аналоговых - это означает испоьзования 8+4 ( +50% ) =12 осей уже сегодня с одного контроллера.И эта латентная "революция" лежит тихохонько и ждет своего часа.
Все что надо - просто воспользоваться этим. По сравнению с раскраской и расчетом баллистической траектории пульки в любом симе - это 0,0000....1 % кода обсчета этой пульки и максимум полчаса работы с перерывом на кофе/пиво.
В результате запросто можно получить полноценный 3D обзор с микростика ( при этом оставить 8 осей на управление) , или если есть трекер - 4 дополнительных оси на управление - будь то радиатор, закрылки или еще чего - конечно мелочишка в современном симе, а приятно...
Увидят ли когда нибудь симы аналоговые хатки? (читай - захотят ли разработчики включить полноценную поддержку хатки как устройства обзора либо как аналоговой оси). Делаем ставки?
Приложения
http://www.youtube.com/watch?v=lJYi1...ature=youtu.be
PS в тестовом конфиге - хатки POV2 и POV3 "привязаны" к основным осям XY - для наглядности, POV1 - обычная 8-ми позиционная хатка.