Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Краснодар

+7 952  830 72 85

Москва

+7 495 134 25 57

Немного о коде для Android-игр

Итак, для разработки мобильных игр используется Android API (application programming interface), который предлагает набор готовых функций, классов, процедур, констант, структур. Начинающему разработчику может показаться, что процесс реализации – это темный лес и что-то из ряда магии.

В реализации очень удобно использовать интерфейсы. Они позволяют не отвлекаться на детали реализации, а сосредоточиться на семантике и при необходимости изменять способ реализации, например, вместо 2D-визуализации использовать OpenGL ES.

Для любой игры необходима базовая среда, которая дает возможность абстрагироваться от низкоуровневого взаимодействия с ОС. Как правило, среда разделяется на несколько модулей.

  • Управление окнами. Отвечает за создание и закрытие окна, приостановку/возобновление работы приложения.

  • Ввод. Модуль связан с предыдущим и необходим для отслеживания пользовательского ввода (касания, клавиатурный ввод и движения акселерометра).

  • Файловый ввод/вывод. Необходимо, чтобы приложение получало ресурсы, которые расположены на носителе.

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

  • Звук. Загружает и воспроизводит все звуки.

  • Игровой фреймворк. Включает в себя все вышеперечисленное, представляет удобную базу для написания игр.

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

Управление приложением и окнами

Как и любая компьютерная программа, игра содержит пользовательский интерфейс, который находится в окне. Оно является контейнером, своего рода холстом, на котором изображены все компоненты игры.

В большинстве ОС реализовано множество способов взаимодействовать с окнами: не только тач-жесты и нажатия кнопки, но и перетаскивание, изменение их размера (смена ориентации), сворачивание в Панели задач (переход в фоновый режим).

Модуль управления приложением и окнами также выполняет настройку окна и обеспечивает наполнение его компонентом интерфейса, который воспринимает пользовательский ввод в виде касаний и нажатий кнопок. Визуализация данного компонента может выполняться центральным процессором или через аппаратное ускорение (например, для OpenGL ES).

Модуль управления приложением и окнами не имеет какого-то определенного набора интерфейсов. Объединение с игровым фреймворком выполнится позже, а пока важно определить состояния приложения и события окна, которыми нужно управлять:

  • Create (Создать) — появляется единожды при открытии окна (приложения);

  • Pause (Пауза) — возникает в случае приостановки работы приложения;

  • Resume (Возобновить) — появляется, когда возобновляется работа приложения и окна возвращаются на передний план.

ПРИМЕЧАНИЕ

Вопрос об использовании нескольких окон («активностей») в игре и создании сложных пользовательских интерфейсов мы пока отложим и сосредоточимся на программировании игры, а не интерфейсов.

Ввод

За взаимодействие пользователя с игрой отвечает модуль ввода. События ввода (касания и нажатия) отсылаются к текущему окну. Оно, в свою очередь, перенаправляет данные события элементу интерфейса, где в текущий момент располагается фокус.

Весь процесс весьма прозрачен и выполняется с единственной целью – получать события от сфокусированного компонента интерфейса. API пользовательского интерфейса ОС предлагает механизм, который внедряется в систему перенаправления событий для того, чтобы их можно было регистрировать и сохранять. Зачем нужна эта информация?

  • Опрос. Проверка состояния устройства ввода в текущее время, например, факта нажатия пользователем конкретной кнопки. Изменения состояния между опросами и порядок ввода символов не сохраняется.

  • Обработчики событий. Предоставляет полную хронологию событий, которые произошли с момента последней проверки. Отлично подходит для обработки текстового ввода и любой другой задачи, которая зависит от порядка событий. Также подходит для определения первого касания экрана или поднятия его.

Какие устройства ввода необходимо контролировать? Для Android существуют три главных метода ввода: сенсорный экран, клавиатура/трекбол и акселерометр. двух Для первых способов можно применять оба способа обработки событий. Для акселерометра чаще используется только опрашивание. Сенсорный экран может генерировать три события:

  • касание экрана — касание дисплея пальцем;

  • перетаскивание — движение пальца по дисплею, этому всегда предшествует событие касания;

  • отрыв —палец отрывается от дисплея.

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

Клавиатура создает два типа событий:

  • клавиша нажата —при нажатии клавиши;

  • клавиша отпущена —при поднятии пальца от кнопки.

Дополнительные данные для клавиатурных событий – это код нажатой/отпущенной кнопки. В событии «клавиша отпущена» также включен Юникод-символ, то есть учитывается состояние других клавиш. Например, зная состояние клавиши Shift можно понять, ввел пользователь прописную или заглавную букву.

Состояние акселерометра (изменение положения устройства по одному из направлений-осей: x, y и z) определяется методом опрашивания.

Ускорение измеряется в метрах в секунду за секунду (м/с2). Ускорение свободного падения на нашей планете равняется 9,8 м/с2. Когда точка на оси удаляется от центра Земли, ускорение возрастает, а при обратном движении, соответственно, уменьшается. То есть в вертикальном портретном положении у телефона значение по оси y равняется 9,8 м/с2. На рисунке это значение имеет ось z, а оси x и y сообщают нулевое ускорение.

Файловый ввод-вывод

Чтение и запись файлов необходимы для проб в программировании игр. Так как мы находимся в стране Java, то в основном приходится работать с экземплярами классов InputStream и OutputStream — стандартными Java-механизмами для чтения и записи данных в файлы.

Нас в основном интересует чтение файлов (уровней, изображений, звукозаписей) из пакета игры. Запись файлов используется гораздо реже — в основном для сохранения результатов, настроек или игры, чтобы продолжить с того места, где остановились. Одним словом, требуется наиболее простой механизм доступа к системе файлов.

Здесь все просто: определяем имя файла и возвращаем для него поток. Как правило, в случае непредусмотренных событий в Java мы вызываем исключение IOException. Где мы будем читать и записывать файлы, зависит, в первую очередь, от реализации интерфейса. Ресурсы могут быть прочитаны прямо из APK-файла приложения или с SD-карты (внешнего хранилища).