Как создать популярную игру для смартфонов

Пару недель назад, в сотый раз перепроходя Colossal Cave Adventure, я задумался, почему сейчас выпускают так мало игр данного жанра. Ведь это целый мир, в который погружаешься с головой. С этой мыслью, я решил начать делать свои текстовые квесты. Именно этому и посвящается сегодняшняя статья, надеюсь вам понравится!
В первой части, я опишу все инструменты по созданию игры, не затрагивая сюжет. Вторая часть, будет посвящена работе с комментариями, дереву повествования и самому сюжету в целом. В третьей части я опишу, все затраты на рекламу, получение сертификатов, способы монетизации приложения.

Создание игры:
Первой трудностью, с которой мне пришлось столкнуться, стало то, что я по образованию далеко не программист. Раньше я думал, что создание текстовых квестов, требует кучи навыков, помимо умения грамотно писать. Но немного походив по форумам я нашел ее, программу, для таких же «безруких» как и я, и имя ей Twine. twinery.org

Twine – это программа, для создания интерактивной литературы. Ее функционал заключается в очень простой визуальной блок-схеме, а скриптинг представляет собой создание гиперссылок между отдельными узлами(блоками). В итоге получается готовая html игра, которую можно сразу запускать в браузере. Не смотря на свою простоту, она поддается глубокой настройке – вы можете поменять фон, добавить музыку, поиграться со шрифтами и т.д. и т.п. Все скрипты, для смены дизайна можете найти на этих сайтах: twinery.org/wiki/script
github.com/scelis/twine
Встроенный функционал включает в себя базовые элементы программирования, такие как переменные и операторы «если». Сообщество Twine написало множество разных макросов на Javascript, значительно расширяющих возможности утилиты, и их можно добавлять в любой проект простым копированием. Также можно скачивать темы для смены оформления программы. Вы можете создать свою таблицу стилей для самостоятельной настройки внешнего вида. Лично я, приверженец классического черно белого стиля. Но мне не понравился стандартный шрифт, тогда я буквально за минуту нашел код, и добавил нотку индивидуальности в свой квест. Если кому интересно скрипт в спойлере.

скрытый текст @import url(http://allfont.ru/allfont.css?fonts=courier);
html, body {
text-align: justify;
font-family: courier;
font-size: 20;
font-weight: bold;
color: #ffffff;
background-color: #000000;
}
tw-link {
background-color: #000000;
color: #ffffff;
border-bottom: 0px solid #000000;
text-decoration: none;
}
tw-link:hover {
background-color: #ffffff;
color: #000000;
}
tw-link:before{
content: «»;
}
Конечно, у Twine есть свои ограничения. Она создана только для текстовых игр, поэтому к работе над “серьезными” играми программа не пригодна. Всё, что требует обширных познаний в программировании, лучше создавать в Unity или Construct 2.0.

Преобразование:
После написания квеста, вы можете “опубликовать его в файл” и скинуть друзьям или на форумы, но я решил пойти дальше и занялся поиском программы для вывода игры в apk, и публикации на PlayMarket. Добрые, часов 5 искал этот долбанный инструмент, и вот в момент, когда я уже опустил руки, нашел Intel Xdk.

Intel XDK – это интегрированный набор инструментов для кросс-платформенной разработки приложений. Вот такое сложное описание нам предлагает сам Intel, но для нас, это конвертер (с возможностью модификации) с html в apk. Он позволяет быстро конвертировать HTML5-приложения для устройств, работающих под управлением iOS, Android и Windows. Здесь можно найти подробную документацию по XDK. Так как разработчики программы не сделали этого, я сам написал нормальную инструкцию, по загрузке html файла в компилятор.

1.Запустите Intel XDK
2.Войдите в свою учётную запись. Если у вас ещё её нет – зарегистрируйтесь.
3.На стартовом экране можно выбрать шаблон для проекта или посмотреть примеры приложений. Но это нам особо и не нужно!
4.На панели Создать новый проект (Start A New Project) пройдите по пути Templates > Blank

5.Выбираем вариант HTML5 + Cordova.

6.Открываем в браузере свою игру и жмем Ctrl+U и в появившемся окне жмем:
Ctrl+A и Ctrl+C.
7.Далее в Xdk заходим в окошко Develop и жмем Ctrl+A и Ctrl+V. Все ваша игра загружена в компилятор.

8.Далее проверяем ее. В окошке Simulate выбираем устройство и жмем кнопку запуска. Если все хорошо, отлично). Если нет, повторяем предыдущие пункты.
9.Далее самая дебильная часть в Xdk, нам нужно создать сертификат. Я сам над этим промучился с полчаса, а потом нашел видео инструкцию как это сделать, кидаю ее вам:

