среда, 5 сентября 2012 г.

Фреймворк в мармеладе

Через некоторое время после начала разработки приложений для мобильных устройств, наступает момент, начиная с которого, хочется, чтобы приложения собирались не только под Android, но и (к примеру) под iPhone (и желательно с минимальными трудозатратами, исключающими полномасштабную портацию). Marmalade предоставляет такую возможность (за деньги, за весьма серьезные деньги :( ) Помимо этого, Marmalade предоставляет Trial версию аж на целых 90 дней, чем мы не преминем воспользоваться, чтобы разобраться, что это такое вообще и стоит ли оно тех денег, которых оно стоит?

Начнем работу с выкачивания дистрибутива и развертывания инструментальной среды Marmalade. Сам процесс установки Marmalade (во всяком случае на Windows) настолько тривиален, что я не буду на нем останавливаться. Все что требуется - установленная ранее MS Visual Studio любой разумной версии и чуть больше 1 гигабайта свободного пространства на диске. Также требуется подключение к Internet для получения триальной лицензии.

Сразу же после установки, мы становимся счастливыми обладателями инструментальной среды, в которой мы можем отлаживать наши приложения под Windows (с нормальной производительностью, а не так как это делает эмулятор Android-а) и собирать их под несколько мобильных платформ, включая Android и iOS. Также имеется весьма неплохой хелп по API, и набор примеров, включающий в себя, помимо прочего, две полноценные игры (2D тетрис и 3D гонки). Из информационных ресурсов, заслуживает упоминания Marmalade SDK Tutorials. Также, имеется несколько статей на Хабре и GameDev.

К (относительно) грустным моментам относится то, что программировать придется на C++ (стало быть придется отвыкать от всякой халявы типа сборщика мусора) и делать это придется довольно низкоуровнево. С последним можно бороться, используя какой-нибудь фреймворк. Разумеется, можно поискать готовый, но (помимо других) у него заведомо будет фатальный недостаток - он написан не нами !!!

Собственно от фреймворка нам требуется не так много и, чтобы это осознать, полезно составить список функциональных требований. Итак, он должен:
  1. Быть событийно-ориентированным и, в том числе, поддерживать отложенные события (выполняющиеся через заданное количество миллисекунд)
  2. Поддерживать анимацию 2D-спрайтов, включающую их плавное перемещение, масштабирование и циклическое изменение картинки
  3. Поддерживать одновременную анимацию нескольких спрайтов
  4. Обрабатывать события touchPad-а (с корректной обработкой MultiTouch) и клавиатуры
  5. Поддерживать управление проигрыванием фоновой музыки и звуковыми эффектами (в том числе с проигрыванием нескольких звуков одновременно)
Спустя некоторое время, разрабатываем дизайн нашего фреймворка:



В нем имеется множественное наследование (мало того, в нем имеется diamond problem) и я этим совсем не горд :( Тем не менее, по другому у меня не получилось. Будем держать в голове, что эта проблема нам еще не раз аукнется и продолжим жить дальше. Рассмотрим основные моменты нашего дизайна:


Класс
Назначение
IObject
Интерфейс работы с событиями
  • sendMessage – получение сообщения
  • isBuzy – проверка занятости объекта (объект занят если обрабатывает или готовиться к обработке какого-то события)
  • refresh – отображение объекта
  • update – обработка изменения состояния объекта с течением времени
IScreenObject
Интерфейс объекта, имеющего экранное отображение
  • getXPos – текущая координата по горизонтали
  • getYPos – текущая координата по вертикали
  • getWidth – ширина отображаемого объекта
  • getHeight – высота отображаемого объекта
ISprite
Интерфейс спрайта
  • getState – получение текущего состояния спрайта
  • addImage – сопоставление графического ресурса некоторому состоянию спрайта
  • getImage – получение картинки для заданного состояния
IAnimatedSprite
Интерфейс анимированного спрайта
  • isValidMessage – проверка того, что сообщение с заданным кодом может быть обработано спрайтом
  • doMessage – обработка сообщения
ISpriteOwner
Интерфейс контейнера, содержащего набор спрайтов
  • addSprite – добавление спрайта в контейнер
  • setZOrder – изменение положения спрайта в последовательности, задающей порядок отрисовки
  • getDesktopWidth – получение ширины экрана устройства
  • getDesktopHeight – получение высоты экрана устройства
  • getXSize – пересчет размера по горизонтали из логических координат в экранные
  • getYSize – пересчет размера по вертикали из логических координат в экранные
  • getXPos – получение логической координаты спрайта по горизонтали, с учетом координат всех содержащих его контейнеров
  • getYPos – получение логической координаты спрайта по вертикали, с учетом координат всех содержащих его контейнеров
AbstractScreenObject
Абстрактная реализация экранного объекта
  • getId – получение уникального идентификатора объекта
  • incrementUsage – увеличения счетчика ссылок на объект
  • decrementUsage – уменьшение счетчика ссылок на объект
  • isBackground – проверка того, что объект является фоновым рисунком
Sprite
Реализация спрайта, предоставляющего возможности по отображению изображения его, перемещению, масштабированию и пр.
Background
Фоновое изображение
AnimatedSprite
Реализация анимированного спрайта, включающая обработку системных событий, а также управлением отображения различных картинок, в зависимости от состояния спрайта
AbstractSpriteOwner
Абстрактная реализация контейнера спрайтов
CompositeSprite
Реализация составного спрайта, которым можно управлять как единым целым
Scene
Описание сцены, представляющей собой набор загруженных спрайтов
Desktop
Синглтон, предоставляющий информацию о физических размерах экрана устройства и управляющий отображением текущей сцены
Locale
Системный класс, предоставляющий информацию о локализации

Более подробно эти, и другие, классы мы рассмотрим в следующих статьях, в которых приступим к реализации фреймворка.

2 комментария:

  1. К (относительно) грустным моментам относится то, что программировать придется на C++... Что за бред? Это наоборот отлично что не на яве, NET и т.п. мути а на С++!

    ОтветитьУдалить
    Ответы
    1. Лично мне C++ тоже нравится больше, но я лично знаю людей, которым больше нравится Ява (для них C++ относительно грустен)
      Вообще-же имелась в виду отличие от предыдущего цикла статей, в котором разработка велась на Java

      Удалить