СоХабр закрыт.
С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.
Примерно в декабре 2012 появилось острое желание спрограммировать самому игрушку для Андроида. Чтобы хоть она не падала и не была медленной и (сильно) убогой.
Дня два я просматривал табличку с возможными вариантами средств разработки. Требования — бесплатность, Андроид и Си-плюс-плюс. Я выбрал MoSync.
Результат: год работы над проектом, уход с работы и файл .apk на GooglePlay размером 1,7 Мб.
А теперь для желающих — подробно:
В 2011-ом у меня был миниатюрный опыт разработки для мобильных устройств на JavaScript-e.… Ну как разработки… точнее — реанимации сдохшего и заброшенного проекта. Опыт крайне неудачный, он надолго отбил интерес. А вначале был культурный шок от осознания: то есть я буду писать убогие игры (т.е. крайне далёкие от Starcraft-a и похожих), для людей, которые согласны заплатить две моих зарплаты за девайс, на котором можно будет играть только вот в такое убожество…
В декабре 2012 ситуация немного изменилась: в нашем «районном универсаме» появились дешёвые планшеты; я посмотрел количество скачивания популярных игр на GooglePlay, плюс у меня началась ломка от трёх месяцев без программирования — и я решился.
Первые шаги прошли легко: скачать и поставить студию MoSync, скомпилить программку-пример, порадоваться, что удалось запустить её в эмуляторе.
Ещё через какае-то время удалось запустить её на планшете.
Дальше был первый большой шок: дебаг программы в эмуляторе — он работал не всегда, и крайне непредсказуемо… Значения для переменных показывались не всегда правильные, формулы не поддерживались, содержание сложных структур не показывалось, и вообще программа иногда ломалась — не из-за кода, как выяснилось после бессонных ночей, а просто из-за глючного режима дебага.
Спасал только вывод информации на консоль.
Во-первых мне хотелось пальцами погонять картинки по экрану — то есть познакомиться с главным достоинством планшетов — самым удобным интерфейсом — тачскринистым. Выяснилось, что функций для вывода графики немного (функция круг/окружность вообще «самопальная») и что картинки (битмапы) я выводить (пока) не умею. Но самое главное — если вести пальцем по экрану планшета — была задержка, и похоже — это была проблема Андроида или тач-экрана.
А дальше началось «сделай сам».
Мне пришлось (и я это сделал) создать несколько Engine-ов. То есть, если я хотел добавить в проект какую-то «фичу» (фишку, примочку — особенность), мне нужно было знакомится с ней, изучать как её спрограммировать и вставить правильно, и какие у неё возможности. Дальше с этими «фичами» мне было удобнее работать через её Engine, при необходимости я изменял его… (без наследования, каюсь)
Первым был создан «Screen-Engine» — меня категорически не устраивало делать программу под какой-то конкретный размер экрана — я хотел работать с виртуальным экраном, а как его вывести на реальный — проблема Screen-Engine-а. Так же он конвертировал касание пользователя к экрану в виртуальные координаты, делал scroll (прокрутку виртуального экрана по меньшему реальному), pinch-zoom-in и pinch-zoom-out (изменение масштаба двумя пальцами). Это заняло больше всего времени — примерно месяца 3-6 — включая такие примочки, как замирание если аппликация не активна (чтоб не жрать батарейку и процессорное время зря) и показ пользователю определённых мест — «смотри: это — карта, отсюда начинаешь ты, а враг — примерно во-о-он там».
Далее поляки выпустили FreeCiv (бесплатная версия Цивилизации) под Android, и я проверил, будет ли у меня так же всё тормозить, если я буду отрисовывать карту «стратегии» из тайлов… Результат мне понравился, я решил обязательно вернуться к этой теме, но позже.
Затем (это был апрель-май, год назад) я решил выпустить игру попроще, ибо запутался в формулах тригонометрии и кинематики… Поскольку близкие во всю играли в Филлер, я решил делать его — будут проверять-тестить. (Надежды не оправдались.) Дабы не выпускать «ещё один HelloWorld», нужно было придумать, чем моя игра будет выделятся. Я решил, что раз это на Си — а значит работать будет быстрей, чем Ява (минусующим: это сугубо моё личное мнение) — то это будет нефиксированный размер экрана, поле — больше, чем у «конкурентов», какая-то анимация, и более «умный» ИИ.
Плюс я почувствовал, что нужна более простая игра, чтобы создать и проверить, «обкатать» все будущие Engine-ы — было похоже, что их понадобится немало.
Вторым Engine-ом стал Multi-Language-Engine. Он смотрел локаль (страна-язык мобильного устройства), загружал нужный язык (если не было — тогда дефолтный) и делал конвертации: UTF-8 (Multi-Byte-String) в Unicode и обратно — дело в том, что на экран игры (где отрисовка графики) нужно было выводить в Юникоде, а в менюшки — в UTF-8.
Так же Multi-Language-Engine формировал сообщения с параметрами — типа «у вас xxx дерева, yyy камня и zzz золота», для английского — «You have xxx wood, yyy stone and zzz of gold», и так — для всех поддерживаемых языков.
В начале выяснилось (после нескольких бессонных ночей), что Кхмерский язык не поддерживается — у шрифтов эмулятора и девайса нету букв для этого языка — ни в Юникоде, ни в UTF-8.
В конце выяснилось, что язык Хинди (а их 600-700 миллионов человек) не загружается корректно в UTF-8 (там более 4 байт на символ), но всё хорошо, если загружать его в Юникоде — т.е. мне повезло, что разрабатывал этот «языковой движок» для загрузки из обоих кодировок.
Дальше была работа с менюшками и диалогами — выяснилось (после долгих бессонных), что в MoCync элементы диалогов (виджеты) нужно не стирать, как в Си++, не обнулять, как в Яве, а оставлять нетронутыми — только тогда система их корректно сама… утилизирует.
Мне не понравилось, что у чек-бокса нажимается только кнопка, а не плюс ещё вся фраза, как в Виндах — пришлось писать своё…
Я не нашёл нормального элемента для набора числа — пришлось не только делать «своё», но ещё и добиваться, чтоб он был определённой ширины; какой — не знаю, узнаю кода он будет показан — от шрифта зависит…
Последними элементами по желанию были «рамочка вокруг чего-скажут» и горизонтальная линия (в принципе, та же рамочка, но на всю ширину).
После всех этих нововведений диалоги и менюшки перестали корректно уничтожаться, но эти было не критично — тихо висели в памяти.
AudioEngine — пляски с бубном продолжаются. Потому, что выяснилось, что не все функции MoSync корректно работают. Разработчики MoSync перестали отвечать и исправлять ошибки, потому что MoSync обанкротился. Но поскольку сил и времени уже было вложено много, то… Результат: громкость каждого звука не регулируется, но зато их можно не только останавливать и проигрывать, но даже ставить на паузу — это нужно, если аппликация не активна. Добиться этого удалось склеив стабильную версию библиотек студии «3.3.1» и «ночного билда с фиксом». Правда при этом аппликация перестала билдиться в Debug (отладочном) режиме. Но… он слегка полезен только запуская аппликацию в эмуляторе, а звуки и менюшки-диалоги в эмуляторе не работают — только на реальном устройстве.
Причина создания AudioEngine — автоматическая загрузка звуковых ресурсов, их более удобное проигрывание (и прочие функции), автоматические пауза (если аппликация не активна) и resume (возобновление проигрышей звуков), автоматическая работа с памятью — освобождение памяти звуков, что больше не используются; возможность проигрыша одного и того же звука одновременно более одного раза.
«Ёжики кололись и плакали, но продолжали...»
комментарии (12)