10.В окошке Projects жмем Build setting и настраиваем название и версию вашей игры, далее открывайте Launch icons и настраиваем иконки приложения для всех платформ, в разрешениях 96х96, 72х72, 48х48 и так далее.
11.И наконец, переходим во вкладку Build и выводим нашу игру на любую возможную платформу!
Публикация!
После генерации apk файла, вы можете загрузить его в любой магазин для Windows, IOS или Android. Но я расскажу вам только про android.
1. Зайдите в Developer Console. developer.android.com/distribute/console/index.html
2.Выберите Создать учетную запись продавца.
3.После этого Вам необходимо заплатить 25$, это можно сделать любым удобным для вас способом. платеж обрабатывается 12-24 часа.
4.Далее вам необходимо заполнить все данные. Отнеситесь внимательно к заполнению информации о компании. Общая информация будет видна всем пользователям вашего приложения. В “Название компании” можно вписать имя разработчика. Если у вас есть сайт – обязательно укажите это, потом это может стать для вас большим плюсом.
5.Просмотрите все ваши данные на предмет ошибки и нажимайте Отправить.
С этого момента, вы стали официальным разработчиком и можете размещать свои приложения в маркете, поздравляю!) Теперь расскажу, что нужно иметь для публикации!
Иконка:
Технические требования к изображению с высоким разрешением:
32-битный PNG (с альфа-каналом);
Размер: 512х512 пикселей;
Максимальный вес файла: 1024 Кб.
Скриншоты:
Технические требования к скринам:
JPG или 24-битный PNG (без альфа-канала);
Размер: от 320 пикселей до 3840 пикселей;
Соотношение сторон не больше, чем 2:1;
Не менее двух скриншотов.
Советую, на скринах продемонстрировать функционал и геймплей приложения.

Название:
Требования:
От 25 до 55 символов. Креативьте и если это выходит, добавляйте теги в название.
Описание:
Ограничения при создании описания:
Не более 80 символов для краткого описания;
До 4000 символов полного описания.
Не спешите с текстом, это самая главная часть публикации. Подумайте, что вы хотите рассказать о своей игре и как вы завлечете покупателя. Советую почитать описания известных разработчиков и сделать, как они, или даже лучше)
Рекламное видео:
Требования:
От 30 секунд до 2 минут.
Это необязательный пункт, но очень рекомендованный, ведь с ютуба тоже могут прийти покупатели!

Создание рейтинга приложения:
Опишите все, что у вас есть в игре, насилие мат и тому подобное, ни в коем случае не врите, а то приложение попросту могут заблокировать!
Ну вот и все, первая часть инструкции подошла к концу, во второй части я расскажу о сюжете своей новой игры. В комментариях все критиковали повествование и я, как добросовестный фанат “Фарго” (особенно 1 сезона), нашел реальную историю, которая происходила в Украине. По количеству трупов и конспирологии, “Фарго” просто отдыхает, а то, как это дело раскрыли и объяснили, вообще на ни в какие ворота не лезет. Я учел абсолютно все отзывы, и надеюсь новая игра оставит вам приятное впечатление.
Также во второй части, я подробно расскажу о создании игры в Twine, с примерами и пошаговыми скринами.
Ну а третья часть будет посвящена рекламе, получению сертификатов и способам монетизации приложения и в конце отвечу на вопрос, стоит ли этим заниматься?!

Благодаря доступному интернету и смартфонам, рынок мобильный развлечений растет очень быстро. Разработка игр для Android и iOS может быть очень прибыльным занятием. Ежедневно выходят в свет самые разные продукты: классические хиты перерождаются на телефонах (например, Star Wars™: KOTOR), великие MMO уходят на планшеты (Lineage 2: Revolution), крупные студии пытаются вдохнуть новое дыхание в забытые вселенные (Command & Conquer: Rivals), а никому неизвестные студии зарабатывают миллиарды на восточном сеттинге и приглашают для рекламы Ксению Бородину.

