29 октября 2016

Поддержка геймпадов во Flash (as3)...

Всем привет!
Астрологи объявили "осень кодинга", так что и я продолжаю - вторая запись подряд о всяких таких штуках. Неделю назад чего-то мне в голову бумкнуло, что хорошо бы иметь поддержку геймпадов в моих играх. Посиделось, покодилось, на грабли наступилось, нервы попортилось, но что-то получилось. Ничего не работает, но рассказать все равно есть чего.

Прежде всего - Демо. Запускаем, подключаем контроллер и радуемся...

Вступление

Итак, начнем наш урок зоологии. Сегодня поговорим про отряд "геймпады" семейства "игровых контроллеров". Основные представители этого отряда: XBox One/360 и Dualshock 3/4 PlayStation.

Начало

Как вы поняли, захотелось мне контроллеров в своих флеш-играх. Зачем? На дворе двадцать первый век, и без поддержки геймпадов как-то грустно. (знаю, вы подумали, что двадцать первый век и флеш несовместимы, да?)
Поэтому недавно я прикупил себе геймпад для XBox One, подключил, поигрался с ним и забыл напрочь. На неделе вспомнил и решил попробовать. Базово флеш вообще никак не реагирует на нажатия. И это лично мне непонятно. Почему нельзя было добавить события вроде GamePadEvent.OnButtonPress?

Готовые решения

Поэтому я спросил: "Окей, гугл, что там с геймпадами на флеше?" Несколько вариантов (1, 2, 3) выползло. Даже Антон Карлов когда-то делал поддержку геймпада. Но насторожил тот факт, что каждый геймпад нужно отдельно биндить. И в готовых решениях были только XBox360 и Ouya. Жуть!
"А как же дуалшоки, стим-контролер и всякие китайские?" - спросите вы. А вот никак. Подключите - а они этими библиотеками даже не определятся. Беда.

Мой код

В общем, посидел я несколько дней. И понял, что реально нужно мапить каждый контроллер отдельно. В итоге я просто сделал небольшую демку. За основу взял вот этот код. Но только логику переписал под себя.
При подключении контроллера она вытаскивает его id,  если он незнакомый, то предлагает его замапить (то есть нажимать на разные кнопки и определить их номера в таблице) с помощью такого окошка:


Количество кнопок и осей-ползунков сами определяются при подключении контроллера. То есть для PS4 вылезет 6 осей справа, а для PS3 только 4. Удобно? А-то! Я попросил знакомых замапить свои контроллеры. В итоге у меня скопились следующие представители: XBox One, XBox 360, PS 3, PS 4 (есть еще OUYA, но кому она нужна?)
Если мы подключаем эти контроллеры, то вид демки становится уже дружелюбным:


И вроде все окей, как будто можно кричать во все горло "Победа! Равенство! Мир!" ("Свой среди чужих..." (с)) Но как всегда возникли большие трудности.

Проблемы

  • Первая. У geovizz'а его PS4 контроллер определился как какой-то "Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 05c4)". Что за ерунда? Ведь он должен быть идентифицирован как Playstation(R)4! Беда... Почему это для меня проблема? Что-то я беспокоюсь, что один и тот же контроллер может по-разному идентифицироваться в разных системах (вин/мак) и их версиях (win7,8,10 и т.д.), и даже браузерах. Это реально неприятно, так как не получается унифицировать код под один и тот же контроллер.
  • Вторая. У камрада

Исходники

Всем, кому интересно, я выложил исходники. Качаем.
( Компилировать с Flex не получилось, а вот asc2.0 проходит на ура. Только версию плеера нужно указать старше 11.8 что ли. В общем, я ставлю 16ый плеер и все работает )
Запускаем демку.

Выводы

А пока их делать рано на самом деле. Вроде контроллеры можно подключить, ловить нажатия кнопок во флеш- и air-приложениях... и даже некоторые работают правильно. Но единой стабильностью и унификацией здесь пока и не пахнет.
Говорят, в Unity есть asset для корректной работы с любыми геймпадами. Вот это счастье! Хочу и себе такое же!

Сообщения, схожие по тематике:

0 коммент.:

Отправить комментарий