Меню Рубрики

Как написать игру на java на android

Пишем игру для Android. Часть 1 — Идея, архитектура и игровой цикл

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

Этот урок начинает серию статей, посвященных написанию аркадных игр для 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

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

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

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

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

Давайте откроем файл DroidzActivity.java. В конструкторе класса вы увидите строчку

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

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

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

Эта строка делает наш класс фокусируемым. Это означает, что он может получать фокус, а значит и события.

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

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

После того, как мы создали класс потока, его нужно запустить. Давайте запускать его при загрузке экрана. Изменим класс MainGamePanel

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

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

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

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

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

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

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

Измените строку в классе MainGamePanel, добабвив в конструктор вновь объявленные параметры

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

Логирование

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

Чтобы посмотреть записанные в процессе выполнения программы логи нужно выбрать меню
Windows -> Show View -> Other…
а затем в открывшемся диалоге
Android -> LogCat
В открывшемся окне можно не только просматривать логи, но и осуществлять фильтрацию и поиск.

Вернемся к нашему коду. Внесем изменения в MainThread.java

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

Перейдем к файлу MainGamePanel.java и найдем метод onTouchEvent, который является обработчиком касаний экрана.

Сначала мы проверяем произошло ли событие касания экрана (MotionEvent.ACTION_DOWN). Если произошло, проверяем координату y и если она находится в нижней части экрана (50 пикселей снизу), мы посылаем потоку команду на завершение (установив переменную running в false), а затем вызываем метод finish() для главной Activity, который закрывает всю нашу программу.

Замечание. Начало системы координат у экрана находится в левом верхнем углу. Ось y направлена вниз, ось x — вправо. Ширину и высоту экрана можно получить с помощью методов getWidth() и getHeight() соответственно.

Изменим DroidzActivity.java, добавив команды записи в лог

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

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

Просмотрев лог вы получите четкое представление о порядке запуска методов. Вы также можете увидеть сколько раз за время работы программы успел выполниться игровой цикл. Эта цифра ни о чем не говорит, в следующий раз мы выведем в лог более полезную информацию: FPS и UPS (обновлений в секунду).

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

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

Источник статьи: http://www.mobilab.ru/androiddev/androidgamedev01.html

Пишем простейшую игру для Android

Сегодня немного отвлечемся от бытовой тематики дизайна, и посмотрим в сторону игровой индустрии на Android.

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

Таких примеров очень много, обычно это интеллектуальные рисованные игрушки, вроде 91 градус или сканворды, или правда vs ложь.

Мы возьмем категорию игры, копий которых больше, чем игроков — угадай по фото / картинке. Игр на самом деле такого характера дофига, но с программной точки зрения тут много функционала.

Тут есть и загрузка картинок, и проверка введенного ответа на правильность, и накапливание игровой валюты за правильные ответы и рисование интерфейса игры.

Рассказ о создании я начну по мере ее реализации:

Открываем студию, создаем 3 активности. Это могут быть Blank Activity, стандартный код не нужен.

— MainActivity (главный экран)

— CareerActivity (экран карьеры)

Заставка будет длиться 2 секунды, функциональной нагрузки в ней нет (загрузки уровней, вычислительной мощность для Prisma, или расчетов для адаптации хомячков в арктике)

С дизайном не заморачиваемся, так как это будет после создания скелета. Заливаем все colorPrimary:

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

Кто осматривает картинки с кодом, должен заметить, что используется относительно недавний способ обработки нажатия. Вместо того, чтобы:

мы просто пишем метод, который прописан во view (main_go_to_catalog). И все. Ведро остальное найдет и сделает за нас. Это удобно, когда действий не слишком много, и позволит сократить код.

Третий экран (карьера) будет состоять из поэтапный миссий, для открытия второй надо выполнить 80% заданий из первой. Я сделал 5 кнопок, и перерисовал toolbar для отображения внутриигровой валюты.

Кстати, посоветовавшись с женским полом, было решено, что валюта назовется фантики. И не вздумайте спорить! =)

На данный момент придумано два режима: Карьера, и Случайный вопрос. Об этом будет спрашивать приложение, по нажатии кнопки Играть:

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

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

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

Например, угадывать не только изображения, но и слова из цитат, фраз, стихов и пр.

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

Всем бобра, и хороших выходных!

Найдены возможные дубликаты

HI.
@VBELKE. я сделал игру на Java, хочу переписать ее под Андроид, т.к. Андроид и Java разнятся в принципах построения приложений.
Подскажи как организовать разделение меню и игровой части или как это сделать правильно.
с уважением @Ukauka.

Войти в айти. Часть 5

Привет, Пикабу! Да, да.. это очередной пикабушник с кризисом среднего возраста, который вдруг осознал и понял, что с детства мечтал быть программистом. Давненько не было отчёта о моём пути в профессиональный мир разработки. Если вдруг Вам интересен мой опыт, то предыдущие срезы тут:

Вкратце, с чего всё начиналось:

0) Увольнение с военной службы по контракту

2) Высшее образование (заочное) по направлению «Информатика и вычислительная техника»

3) Выучил Java, сейчас изучаю Kotlin и Swift

4) Есть несколько карманных проектов в Play Market, всё довольно простенькое, но стараюсь развивать

5) Женат, детей нет, кот есть

Цель — к декабрю 2020 набрать в сумме 1.000.000 загрузок на Android, выучить Swift и выпустить приложение на ios.

Первый пост был написан 10 месяцев назад, в котором я ставил себе рубеж — декабрь 2020. Но не дотянув 2 месяца я схожу с дистанции. Причина этому довольно меркантильная, но приятная — пора устроиться на работу, нужны деньги так как ждём пополнения.

Давайте подведу итоги того, что я имею на данный момент:

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

