688

WordPress.com · 2014-04-13 · рование звука и графики, использование математики и физики, а также пугающую вещь

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

  • Марио Цехнер

    Программирование игр под AndroidПеревели с английского Егор Сидорович и Евгений Зазноба

    Заведующая редакцией К. ГалицкаяРуководитель проекта Д. ВиницкийВедущий редактор Е. КаляеваНаучные редакторы О. Трафимович, Ю. ЗаровскийХудожник К. РадзевичКорректоры О. Андросик, Е. ПавловичВерстка Г. Блинов

    ББК 32.973.2-018.2УДК 004.451

    Цехнер МариоП78 ПрограммированиеигрподAndroid.—СПб.:Питер,2013.—688с.:ил.

    ISBN 978-5-459-01554-6Из данной книги вы узнаете все необходимое, чтобы стать успешным разработчиком под Android.

    Вы начнете обучение с фундаментальных вопросов проектирования игр и с основ программирования, а потом перейдете к созданию игрового движка и интересных игр. Этой информации вам будет до-статочно, чтобы приступить к творческой работе и создавать собственные приложения для Android. В книге подробно описан весь процесс создания отличных игр для платформы Android. Вы узнаете, как настроить и использовать инструменты для разработки в Android, получите информацию о класси-ческом программировании двухмерных игр и создании собственных завораживающих экшенов и игр-платформеров. В издании рассмотрены графика и аудио для Android, игровая механика (обнаружение соударений, физика и спрайтовая анимация), а также добавление в игры трехмерных эффектов. Кроме того, описано, как опубликовать игру, получать сообщения об отказах программы и организовать тех-ническую поддержку для пользователей.

    ISBN978-1430230427англ. ©2011byMarioZechner.AllrightsreservedISBN978-5-459-01554-6 ©ПереводнарусскийязыкОООИздательство«Питер»,2013 ©Изданиенарусскомязыке,оформлениеОООИздательство

    «Питер»,2013

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

    ООО «Мир книг», 198206, Санкт-Петербург, Петергофское шоссе, 73, лит. А29.Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2;

    95 3005 — литература учебная.Подписано в печать 22.08.12. Формат 70х100/16. Усл. п. л. 55,470. Тираж 1500. Заказ

    Отпечатано с готовых диапозитивов в ГППО «Псковская областная типография». 180004, Псков, ул. Ротная, 34.

  • Краткое содержание

    Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16

    Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18

    О техническом редакторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19

    Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20

    От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21

    Глава 1. Android: новенький в классе . . . . . . . . . . . . . . . . . . . . . . . . . .22

    Глава 2. Первые шаги с Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . .42

    Глава 3. Разработка игр 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67

    Глава 4. Android для разработчиков игр . . . . . . . . . . . . . . . . . . . . . .116

    Глава 5. Android Game Development Framework . . . . . . . . . . . . . . . . .199

    Глава 6. «Мистер Ном» покоряет Android . . . . . . . . . . . . . . . . . . . . . .246

    Глава 7. OpenGL ES: первое представление . . . . . . . . . . . . . . . . . . . .288

    Глава 8. Трюки при разработке 2D-игр . . . . . . . . . . . . . . . . . . . . . . .375

    Глава 9. «Большой прыгун»: двухмерная игра, написанная с помощью OpenGL ES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .458

    Глава 10. OpenGL ES: займемся 3D . . . . . . . . . . . . . . . . . . . . . . . . . .522

    Глава 11. Трюки при разработке 3D-игр . . . . . . . . . . . . . . . . . . . . . .563

    Глава 12. Droid Invaders: большой финал . . . . . . . . . . . . . . . . . . . . .622

    Глава 13. Публикуем вашу игру . . . . . . . . . . . . . . . . . . . . . . . . . . . . .673

    Глава 14. Что дальше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .684

  • Оглавление

    Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Целевая аудитория . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Как построена эта книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Как получить исходные коды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    О техническом редакторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

    От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    Глава 1. Android: новенький в классе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Краткая история Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Разделение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Роль Google . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    Android Open Source Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Android Market . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Соревнования, распространение устройств и Google I/O . . . . . . . . . . . 26

    Возможности и архитектура Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Ядро . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Среда выполнения и Dalvik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Системные библиотеки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Фреймворк приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    Software Development Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Сообщество разработчиков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Устройства, устройства, устройства! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    Аппаратная составляющая . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Первое поколение, второе поколение, следующее поколение . . . . . . 33

    Игры для мобильников — особая штука . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Игровая консоль в каждом кармане . . . . . . . . . . . . . . . . . . . . . . . . . . 38Всегда на связи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

  • Оглавление 7

    Простые и крутые . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Крупный рынок, мелкие разработчики . . . . . . . . . . . . . . . . . . . . . . . . 40

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    Глава 2. Первые шаги с Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Настройка среды разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    Настройка JDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Настройка Android SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Установка Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Установка плагина ADT для Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Краткий обзор среды Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    Hello World в стиле Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Создание проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Исследование проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Написание кода приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    Запуск и отладка приложений Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Подключение устройства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Создание виртуального устройства Android . . . . . . . . . . . . . . . . . . . . 55Запуск приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Отладка приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59LogCat и DDMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62Использование ADB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    Глава 3. Разработка игр 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67Жанры: на любой вкус . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Казуальные игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Головоломки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Аркады и активные игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71«Защита башни» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Что-то новенькое . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    Дизайн игры: карандаш сильнее кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Основная механика игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Сюжет и оформление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Экраны и трансформации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

    Код: скучная рутина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Управление приложением и окнами . . . . . . . . . . . . . . . . . . . . . . . . . . 84Ввод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Файловый ввод-вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

  • 8 Оглавление

    Звук . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Графика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Игровая среда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115

    Глава 4. Android для разработчиков игр . . . . . . . . . . . . . . . . . . . . . . . . . . .116Определение приложения Android: файл манифеста . . . . . . . . . . . . . . . . . . .116

    Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .120Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .123Элемент . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125Настройка проекта игры на Android за 10 простых шагов . . . . . . . . . .125Назначение значка для вашей игры . . . . . . . . . . . . . . . . . . . . . . . . . .127

    Основы Android API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .128Создание тестового проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129Жизненный цикл активности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .133Поддержка устройств ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140Поддержка файловой системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157Обработка звука . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .163Потоковая музыка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .168Основы программирования графики . . . . . . . . . . . . . . . . . . . . . . . . . .172

    Полезные советы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .197Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .198

    Глава 5. Android Game Development Framework . . . . . . . . . . . . . . . . . . . . .199План атаки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199Класс AndroidFileIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .200AndroidAudio, AndroidSound и AndroidMusic — все о звуке! . . . . . . . . . . . . . . .201AndroidInput и AccelerometerHandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .207

    AccelerometerHandler: что сверху? . . . . . . . . . . . . . . . . . . . . . . . . . . .207Класс Pool: используем повторно! . . . . . . . . . . . . . . . . . . . . . . . . . . .209KeyboardHandler: вверх, вверх, вниз, вниз, влево, вправо… . . . . . . . .211Обработчики касаний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .216AndroidInput: отличный координатор . . . . . . . . . . . . . . . . . . . . . . . . .223

    AndroidGraphics и AndroidPixmap: двойная радуга . . . . . . . . . . . . . . . . . . . . . .226Обработка различных размеров экрана и разрешений . . . . . . . . . . . .226AndroidPixmap: пикселы для каждого . . . . . . . . . . . . . . . . . . . . . . . . .232

  • Оглавление 9

    AndroidGraphics: то, что нужно для рисования . . . . . . . . . . . . . . . . . .233AndroidFastRenderView: собрать-растянуть, собрать-растянуть . . . . . .237

    AndroidGame: свяжем все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .240Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .245

    Глава 6. «Мистер Ном» покоряет Android . . . . . . . . . . . . . . . . . . . . . . . . . .246Создание ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246Настройка проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .248MrNomGame: основная активность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .249

    Ресурсы: удобное хранилище ресурсов . . . . . . . . . . . . . . . . . . . . . . .249Настройки: сохранение пользовательских настроек

    и таблицы рекордов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .251LoadingScreen: получение ресурсов с накопителя . . . . . . . . . . . . . . . .253

    Главное меню . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .255Класс(ы) HelpScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .258Экран рекордов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .260

    Отрисовка чисел: краткое введение . . . . . . . . . . . . . . . . . . . . . . . . . .261Реализация экрана . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .263

    Абстрагирование… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .266Абстрагирование мира мистера Нома: модель, вид, контроллер . . . . .266Класс GameScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .279

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .287

    Глава 7. OpenGL ES: первое представление . . . . . . . . . . . . . . . . . . . . . . . .288Что такое OpenGL ES и почему об этом стоит задуматься . . . . . . . . . . . . . . . .288

    Модель разработки: аналогия . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289Проекции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .291Нормализованное пространство устройства и область просмотра . . . .293Матрицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .294Конвейер визуализации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .295

    Перед стартом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296GLSurfaceView: облегчает жизнь с 2008 года . . . . . . . . . . . . . . . . . . . . . . . . .297GLGame: реализация игрового интерфейса . . . . . . . . . . . . . . . . . . . . . . . . . .300Мама, смотри: я нарисовал красный треугольник! . . . . . . . . . . . . . . . . . . . . .308

    Определение области просмотра . . . . . . . . . . . . . . . . . . . . . . . . . . . .309Определение матрицы проекции . . . . . . . . . . . . . . . . . . . . . . . . . . . .309Определение треугольников . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313Все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317

    Определение цвета вершины . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321

  • 10 Оглавление

    Обработка текстур: легкая работа с фоновыми рисунками . . . . . . . . . . . . . . .325

    Координаты текстур . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .325

    Загрузка растровых изображений . . . . . . . . . . . . . . . . . . . . . . . . . . .327

    Фильтрация текстур . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .329

    Удаление текстур . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330

    Полезный фрагмент кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330

    Активация текстурирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331

    Все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331

    Класс Texture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .334

    Индексированные вершины: используем повторно . . . . . . . . . . . . . . . . . . . . .336

    Все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .338

    Класс Vertices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340

    Альфа-смешивание: я вижу тебя насквозь . . . . . . . . . . . . . . . . . . . . . . . . . . .343

    Другие примитивы: точки, линии, полоски и конусы . . . . . . . . . . . . . . . . . . .347

    2D-преобразования: матрица «Модель — представление» . . . . . . . . . . . . . . .349

    Пространство мира и модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .349

    Снова матрицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .351

    Первый пример с использованием переноса . . . . . . . . . . . . . . . . . . . .352

    Другие преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .357

    Оптимизация производительности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361

    Измерение частоты кадров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .361

    Любопытный случай с Hero на Android 1.5 . . . . . . . . . . . . . . . . . . . . .363

    Почему OpenGL ES-рендеринг такой медленный? . . . . . . . . . . . . . . . .363

    Убираем ненужные изменения состояний . . . . . . . . . . . . . . . . . . . . . .365

    Уменьшение размера текстуры — выбираем меньше пикселов . . . . . .367

    Уменьшаем количество вызовов методов OpenGL ES/JNI . . . . . . . . . .368

    Концепция связывания вершин . . . . . . . . . . . . . . . . . . . . . . . . . . . . .369

    В заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .372

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .373

    Глава 8. Трюки при разработке 2D-игр . . . . . . . . . . . . . . . . . . . . . . . . . . . .375Перед стартом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .375

    Сначала был вектор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .376

    Работа с векторами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .377

    Немного тригонометрии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .379

    Реализация класса Vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .381

    Простой пример использования . . . . . . . . . . . . . . . . . . . . . . . . . . . . .385

  • Оглавление 11

    Немного 2D-физики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .390Ньютон и Эйлер — друзья навек . . . . . . . . . . . . . . . . . . . . . . . . . . . .390Сила и масса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .392Манипулируем теоретически . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .392Манипулируем на практике . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .393

    Определение столкновений и представление объектов в 2D . . . . . . . . . . . . .398Ограничивающие фигуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .398Создание ограничивающих фигур . . . . . . . . . . . . . . . . . . . . . . . . . . .401Атрибуты игровых объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .404Широкая и узкая фазы определения столкновений . . . . . . . . . . . . . .405Усложненный пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .412

    Камера в 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .426Класс Camera2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .430Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .431Атлас текстур: не ленись — поделись . . . . . . . . . . . . . . . . . . . . . . . .433

    Фрагменты текстур, спрайты и пакеты: скрываем OpenGL ES . . . . . . . . . . . . .439Класс TextureRegion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .440Класс SpriteBatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .441Используем класс SpriteBatcher . . . . . . . . . . . . . . . . . . . . . . . . . . . . .447

    Спрайт-анимация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .451Класс Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .452Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .453

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .457

    Глава 9. «Большой прыгун»: двухмерная игра, написанная с помощью OpenGL ES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .458Основная игровая механика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .458Предыстория и стиль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .460Экраны и переходы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .460Определение игрового мира . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .462Создание ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .465

    Элементы пользовательского интерфейса . . . . . . . . . . . . . . . . . . . . .465Обработка текста с помощью растровых шрифтов . . . . . . . . . . . . . . .467Элементы игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .470Атлас текстур спешит на помощь . . . . . . . . . . . . . . . . . . . . . . . . . . . .472Музыка и звук . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .473

    Реализация «Большого прыгуна» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .473Класс Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .473Класс Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .477

  • 12 Оглавление

    Основная активность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .478Класс Font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .479Экран GL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .481Экран главного меню . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .482Экраны помощи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .485Экран лучших результатов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .488Классы эмуляции игрового мира . . . . . . . . . . . . . . . . . . . . . . . . . . . .491Игровой экран . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .508Класс WorldRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .516

    Оптимизировать или не оптимизировать? . . . . . . . . . . . . . . . . . . . . . . . . . . .520Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .521

    Глава 10. OpenGL ES: займемся 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .522Перед стартом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .522Вершины в 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .523

    Vertices3: сохраняем 3D-координаты . . . . . . . . . . . . . . . . . . . . . . . . .523Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .526

    Перспективная проекция: ближе, больше . . . . . . . . . . . . . . . . . . . . . . . . . . .529Z-буфер: наводим порядок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .532

    Исправляем последний пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . .533Смешиваем: за вами ничего нет . . . . . . . . . . . . . . . . . . . . . . . . . . . . .535Точность z-буфера и z-схватка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .538

    Определяем 3D-ячейки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .540Куб: Hello World в 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .540Пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .543

    Снова матрицы и преобразования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .547Матричный стек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .547Иерархическая структура матричного стека . . . . . . . . . . . . . . . . . . . .550Простая система камер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .557

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .562

    Глава 11. Трюки при разработке 3D-игр . . . . . . . . . . . . . . . . . . . . . . . . . . .563Перед стартом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .563Векторы в 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .564Освещение в OpenGL ES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .569

    Как работает освещение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .569Источники освещения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .571Материалы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .572

  • Оглавление 13

    Как OpenGL ES рассчитывает освещение: нормали вершин . . . . . . . . .573На практике . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .574Несколько примечаний к освещению в OpenGL ES . . . . . . . . . . . . . . .589

    Mip-текстурирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .590Простые камеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .595

    Камера с видом от первого лица (Эйлерова камера) . . . . . . . . . . . . . .595Пример работы с Эйлеровой камерой . . . . . . . . . . . . . . . . . . . . . . . . .599Камера с видом от третьего лица . . . . . . . . . . . . . . . . . . . . . . . . . . . .605

    Загрузка моделей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .607Формат Wavefront OBJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .608Реализация загрузчика файлов формата OBJ . . . . . . . . . . . . . . . . . . .609Использование класса OBJ Loader . . . . . . . . . . . . . . . . . . . . . . . . . . .614Несколько замечаний по загрузке моделей . . . . . . . . . . . . . . . . . . . .615

    Немного физики в 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .615Определение столкновений и представление объектов в 3D . . . . . . . . . . . . .616

    Ограничивающие фигуры в 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .617Проверка пересечения ограничивающих сфер . . . . . . . . . . . . . . . . . .617Классы GameObject3D и DynamicGameObject3D . . . . . . . . . . . . . . . . .619

    Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .620

    Глава 12. Droid Invaders: большой финал . . . . . . . . . . . . . . . . . . . . . . . . . .622Основы игровой механики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .622Сюжет и художественное оформление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .624Экраны и переходы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .624Определение игрового мира . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .626Создание ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .627

    Активы пользовательского интерфейса . . . . . . . . . . . . . . . . . . . . . . .627Игровые ресурсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .629Звук и музыка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .631

    План разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .631Класс Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .631Класс Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .635Основная активность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .636Экран главного меню . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .637Экран настроек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .640Классы эмуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .643

    Класс Shield . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .644Класс Shot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .644

  • 14 Оглавление

    Класс Ship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .645Класс Invader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .647Класс World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .651

    Класс GameScreen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .657Класс WorldRenderer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .665Оптимизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .671Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .672

    Глава 13. Публикуем вашу игру . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .673Несколько слов о тестировании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .673Становимся зарегистрированным разработчиком . . . . . . . . . . . . . . . . . . . . . .674Подписываем APK-файл вашей игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .675Размещение игры на Android Market . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .679

    Загрузка ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .680Описание деталей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .680Настройки публикации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .681Публикуем! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .681Маркетинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .682

    Консоль разработчика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .682Подводя итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .683

    Глава 14. Что дальше? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .684Становимся социальными . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .684Определение местоположения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .684Многопользовательская функциональность . . . . . . . . . . . . . . . . . . . . . . . . . .685OpenGL ES 2.0 и выше . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .685Фреймворки и движки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .685Ресурсы в сети Интернет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .687Завершающие слова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .687

  • Моим кумирам — маме и папе и любви моей жизни — Стефании

  • Введение

    Добро пожаловать в мир разработки игр для платформы Android. Меня зовут Марио, я буду вашим гидом в течение следующих 14 глав. Вы здесь для того, чтобы узнать больше о разработке игр для Android, и я надеюсь, что стану тем, кто помо-жет вам реализовать ваши идеи.

    Мы рассмотрим широкий спектр тем и вопросов: основы Android, программи-рование звука и графики, использование математики и физики, а также пугающую вещь под названием OpenGL ES. На основании всех этих знаний мы создадим три разные игры, одна из которых будет выполнена в 3D.

    Разработка игр — несложная задача, если вы знаете, что делаете. Поэтому я ста-рался представить материал в таком виде, чтобы вы не просто брали из него полез-ные блоки программного кода, но и понимали общую картину процесса разработ-ки игр. Осознание основных принципов — ключ к реализации сложных игровых концепций. Вы сможете не только создавать игры, похожие на примеры из этой книги, но получите достаточно знаний, чтобы использовать материал из Интерне-та и других книг для реализации ваших самых смелых идей в разработке игр.

    Целевая аудиторияЭта книга адресована в первую очередь начинающим разработчикам игр. Вы мо-жете приступать к созданию игр, не обладая каким-либо знанием о предмете. Я проведу вас с самого начала. Однако я рассчитываю на ваше (пусть самое неболь-шое) знакомство с Java. Других требований у меня нет — знакомство с Android и Eclipse также не требуется!

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

    Как построена эта книгаВ книге использован интерактивный подход, благодаря которому вы постепенно, но уверенно пройдете путь от самых основ до экзотических усовершенствований (вплоть до использования аппаратного ускорения). В ходе изучения глав вы созда-дите повторно используемую программную базу, поэтому я советую изучать главы по порядку. Конечно, более опытные читатели могут пропускать некоторые разделы,

  • 17Введение

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

    Как получить исходные кодыЭта книга построена по принципу «все в одном»; весь необходимый для запуска примеров и игр код содержится в ней самой. Но копировать листинги из книги в Eclipse — не самая удачная мысль. Кроме того, игры состоят не только из кода, но и из активов, которые вы не сможете скопировать из книги. Процесс набора кода из книги в Eclipse может привести к появлению ошибок. Роберт (технический рецензент книги) и я позаботились о том, чтобы в листингах этой книги не было ошибок, но барабашки не дремлют.

    Чтобы облегчить вам процесс, я создал проект в Google Code, содержащий сле-дующие элементы.

    Весь программный код и активы под лицензией GPL 3, доступные из репозито-рия Subversion проекта.

    Небольшое текстовое руководство, описывающее процесс импорта проектов в Eclipse, а также видеоролик, демонстрирующий то же самое.

    Трекер возникающих проблем, с помощью которого вы можете сообщать обо всех ошибках в самой книге или в программном коде. После помещения описа-ния проблемы в трекере я смогу разместить исправленные версии в репозитории Subversion. Таким образом, вы всегда будете обладать актуальной, лишенной ошибок (надеюсь) версией кода из данной книги, которой смогут пользоваться и другие читатели.

    Группа обсуждения книги, вступить в которую может каждый. Я, конечно, тоже буду там.

    Для каждой главы, содержащей программный код, в репозитории Subversion имеется аналогичный проект Eclipse. Проекты независимы друг от друга, посколь-ку в каждой последующей главе мы наращиваем созданный в предыдущих главах функционал. Код для глав 5 и 6 содержится в проекте ch06-mrnom.

    Google Code-проект размещен по адресу http://code.google.com/p/beginning-android-games.

  • Об авторе

    В настоящее время Марио Цехнер работает программистом в компании R&D, а по вечерам преображается в самозабвенного разработчика игр. Он выпускает их под маркой Badlogic Games. Он написал игру Newton для Android, Quantum для Windows, Linux и Mac OS X, а также массу других небольших игр. В настоящее время он работает над свободным кроссплатформенным решением для разработки игр, которое называется libgdx. Кроме программирования он также активно за-libgdx. Кроме программирования он также активно за-. Кроме программирования он также активно за-нимается подготовкой руководств и написанием статей, посвященных разработке игр. Эти материалы можно найти в Интернете, в частности в блоге Марио (http://www.badlogicgames.com/wordpress).

  • О техническом редакторе

    Роберт Грин — независимый разработчик видеоигр из Портленда, штат Орегон, США. Свои работы он выпускает под маркой Battery Powered Games. Он написал шесть игр для Android, в том числе Deadly Chambers, Antigen, Wixel, Light Racer и Light Racer 3D. Прежде чем полностью посвятить себя разработке мобильных игр, Роберт трудился в софтверных компаниях в Миннеаполисе и Чикаго, в том числе в IBM Interactive. В настоящее время Роберт занимается кроссплатформенной разработкой игр и проблемами повышения производительности, связанными с мо-бильными играми.

  • Благодарности

    Хотелось бы поблагодарить команду Apress, так как без них эта книга бы не состо-ялась. В частности, искренне благодарю Кэндис Инглиш и Адама Хиза, моих по-трясающих редакторов, которые неустанно отвечали на все мои наивные вопросы. Мэтью Муди помог мне правильно структурировать разделы, давал ценнейшие подсказки и предложения, благодаря которым книга стала значительно лучше. Благодарю Деймона Ларсона и Джеймса Комптона, великодушных людей, испра-вивших мои многочисленные грамматические ошибки. Спасибо, ребята, работать с вами было исключительно приятно.

    Спасибо моему дорогому Роберту Грину, который выполнил техническую ре-дактуру этой книги. Он позаботился о том, чтобы мои искания были описаны технически верно. Кроме того, он стал моим мальчиком для битья — если читатели найдут в книге ошибки или недочеты, значит, их не нашел Роберт.

    Еще остается поблагодарить всех моих друзей по всему миру, которые делились со мной идеями и отзывами — иногда было так интересно, что я не замечал, что снова засиделся за работой до трех утра. Мои личные благодарности адресованы Натану Свиту, Дэйву Клейтону, Дэйву Фраска, Морицу Посту, Кристофу Уидуллу и Тому Вонгу — эти программеры-спецы трудятся вместе со мной над libgdx; Джону Филу и Али Мосавиану — вместе с ними мы работали программистами в Швеции. Кроме того, благодарю Романа Керна и Маркуса Мура — коллег по моей нынешней работе.

    И наконец, огромной благодарности достойна Стефания, моя любимая, которая часто ночевала одна, пока я работал над книгой, и нашла в себе силы с этим мирить-ся. Кроме того, она простила мне мою излишнюю раздражительность. Спасибо!

  • От издательства

    Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты [email protected] (издательство «Питер», компьютерная редакция).

    Мы будем рады узнать ваше мнение!На сайте издательства http://www.piter.com вы найдете подробную информацию

    о наших книгах.

  • 1 Android: новенький в классеБудучи ребенком начала 1990-х, я рос вместе со своей верной приставкой Nintendo Game Boy. Я потратил бесчисленные часы, помогая Марио спасти принцессу, пы-таясь улучшить свой результат в «Тетрисе» и гоняясь со своими друзьями в RC Pro-Am с джойстиком в руках. Я брал этот потрясающий гаджет с собой, куда бы ни шел. Пристрастие к играм вызвало у меня желание создавать собственные миры и делиться ими со своими друзьями. Я начал программировать на PC, но вскоре обнаружил, что не могу закачать свои шедевры на Game Boy. Мой программистский энтузиазм начал угасать. Да еще и Game Boy сломался…

    Перенесемся в 2010 год. Смартфоны становятся новой мобильной игровой платформой, соревнуясь с классическими карманными игровыми системами вроде Nintendo DS или Playstation Portable. Мой интерес к этой теме вернулся, и я начал исследовать, соответствуют ли мобильные платформы моим потреб-ностям разработчика. iOS от Apple выглядела хорошим кандидатом для разра-ботки. Однако я быстро обнаружил, что это не открытая система — я мог делить-ся своими продуктами с друзьями, только если Apple позволит мне это, к тому же для разработки нужен был Mac. Затем я обнаружил платформу Android и не-медленно в нее влюбился. Ее среда разработки работает на всех крупных плат-формах без каких-то ограничений. У нее есть живое сообщество разработчиков, в котором всегда будут рады вам помочь решить проблему, а также предоставить исчерпывающую документацию. Я могу делиться своими играми с кем угодно без какой-либо платы за это, а если захочу на этом заработать, то могу опублико-вать свое творение на глобальном ресурсе с миллионами пользователей за счи-танные минуты.

    Единственное, что мне оставалось неясным, — как писать игры для Android и как воспользоваться моими знаниями о разработке игр для PC для этой но-вой платформы. В последующих главах я поделюсь с вами своим опытом и по-могу вам начать разрабатывать игры для Android. У меня есть и дополнительная, эгоистичная цель — я хочу, чтобы было больше игр, в которые я мог бы поиг-рать!

    Итак, начнем знакомство с нашим новым другом — Android.

  • 23Краткая история Android

    Краткая история AndroidПервое громкое упоминание Android прозвучало в 2005 году, когда Google приоб-рел маленький стартап-проект Android, Inc. Это действие вызвало множество спекуляций на тему выхода Google на мобильный рынок. Конец слухам положил в 2008 году релиз Android 1.0, после чего Android стала новым игроком на самом перспективном рынке. С тех пор идет битва между ней и уже устоявшимися плат-формами вроде iOS (ранее известной как iPhone OS) и Blackberry, причем шансы новичка выглядят весьма хорошими.

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

    Ключевой составляющей успеха Android стало образование Open Handset Alliance (OHA) в конце 2007 года. В OHA входят такие компании, как HTC, Qualcomm, Motorola и NVIDIA, которые сотрудничают в разработке открытых стандартов для мобильных устройств. Хотя ядро Android создано в основном в Google, все члены OHA вносят в него свой вклад в той или иной форме.

    Android, по сути, представляет собой мобильную операционную систему (ОС) и платформу, основанную на ядре Linux версии 2.6, свободную для использования в коммерческих и некоммерческих целях. Многие члены OHA собирают собствен-ные версии Android для своих устройств с измененным пользовательским интер-фейсом (User Interface, UI), например HTC Sense или Motorola MOTOBLUR. Открытая природа Android позволяет фанатам делать собственные сборки. Они обычно называются модами, прошивками или ROM. Самая известная прошивка на момент написания книги разработана парнем, известным как Cyanogen, и пред-назначена для оснащения новейшими улучшениями всех Android-устройств.

    Со времени своего первого релиза в 2008 году Android получила семь обновлений версии, каждая из которых названа по имени какого-нибудь десерта (за исключе-нием неактуальной сейчас Android 1.1). Каждая версия добавляла новую функци-ональность, в том числе и значимую для разработчиков игр. В версии 1.5 (Cupcake) была добавлена поддержка включения собственных библиотек в приложения Android — ранее они должны были быть написаны исключительно на Java. Соб-ственный код может быть очень полезен в ситуациях, когда производительность превыше всего. Версия 1.6 (Donut) получила поддержку различных разрешений экрана. Мы будем обсуждать этот факт неоднократно, поскольку он имеет некото-рое влияние на процесс разработки игр для Android. C версии 2.0 (Eclair) стали поддерживаться мультитач-дисплеи, а версия 2.2 (Froyo) может похвастаться своевременной компиляцией (Just-in-Time, JIT) в виртуальной машине Dalvik, что заметно усилило мощь Java-приложений в Android. JIT значительно ускоряет

  • 24 Глава 1. Android: новенький в классе

    выполнение приложений Android — в некоторых сценариях до пяти раз. На момент написания последней является версия 2.3 (Gingerbread), в которую добавлен сбор-щик мусора для Dalvik. Кстати, если вы еще не поняли, Android-приложения пи-шутся на языке Java.

    В 2011 году была выпущена специальная версия Android для планшетов, на-званная Honeycomb и получившая индекс 3.0. Она не предназначена для запуска на мобильных телефонах, однако некоторые ее функции могут быть портированы на смартфоны. На момент написания книги версия 3.0 недоступна для общего использования и на рынке нет устройств, ее использующих. Android 2.3 может быть установлена на многих устройствах, использующих собственную прошивку. Един-ственный гаджет, применяющий Gingerbread, — Nexus S, продаваемый непосред-ственно Google.

    РазделениеГибкость Android имеет свою цену: компании, предпочитающие разрабатывать собственные пользовательские интерфейсы, вынуждены постоянно гнаться за релизами новых версий ОС. Устройства, выпущенные всего несколько месяцев назад, становятся устаревшими, поскольку операторы и производители не хотят создавать обновления ПО, чтобы пользователи могли применять новые возмож-ности Android. Проблема, получившая название «разделение», — результат этого процесса.

    Разделение многолико. Для конечного пользователя оно означает невозможность устанавливать и задействовать определенные приложения и возможности, остава-ясь на старой версии Android. Для разработчика разделение выражается в необхо-димости поддерживать работу своих приложений для всех версий операционной системы. Приложения для старых версий обычно работают и на новых, а вот об-ратное утверждение неверно. Некоторые возможности, добавленные в новых ре-лизах, безусловно, недоступны в старых (например, поддержка мультитач). Поэто-му программисты вынуждены разделять код для разных версий ОС.

    Однако все не так плохо. Хотя это звучит пугающе, но меры, которые необхо-димо предпринять, минимальны. В большинстве случаев вы вообще можете забыть об этой проблеме и считать, что существует только одна версия Android. Для нас как разработчиков игр более важны изменения аппаратной составляющей, нежели API. Тут существует другая форма разделения, также являющаяся проблемой для таких платформ, как iOS (хотя это предпочитают не произносить вслух). В этой книге я освещу вопросы, с которыми вы можете столкнуться при разработке вашей новой игры для Android.

    Роль GoogleХотя официально Android — детище Open Handset Alliance, Google является оче-видным лидером как в реализации самой системы, так и в создании необходимой экосистемы для ее развития.

  • 25Роль Google

    Android Open Source ProjectДостижения Google об�единены под названием Android Open Source Pro�ect. Боль- Google об�единены под названием Android Open Source Pro�ect. Боль-об�единены под названием Android Open Source Pro�ect. Боль- под названием Android Open Source Pro�ect. Боль-под названием Android Open Source Pro�ect. Боль- названием Android Open Source Pro�ect. Боль-названием Android Open Source Pro�ect. Боль- Android Open Source Pro�ect. Боль-Боль-шая часть кода лицензирована под Apache License 2 открытой и неограниченной лицензией (по крайней мере по сравнению, например, с GNU General Public License (GPL)). Допускается свободное использование исходного кода для создания соб-ственных систем. Однако системы, об�явленные как совместимые с Android, долж-ны для начала пройти Android Compatibility Program — процесс, удостоверяющий базовую совместимость со сторонними приложениями, которые созданы такими разработчиками, как мы с вами. Совместимые системы могут вливаться в экоси-стему Android, включающую в себя Android Market1.

    Android MarketAndroid Market был открыт для публики в октябре 2008 года компанией Google. Это онлайн-магазин приложений, позволяющий пользователям находить и уста-навливать сторонние приложения. Магазин доступен как с помощью приложения на телефоне, как и с использованием браузера на компьютере.

    Магазин позволяет независимым разработчикам предлагать свои приложения бесплатно или за деньги.

    Пользователи могут получить доступ к магазину после регистрации учетной записи Google. Покупатель вправе вернуть приложение в течение 15 минут после покупки, чтобы получить свои деньги обратно. Ранее время возврата составляло 24 часа, и столь резкое его уменьшение не слишком обрадовало пользователей.

    Программисту, чтобы публиковать свои приложения, необходимо зарегистри-роваться в Google в качестве разработчика Android. Это будет стоить ему $25 едино-временно. Уже через несколько минут после успешной регистрации становится возможным публиковать свои творения.

    В Android Market отсутствует процесс утверждения опубликованного прило-жения, но имеется система разрешений. Пользователю перед установкой демон-стрируются разрешения, которые необходимо предоставить приложению для его работы. Эти разрешения включают в себя доступ к телефонным службам, сети, карте памяти и т. д. Установка приложения совершается только после одоб-рения пользователем этих разрешений. Система полагается на пользователя в дан-ном вопросе. Надо сказать, что для настольных приложений (особенно это касает-ся Windows-систем) такой подход работает не слишком хорошо. Что касается Android — пока это эффективная мера; всего несколько приложений были удалены с Android Market по причине их вредоносного поведения.

    Для продажи своих приложений разработчик должен дополнительно зареги-стрировать учетную запись типа Google Checkout Merchant (это делается бесплат-но). Все финансовые операции используют эту учетную запись.

    1 На момент подготовки русского издания книги Android Market был переименован в Google play (play.google.com). Таким образом, здесь и далее в тексте под Android Market будет подразумеваться Google play. — Примеч. ред.

  • 26 Глава 1. Android: новенький в классе

    Соревнования, распространение устройств и Google I/O

    Продолжая усилия по привлечению к платформе Android новых разработчиков, Google начала проводить различные состязания. Первое из них, названное Android Developer Challenge (ADC), было проведено в 2008 году. Победившим проектам были обещаны щедрые денежные призы. ADC проводилось и в следующем году, в нем также приняло участие большое количество претендентов. В 2010 году ADC не про-водилось, что может быть об�яснено тем, что Android набрала необходимую базу разработчиков и поэтому необходимость в привлечении новых участников отпала.

    Кроме того, Google в начале 2010 года начал программу распространения устройств. Каждый разработчик, приложение (или приложения) которого было скачано более 5000 раз при среднем пользовательском рейтинге не менее 3,5 звез- раз при среднем пользовательском рейтинге не менее 3,5 звез-раз при среднем пользовательском рейтинге не менее 3,5 звез-ды, получал новый телефон Motorola Droid, Motorola Milestone или Nexus One. Эта акция вызвала бурную реакцию сообщества разработчиков, хотя поначалу столк-нулась с недоверием. Многие считали полученные по электронной почте уведо