В этой статье преподаватели Высшей школы бизнес-информатики НИУ ВШЭ, авторы образовательных программ “Менеджмент игровых проектов” и “Основы создания игр”, расскажут о преимуществах разработки игр для Android и технических аспектах этого процесса.

Почему Android

Разработка игр на Android — одно из самых популярных направлений в современном геймдеве, как среди крупных компаний, так и инди-студий. Причин несколько. Во-первых высокие прибыли от мобильных проектов, а во-вторых — возможность использовать необычные функции смартфонов для реализации необычных геймплейных механик. Яркий пример, Pokemon GO, который пару лет назад просто взорвал рынок.

Особенности создания игр на Android

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

  • объектных моделей,
  • функциональных спецификаций,
  • игрового контента,
  • интерфейса.

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

Программы для создания игр на Android

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

При разработке игр для мобильного устройства на платформе Android чаще всего используются следующие движки для создания игр:

  • Unity 3D. Универсальный конструктор, который предусматривает возможность использования полного десктопного функционала для работы с графикой и звуком при разработке для Android. Также у Unity есть несколько встроенных опций для оптимизации приложений. Движок хорошо зарекомендовал себя среди разработчиков мобильных игр.
  • Unreal Engine 4. Еще один универсальный движок, который также подходит для разработки высокобюджетных проектов для Android. Функционал ничем не отличается от десктопной версии. В последнее время на нем появляется все больше проектов. В особенности стратегий, так как Unreal чуть лучше удается обработка одинаковых объектов.

  • Game Maker или Game Maker Studio. Оба конструктора позволяют создавать игры для Android в различных жанрах, предлагая широкий перечень готовых локаций, персонажей, объектов и саунд-эффектов. Написание скриптов игр ведется с помощью встроенного GML, что облегчает разработку при недостатке знаний программирования.
  • Clickteam Fusion Developer предназначен для создания 2D игр, причем не только экспериментальных, но и полноценных сюжетных продуктов. Данная программа-конструктор максимально проста в использовании и позволяет научиться понимать логику создания игр.
  • Construct 2 используется для создания двухмерных игр (в основном, в жанрах бродилок и стрелялок). Программа содержит большое число инструментов и утилит, проста в освоении за счет удобного интерфейса.

Где учиться делать игры на Android

Если вы планируете профессионально заниматься разработкой игр на Android, получить все необходимые знания можно в ВШБИ НИУ ВШЭ в Москве. Мы приглашаем всех желающих пройти обучение по программам “Основы создания игр” и “Менеджмент игровых проектов”. Во время занятий начинающие разработчики игр освоят работу в различных игровых конструкторах и создадут свой уникальный проект.

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

Еще больше информации вы найдете на канале на YouTube. Подписывайтесь и не пропускайте свежие записи с открытых мероприятий ВШБИ НИУ ВШЭ.

← Назад к списку


Вступительное слово

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

Александр Ледков

Идея и архитектура

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

Смоделируем игровую ситуацию. Наш персонаж находится в центре экрана. Роботы каждую 1/10 секунды приближаются к нему. каждую десятую секунду мы проверяем также не произошло ли касание экрана. Если произошло — двигаем наш персонаж в необходимом направлении или делаем выстрел. если выстрел сделан, каждый тик (1/10 секунды) мы проверяем столкновение пули с врагами. Если пуля попала в робота — то и робот и пуля взрываются, если нет — роботы и пуля перемещаются на новые позиции (робот перемещается на 5 пикселей за тик, а пуля — на 50 пикселей). Мы также проверяем не поймал ли робот нашего героя. Если поймал — игра заканчивается.
В простейшем случае архитектура игры может быть представлена в виде следующих модулей, которые вызываются циклически:

  1. Модуль управления. Здесь считываются координаты касания экрана.
  2. Игровой движок. Здесь мы должны обновить состояние игровых объектов, то есть вычислить их новые координаты, проверить здоровье, столкновения и тому подобное.
  3. Аудио модуль.
  4. Графический модуль. Здесь на основании текущего состояния формируется и выводится на экран новый кадр.

Давайте более детально рассмотрим наши модули.

Модуль управления

В нашей игре сообщения генерируются при касании пользователем двух областей на экране. Программа отслеживает события onTouch и записывает координаты каждого касания. Если координаты находятся внутри управляющей области, мы посылаем соответствующую команду игровому движку. Например, если произошло касание сбоку круга, мы должны двигать нашего персонажа в соответствующую сторону. Если произошло касание круга, управляющего оружием, мы посылаем команду движку обработать событие выстрела.

Игровой движок

Модуль игровой логики отвечает за изменение состояний всех игровых персонажей, под которыми я понимаю каждый объект, имеющий состояние (Наш герой, роботы, лазерные выстрелы).
Давайте рассмотрим взаимодействие модуля управления и игрового движка. На представленном выше рисунке показан круг-контроллер. Светлое зеленое пятно символизирует область касания. Модуль управления сообщает игровому движку координаты касания (dx и dy — расстояния в пикселях от центра круга). На основании этих координат игровой движок вычисляет направление и скорость движения нашего героя. Например, если dx>0, наш персонаж движется вправо, eсли dy>0 — в верх.

Аудио модуль

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

Графический модуль

Этот модуль отвечает за вывод игровой ситуации на экран телефона. В Android существует несколько способов формирования изображения на экране. Можно рисовать прямо на canvas, полученный от View или использовать отдельный графический буффер и вы, а затем передавать его View, а можно воспользоваться возможностями библиотеки OpenGL. Полезно при разработке игры постоянно измерять FPS — число кадров в секунду, которые выдает ваш графический движок. Величина в 30 FPS означает, что за одну секунду наша программа успевает 30 раз обновить экран. Забегая вперед скажу, что для мобильного устройства 30 FPS более чем достойный показатель.

Создаем проект-заготовку для будущей Android игры

Я не буду здесь подробно расписывать процесс установки Android SDK и Eclipse, за рамками повествования я оставлю и элементарные действия по созданию Android проекта. В интернете валяется огромное количество уроков и статей, посвященных этой теме.
Создайте новый проект. В поле Project Name введитеDroidz. В качестве целевой платформы выберите Android 2.2 или выше. В Package Name — «ru.mobilab.gamesample». Не забудьте поставить галочку около Create Activity. В качестве имени главной activity введитеDroidzActivity.
Откройте файл src/ru.mobilab.gamesample/DroidzActivity.java

package ru.mobilab.gamesample;
import android.app.Activity;
import android.os.Bundle;
public class DroidzActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}

Метод onCreate вызывается при создании activity во время запуска приложения. Этот метод можно рассматривать, как точу входа в программу. Класс R.java автоматически генерируется Eclipse и содержит в себе ссылки на ресурсы. Каждый раз, когда вы изменяете ресурсы в Eclipse класс R пересобирается.

Главный игровой цикл

В любой игре должен присутствовать цикл, который будет фиксировать команды пользователя, обрабатывать их, изменять в соответствии состояния игровых объектов, выводить новый кадр на экран и проигрывать звуковое сопровождение. Мы уже создали простейший проект для Android. Давайте теперь создадим реализацию игрового цикла.
Как вы помните, в Android все происходит внутри Activity. Activity создает View — объект, где происходит все самое интересное. Именно через него мы можем получить информацию о касаниях экрана, здесь же можно вывести картинку на экран.
Давайте откроем файл DroidzActivity.java. В конструкторе класса вы увидите строчку

setContentView(R.layout.main);

эта строка выбирает текущий объект View для Activity. Давайте создадим новый объект для View. Наиболее простым способом получения View — создать собственный класс на основании SurfaceView. В нашем классе мы реализуем интерфейс SurfaceHolder.Callback, чтобы ускорить доступ к изменениям поверхности, например когда она уничтожается при изменении ориентации устройства.

MainGamePanel.java
package ru.mobilab.gamesample;
import android.content.Context;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainGamePanel extends SurfaceView implements
SurfaceHolder.Callback {
public MainGamePanel(Context context) {
super(context);
// Добавляем этот класс, как содержащий функцию обратного
// вызова для взаимодействия с событиями
getHolder().addCallback(this);
// делаем GamePanel focusable, чтобы она могла обрабатывать сообщения
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
}
}

В приведенном выше листинге показан шаблон класса, которые нам предстоит реализовать. Давайте более внимательно посмотрим на содержание конструктора. Строка