— На создании собственных приложений жить можно. Деньги не большие, но на жкх и холодильник хватает. Доход постоянно растёт, если не останавливаться, создавать что-то новое и поддерживать старое.

— Физкультура важна не менее умных книг. Мало движения — тает мотивация, появляется прокрастинация.

— 1.000.000 загрузок набрать не удалось. Цифры гораздо скромнее. На данный момент в сумме загрузок около 240.000, активных пользователей в сумме по приложениям около 83.000

— если из 100 скачавших приложение человек 30 не удаляют его, то это вполне хороший показатель, значит его можно и нужно развивать!

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

— после 30 на работу в it устроиться можно!

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

Результаты по Android меня вполне удовлетворили, чего не сказать о ios. Времени и сил не хватило на всё, буду заниматься им в рамках общего развития. Надеюсь что к весне смогу сделать что-то простенькое.

В итоге вчера мне сделали предложение на вакансию разработчика, которое меня полностью устроило как в плане зп, так и перспектив развития. Впереди знакомство с коллективом и вход в серьёзную разработку. Надеюсь задачи будут интересные, а кофе вкусным 😊 Если будет интересно и я успешно справлюсь с испытательным сроком, то обязательно поделюсь впечатлениями.

Если мечтаете сменить род деятельности, выделите время, составьте план, определите сроки и вперёд! Другой жизни не будет, а занятие любимым делом профессионально — это очень, очень круто!

Сервис для перехода из 3D в 2D — наш, Российский.

Привет! Годами анимешники пытаются разорвать грани 2D мира. На реддите есть целый раздел посвящённый данным разработкам. Так вышло, что и я поучаствовал в схожем проекте.

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

Результат высылается на почту, что несколько устарело.

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

Оказывается, вам не нужен большой IP, чтобы оказаться вдохновителем крутого сервиса!

Правда, после пары постов, появились первые установки, отзывы и понимание, что мир ещё не готов.

А ещё люди не читали инструкцию и публиковали туда всякие

50 сантиметровые штуки. Угадайте, сколько пикабушников на 100 человек?

Но кого остановит волна негатива? Не нас! Нужно найти проблему и решить её. (Даже, если это не так проблема)

Можно заметить, что у получающихся картинок блеклые цвета. Это связано с тем, что нейросеть обучалась на старых аниме. Кроме того, у неё явные проблемы с тенями.

Поэтому, после моих настойчивых замечаний было решено потратить ещё немного времени на приложение и обучить его на современном аниме!

Как идейный вдохновитель, графику должен был добыть я. Вы пробовали найти триста тыщ аниме голов? И чтобы эти головы были 2010+ года выпуска, да в достойном разрешении. Очень легко на самом деле — гуглите «Anime-Face-Dataset».

В идеале, стоило накачать рисунков из Printrest, как мне и советовали, но взять готовый архив проще же. Иногда я бываю СЛИШКОМ вдохновляющим — смог «продавить» простой путь =\

Итак, эти картинки загрузили в нейросеть и как-то поставили её учиться трансформировать 3D в 2D.

К сожалению, это РЕАЛЬНО оказался набор голов и других частей тела. Там не было фонов и их программа рисовать не научилась.

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

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

Новая сеть хуже различает цвета волос и глаз. Зато реже уходит в трип из-за теней и не путает число глаз. Это же важнее чем их цвет?

Ну и конечно лучше работает с котиками o(≧▽≦)o

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

Я вдохновил подругу на создание забавного сервиса, который всё же не пришёлся людям по душе. Мы получили опыт, повеселились, слили денег на сервера и набили синяки — это жизнь 2D она или 3D. Некоторых вон вообще грузовики сбивают.

Если честно, боюсь, что промахнулся немного с сообществом, но про разработку я знаю только GameDev ._.

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

Подруга моя, просьбы мои, тупые советы мои, тег ваш.

P.S. Нет. Это нельзя использовать в реальном времени на очках виртуальной реальности.

Русская азбука Mорзе для Андроид

Впечатлившись произведениями Павла Кучера решил изучить морзянку.

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

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

Я не программист, но пробовал как то писать на Яве под андроид программку для своих детей для обучения математике и игре в математику. И вроде получилось. Ну думаю попробую и тут написать, дело то нехитрое. Оказалось, что дело очень даже хитрое, ибо эта Ява под андроид не умела даже то, что делал мой ZX Spectrum в прошлом веке. Там можно было задать частоту звука и его длительность и наслаждаться прослушиванием. Тут же для получения нужного звука приходилось программировать по точкам синусоиду с которой будет колебаться динамик устройства.

В общем думал справлюсь за несколько вечеров, но шли дни, недели, месяцы. Программа рождалась в муках, справочного материала на Яве под Андроид на русском ничтожно мало, на форумах помогают плохо. И повторюсь, что я вообще не программист. В итоге, когда доделал, то понял, что программке пропадать грех, ибо аналогов то нет. Решил уж потратить ещё несколько вечеров на оформление и выкладывание для всеобщего использования на Google Play и 4PDA.

Программа полностью бесплатна и не содержит рекламы.

Поэтапное изучение знаков азбуки Морзе на приём и на передачу по методике близкой к методике ДОСААФ СССР. Приложение можно использовать и в качестве игры из двадцати уровней с увеличивающейся сложностью.

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

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

Приложение активно скачивается, почти 65 тысяч установок. В основном людям нравится. Правде не все андроид устройства одинаково полезны. На некоторых есть проблемы на «приём», у Явы есть особенности проигрывания звуков. Так, что у кого не пойдёт — не обижайтесь. Буду не против, если кто-то возьмёт за основу и перепишет программу профессионально.

Источник статьи: http://pikabu.ru/story/pishem_prosteyshuyu_igru_dlya_android_4373326


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии