Дата: 19.07.2011       |  Александр «herfleisch» Перечнев | Сайт: perechnev.com | Хакер №5/11

Ни для кого не секрет, что кодинг для мобильников — дело интересное, прибыльное и перспективное. Я всегда запускаю на КПК какую-нибудь игру, когда спускаюсь в метро, то же самое делают и окружающие меня люди. Но, к сожалению, нынешнее разнообразие платформ часто заставляет нас ограничить круг поддерживаемых устройств.

Что мы имеем?
Компания Ideaworks Labs позаботилась о нас и создала AirPlaySDK. Данный инструментарий позволяет написать код на C++ один раз и компилировать его в нативные приложения для платформ iPhone OS, Android, Samsung Bada, Symbian, Windows Mobile, BREW, Palm/HP WebOS и Maemo. Ну как, впечатляет? Кроме того, AirPlaySDK имеет отличную документацию (правда, на английском языке) и позволяет использовать уникальные особенности той или иной платформы. Ты можешь бесплатно скачать AirPlaySDK с сайта airplaysdk.com и попробовать, a можешь и купить Indie-лицензию всего лишь за 99$.

Создание проекта
AirPlaySDK позволяет писать приложения в Windows или в Mac OS, а также хорошо интегрируется с Visual Studio (начиная с версии 6.0) и XCode соответственно. Я буду ориентироваться на Visual Studio, но уверен, что для XCode все будет выглядеть ничуть не сложнее. Итак, ты скачал и установил AirPlaySDK и Visual Studio. Создай папку "HelloWorld" в каком-нибудь месте своего диска. Именно в этой папке будет размещаться наш первый проект.

Главным файлом всего решения является HelloWorld.mkb в папке HelloWorld, создадим его и откроем для редактирования, а затем впишем туда следующее содержимое:

options {
s3e-data-dir="data"
}
files {
    (source)
    HelloWorld.cpp
    HelloWorld.h
    HelloWorldMain.cpp
}
subprojects {
iw2d
}

Здесь параметр s3e-data-dir секции options определяет папку, в которой будут находиться ресурсы будущего приложения. Это могут быть изображения, музыка или что-нибудь еще. Создай объявленную нами папку data в папке HelloWorld. Секция files содержит список файлов проекта. В скобках мы указали папку source, которую тоже следует создать. В нее мы поместим три файла: HelloWorld.cpp, HelloWorld.h и HelloWorldMain.cpp. В секции subprojects находятся названия библиотек, которые мы хотим использовать в своем проекте.

Кроссплатформенный "Hello World!"
Итак, подготовка проекта закончена, и мы можем приступить к программированию. Для этого щелкни два раза на файле HelloWorld.mkb и насладись логотипом AirPlaySDK. Насладился? Это еще не все, ведь затем перед твоими глазами откроется проект в Visual Studio. Вбей в файл HelloWorldMain.cpp код "HelloWorldMain.cpp", а я потом поясню, что тут к чему.

#include "s3e.h"
#include "HelloWorld.h"
int main()
{
    GameInit();
    while (true)
    {
        s3eDeviceYield(0);
        s3eKeyboardUpdate();
        bool result = GameUpdate();
        if ((result == false) || (s3eKeyboardGetState(s3eKeyEsc) & S3E_KEY_STATE_DOWN) || s3eKeyboardGetState(s3eKeyLSK) & S3E_KEY_STATE_DOWN) || (s3eDeviceCheckQuitRequest()))
        break;
        GameRender();
    }
    GameShutdown();
}

С помощью директивы #include s3e.h мы подключаем стандартный заголовочный файл AirPlaySDK, который дает нам возможность работать с мобильным устройством. Функцию GameInit() мы напишем сами. Она будет инициализировать нужные нам переменные, создавать объекты, загружать ресурсы и выполнять прочие действия сразу же при старте программы. Функция s3eDeviceYield(..) останавливает работу устройства на указанное в параметре время и дает операционной системе возможность выполнить какие-нибудь действия. В качестве параметра этой функции мы передали ноль, и потому получим минимально возможную задержку, разрешенную операционной системой. s3eKeyboardUpdate() обновляет информацию о текущем состоянии клавиш мобильника и проверяет, не нажимал ли пользователь какие-либо клавиши во время прохода цикла. Функцию GetUpdate() мы тоже напишем сами. В ней обычно размещается вся логика работы приложения. Если ты пишешь игру — то в этой функции следует проверять, не умер ли очередной монстр после выстрела пользователя. Функция возвращает true, если приложение продолжает свою работу, и false, если, например, пользователь нажал "Выйти из игры". Далее следует проверка, не захотел ли пользователь выйти из приложения, нажав соответствующий пункт меню или клавишу телефона, и не просит ли операционная система наше приложение завершиться (в случае положительного результата завершается главный цикл). Если же приложение должно продолжить работу — идем дальше. В GameRender(), которую мы опять же создадим самостоятельно, идет отрисовка всего и вся на экран. И, наконец, GameShutdown() (уже четвертая пока что несуществующая функция) завершает работу нашего приложения, сохраняя результаты, освобождая память и совершая прочие необходимые операции.