getHolder().addCallback(this);

Устанавливает текущий класс (MainGamePanel) как обработчик событий от поверхности.

setFocusable(true);

Эта строка делает наш класс фокусируемым. Это означает, что он может получать фокус, а значит и события.
Давайте создадим поток, внутри которого собственно и будет реализован наш игровой цикл. Разделение игры на несколько параллельно выполняющихся потоков — общепринятая в современном геймдеве практика. Создадим для нашего потока класс MainThread.java

package ru.mobilab.gamesample;
public class MainThread extends Thread {
//флаг, указывающий на то, что игра запущена.
private boolean running;
public void setRunning(boolean running) {
this.running = running;
}
@Override
public void run() {
while (running) {
// обновить состояние игровых объектов
// вывести графику на экран
}
}
}

Как видите, этот класс существенно проще предыдущего. Внутри мы переопределили метод run(). Поток выполняется до тех пор, пока выполняется этот метод, поэтому мы организовали внутри него бесконечный цикл. Мы добавили логическую переменную running, которая служит индикатором выхода из цикла. Теперь чтобы завершить поток, нужно просто где-то изменить значение этой переменной на false.
После того, как мы создали класс потока, его нужно запустить. Давайте запускать его при загрузке экрана. Изменим класс MainGamePanel

package ru.mobilab.gamesample;
import android.content.Context;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainGamePanel extends SurfaceView implements
SurfaceHolder.Callback {
private MainThread thread;
public MainGamePanel(Context context) {
super(context);
getHolder().addCallback(this);
// создаем поток для игрового цикла
thread = new MainThread();
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//посылаем потоку команду на закрытие и дожидаемся,
//пока поток не будет закрыт.
boolean retry = true;
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// пытаемся снова остановить поток thread
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
}
}

Мы объявили объект thread

private MainThread thread;

и создали его в конструкторе

thread = new MainThread();

в методе surfaceCreated мы установили флаг running в значение true и запустили поток. К этому времени объект thread уже благополучно создан и можем без опасений запускать его.
Метод surfaceDestroyed вызывается перед закрытием поверхности. Здесь недостаточно просто снять флаг running. Мы должны убедиться, что поток действительно закрылся. Мы просто блокируем поток и ждем, пока он не умрет.

Добавляем взаимодействие с экраном

Чтобы показать, как в Android обработать касания, напишем небольшой пример. Будем выходить из программы, когда пользователь коснется нижней части экрана. Если касание произошло где-то выше — будем просто выводить в лог соответствующие координаты. Добавим в класс MainThread следующие строки:

private SurfaceHolder surfaceHolder;
private MainGamePanel gamePanel;
public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) {
super();
this.surfaceHolder = surfaceHolder;
this.gamePanel = gamePanel;
}

тем самым мы определили переменные gamePanel и surfaceHolder, взяв соответствующие значения из параметров конструктора. Нам нужно запомнить эти значения, чтобы потом иметь возможность блокировать поверхность на время рисования, а это можно сделать только через surfaceHolder.
Измените строку в классе MainGamePanel, добабвив в конструктор вновь объявленные параметры

thread = new MainThread(getHolder(), this);

Мы передаем текущий обработчик и панель в новый конструктор. Это позволит нам иметь к ней доступ из потока. В gamePanel мы создадим метод update и будем переключать его из потока, но пока оставим все как есть.

Логирование

Ниже мы напишем вспомогательный код, осуществляющий логирование — запись специальных отладочных строк с текстом, отражающих состояние нашей программы, в специальный файл, который потом можно просмотреть и попытаться понять, что происходило в программе. добавим константу TAG в класс MainThread. Каждый класс будет у нас иметь собственную константу с именем TAG, которая будет содержать название соответствующего класса. Бы будем использовать Android logging framework, чтобы вести логирование, в рамках этой библиотеки каждый лог должен иметь два параметра. Первый параметр определяет место, откуда записан лог. Именно для этих целей мы и создали константу TAG. Второй параметр — собственно сообщение, которое мы хотим записать в лог. Использование имен классов в качестве первого параметра — довольно распространенная в среде java программистов практика.
Чтобы посмотреть записанные в процессе выполнения программы логи нужно выбрать меню
Windows -> Show View -> Other…
а затем в открывшемся диалоге
Android -> LogCat
В открывшемся окне можно не только просматривать логи, но и осуществлять фильтрацию и поиск.
Вернемся к нашему коду. Внесем изменения в MainThread.java