Ну что же, главную функцию приложения мы разобрали. Стоит отметить, что файл HelloWorldMain.cpp — это шаблон. Такой файл с практически тем же содержанием будет присутствовать во всех проектах, которые ты будешь создавать при помощи AirPlaySDK.

Кроме двухмерной графики AirPlaySDK дает возможность создавать трехмерные игры, работать с GPS, звуками, списками контактов, сетью, видео и кучей других штучек.

Описываем логику приложения
Теперь самое время заняться функциями, которые будут определять непосредственно логику приложения. Для этого открой файл HelloWorld.cpp и вбей туда код "HelloWorld.cpp":

#include "Iw2D.h"
void GameInit()
{
    Iw2DInit();
}
bool GameUpdate()
{
    return true;
}
void GameRender()
{
    Iw2DSetColour(0xFF000000);
    Iw2DFillRect(CIwSVec2(0, 0), CIwSVec2(Iw2DGetSurfaceWidth(), Iw2DGetSurfaceHeight()));
    Iw2DSetColour(0xFF00FF00);
    Iw2DFillArc(CIwSVec2(Iw2DGetSurfaceWidth()/2, Iw2DGetSurfaceHeight()/2), CIwSVec2(30, 30), 0, 0x800 * 2);
    Iw2DSurfaceShow();
}
void GameShutdown()
{
    Iw2DTerminate();
}

Как ты уже заметил, код файла HelloWorld.cpp содержит те функции, которые я обещал описать. Ничего сложного в этом листинге нет. Он всего лишь закрашивает экран черным цветом и выводит посередине зеленый круг.

Теперь стоит описать прототипы этих функций в заголовочном файле HelloWorld.h, чтобы иметь возможность их вызова из главной функции main(). Выглядеть это будет следующим образом:

#ifndef HELLOWORLD_H
#define HELLOWORLD_H
void GameInit();
bool GameUpdate();
void GameRender();
void GameShutdown();
#endif

Листинг в комментариях не нуждается. Код нашего приложения готов, и ты можешь запустить его на исполнение, нажав клавишу F5 в Visual Studio. Перед тобой откроется окно эмулятора, которое продемонстрирует наше первое творение на AirPlaySDK.

Warning
Не переусердствуй, сидя за компьютером. Обязательно выходи на улицу, чтобы размяться и подышать свежим воздухом, а заодно купить свежий номер ][ :).

Сборка проекта
Ну что же, настало время продемонстрировать главное преимущество AirPlaySDK — переносимость приложений с одной платформы на другую. Выбери "GCC (ARM) Release" в качестве активной конфигурации проекта и нажми F5. Перед тобой появится окно Airplay System Deployment Tool. Отметь пункт "ARM GCC Release" и нажми "Next". Следующий шаг пока что не представляет для нас ничего интересного, поэтому нажми "Next" еще разок. Вот тут-то и требуется отметить то многообразие платформ, под которое мы хотим скомпилировать наше приложение. Давай отметим ОС Bada, нажмем "Deploy All" и подождем окончания компиляции нашего проекта. На этом создание первого приложения на основе AirPlaySDK окончено. Теперь самое время почитать документацию по этому инструментарию, ведь он поддерживает огромное количество функций мобильных устройств, которые ты можешь использовать в своих приложениях!

Links
На сайте проекта AirPlaySDK можно скачать весь инструментарий, а также найти качественную документацию: airplaysdk.com.
Есть такой сайт, где мелкомягкие бесплатно раздают Visual Studio студентам: dreamspark.com.