package ru.mobilab.gamesample; import android.util.Log; import android.view.SurfaceHolder; publicclass MainThreadextends Thread{ private static final String TAG= MainThread.class.getSimpleName(); private SurfaceHolder surfaceHolder; private MainGamePanel gamePanel; private boolean running; public void setRunning(boolean running){ this.running= running; } public MainThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel){ super(); this.surfaceHolder= surfaceHolder; this.gamePanel= gamePanel; } @Override public void run(){ long tickCount= 0L; Log.d(TAG,»Starting game loop»); while(running){ tickCount++; // здесь будет обновляться состояние игры // и формироваться кадр для вывода на экран } Log.d(TAG,»Game loop executed «+ tickCount+» times»); } }

Как видите, мы определили TAG и вызвали внутри метода run команду Log, которая делает соответствующую запись в лог файле. Мы выводим в лог значение переменной tickCount, которая фактически является счетчиком игрового цикла и показывает сколько раз успел выполниться игровой цикл за время работы программы
Перейдем к файлу MainGamePanel.java и найдем метод onTouchEvent, который является обработчиком касаний экрана.

public boolean onTouchEvent(MotionEvent event){ if(event.getAction()== MotionEvent.ACTION_DOWN){ if(event.getY()> getHeight()-50){ thread.setRunning(false); ((Activity)getContext()).finish(); }else{ Log.d(TAG,»Coords: x=»+ event.getX()+»,y=»+ event.getY()); } } return super.onTouchEvent(event); }

Сначала мы проверяем произошло ли событие касания экрана (MotionEvent.ACTION_DOWN). Если произошло, проверяем координату y и если она находится в нижней части экрана (50 пикселей снизу), мы посылаем потоку команду на завершение (установив переменную running в false), а затем вызываем метод finish() для главной Activity, который закрывает всю нашу программу.
Замечание. Начало системы координат у экрана находится в левом верхнем углу. Ось y направлена вниз, ось x — вправо. Ширину и высоту экрана можно получить с помощью методов getWidth() и getHeight() соответственно.
Изменим DroidzActivity.java, добавив команды записи в лог

package ru.mobilab.gamesample; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Window; import android.view.WindowManager; publicclass DroidzActivityextends Activity{ /** Вызывается при создании activity. */ private static final String TAG= DroidzActivity.class.getSimpleName(); @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // запрос на отключение строки заголовка requestWindowFeature(Window.FEATURE_NO_TITLE); // перевод приложения в полноэкранный режим getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // устанавливаем MainGamePanel как View setContentView(new MainGamePanel(this)); Log.d(TAG,»View added»); } @Override protected void onDestroy(){ Log.d(TAG,»Destroying…»); super.onDestroy(); } @Override protected void onStop(){ Log.d(TAG,»Stopping…»); super.onStop(); } }

Мы добавили строки, переводящие приложение в полноэкранный режим и добавили команды записи в лог в методах onDestroy() и onStop().
Давайте запустим приложение. После запуска Вы должны увидеть черный экран. Пощелкайте несколько раз по верхней части экрана, а затем по нижней. программа закроется. Самое время проверить лог.
Просмотрев лог вы получите четкое представление о порядке запуска методов. Вы также можете увидеть сколько раз за время работы программы успел выполниться игровой цикл. Эта цифра ни о чем не говорит, в следующий раз мы выведем в лог более полезную информацию: FPS и UPS (обновлений в секунду).
Подведем итог. Мы создали полноэкранное приложение. Написали класс, который выполняется в отдельном потоке и будет содержать игровой движок. Написали простейший метод обработки касаний экрана и грамотно закрыли приложение.
В следующий раз мы перейдем к рисованию. Исходный код этого урока можно скачать.

Перевод и адаптация:Александр Ледков

  • Пишем игру для Android. Часть 1 — Идея, архитектура и игровой цикл
  • Пишем игру для Android. Часть 2 — Вывод рисунка на экран и его перемещения
  • Пишем игру для Android. Часть 3 — Как добиться одинаковой скорости выполнения игры на разных телефонах
  • Пишем игру для Android. Часть 4 — Спрайтовая анимация

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *