Как я написал игру за 3 года

На днях я закончил создание своей небольшой игры и хочу описать вам путь, по которому я прошел. Хочу сразу оговориться, что моей главной целью было получение знаний и опыта в создании 3D игр для Android, и этого я успешно добился. По этой же причине я не использовал готовые движки.

image

Я начинал с создания карт для Counter-Strike: сделал карту с автобусной остановкой из своего города, пытался сделать школу. Круто же постреляться в родной школе? Это дало мне базовое понимание из чего состоит виртуальный мир.

Несколько позже я начал проходить туториалы по OpenGL на Android. Радовался как ребенок, когда впервые на экране телефона появился заветный треугольник!

image
*Картинка взята отсюда

Затем получился кубик с наложенной текстурой камня и появились мысли о создании своей простейшей игры. Перенос игры Portal на Android казался вполне достижимой задачей для новичка. Я сильно недооценивал предстоящий объем работ. Хорошо, что на то время уже существовал Portal в Google Play, и я успел создать только одну комнату.

Тогда я решил сделать что-то попроще и, увидев в Футураме бильярд без гравитации, решил его по-быстрому воплотить (пока другие не успели). Оказалось, что я по-прежнему недооценивал объем работ. И, кстати, бильярд без гравитации таки успели сделать раньше меня.

image
*Скриншот из Futurama, сезон 7, эпизод 5

Вот с этого момента, примерно 3 года назад, началось создание моей первой игры Star Pool — бильярд в невесомости. В начале у меня было базовое знание Java и минимальные навыки редактирования картинок. Я работал, в основном, после работы, а также с большими перерывами, когда совсем не хватало времени.

Графический движок


По мере того, как я добавлял функционал к графическому «движку», заимствованному из туториалов, он становился все менее гибким и более хрупким. К этому моменту я 2 раза его серьезно переделывал, и сейчас его структура сделана «на троечку». Если б у меня была возможность вернуться в прошлое, я б себе сказал: «ПРОДУМАЙ АРХИТЕКТУРУ!!!». Тем не менее, из плюсов – быстрая загрузка и весьма неплохая производительность.

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

image
*Картинка взята отсюда

Физический движок


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

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

image

Текстуры


Когда игра уже стабильно работала, и близился момент релиза, я вспомнил что использовал текстуры из чужих игр. Я не смог найти текстуры приемлемого качества в бесплатном доступе, и решил нарисовать их самостоятельно (в Paint.net). А что? Тоже опыт! Но поскольку с фантазией у меня туго, я рисовал свои текстуры похожими на те что использовал в начале. Больше всего времени заняла главная иконка. Серьезно, ее пришлось самому придумывать; несколько дней ее делал и опрашивал друзей, как она им нравится. Правда, классная?

image

Релиз


Многое из того что изначально планировал пришлось отложить. Каждая дополнительная фича тянула за собой целую гору работы, и неизвестно закончил ли бы я эту игру вообще. Я выбрал основной набор функционала, который вошел в финальную версию. Не буду скрывать, что пишу эту статью в надежде, что вы скачаете игру и оставите отзыв: хороший или плохой – не важно. Это будет моя оценка, которую заслужил. Так что, если случится чудо и наберется достаточно скачиваний, я продолжу работу и сделаю онлайн режим с чатом и плюхами.



Спасибо за внимание!
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 64
  • +1
    спасибо за рассказ.
    красивая игра, поставил бы с удовольствием.
    • +1
      Хм… В чём польза от вращения и перемещения мира вокруг камеры, а не самой камеры по миру? Понятно, что вычислительно будет примерно одно и то же (при условии, что трансформации применяются ни к каждому объекту по отдельности), а вот концептуальный смысл не понимаю.
      • +1
        Я когда в детстве делал свой 3D движок (а в те времена была реально проблема с литературой и всё, что я делал, брал из головы, начиная с самых основ), то у меня тоже весь мир вращался/двигался, а идея камеры мне даже в голову не приходила. Дело в том, что камера предполагает относительно сложные вычисления с матрицами, а я тогда про матрицы и не знал ничего. Максимум, мог повернуть точку вокруг другой точки на заданный угол. В общем, камера — относительно математически сложный объект, поэтому, скорее всего, автор обошёлся без неё.
        • +1
          Не совсем. Потому что камеры нет. Камера — это мы — витруальный наблюдатель, и мы статичны, потому приходится «вращать мир».
          Остальные фичи «камеры» — это всякие искажения перспективы и постпроцессинг.
          • +2
            Не обошелся :)
            У меня есть класс камера который держит всю математику в себе, а снаружи выглядит как камера.переместить(10, 20, 0).
            И да с матрицами там есть немно гемора, но методом проб и ошибок таки можно заставить их работать :)
          • +3
            Думаю так считать проще. Чтоб «наложить» объект на экран, его вершины перемножаются на 3 матрицы по очереди:
            1 Матрица модели, которая держит информацию о положении объекта относительно начала координат.
            2 Матрица мира, все объекты перемножаются на эту матрицу. Таким образом мы двигаем мир относительно камеры (это то о чем вы спрашивали).
            3 Матрица проекции — что-то типо пареметров линзы камеры, угол обзора и тд.
            Вот здесь лучше объясняют, с картинками: opengl-tutorial.blogspot.com/p/3.html (Матрицы Модели, Вида и Проекции)
            • +1
              Думаю так считать проще

              Как я уже писал выше — нет. По-другому считать невозможно. Ведь экран же статичен? Вы же не сможете повернуть экран? Потому вращаете «мир».
              • +1
                Ну да, ваше объяснение лучше.
            • +18
              Просто автор футураму пересмотрел. Там корабль стоит на месте и двигатель вращает вселенную вокруг :)
              • +1
                Ясненько, для аутентичности.)
                • +2
                  Вы ведь понимаете, что эта фраза на самом деле не имеет смысла? Если корабль и остальная вселенная вращаются относительно друг друга, то не важно что из них считать точкой отсчета, невозможно сказать, что именно корабль «стоит на месте» или наоборот вселенная.
                  • +4
                    Я так понимаю, сериал вы не смотрели. :-) Это просто шутка.
                    • +3
                      Если я еще не все забыл, то «не важно» только в условиях отсутствия ускорения. А вот если одно из тел движется с ускорением, то его можно отличить. В случае же вращения ускорение есть. Так что фраза имеет смысл.
                      • +1
                        Не важно и с ускорением, потому что оно то же, что гравитация
                        • +1
                          Рискну опозориться, но все же спрошу. А в чем тут принципиальное отличие от решения парадокса близнецов? Там ведь видна разница если смотреть со стороны третьей ИСО.
                          • 0
                            Я нифига не умею обьяснять (а ещё и слоупок), но суть в том, что в классических примерах теории относительности (например с поездом) на все объекты действует сила тяжести, которая на самом деле не отличима от ускорения 9.8м/с^2 направленного вверх. Таким образом раз "не важно" что считать точкой отсчёта в ситуации, когда на объекты действует сила тяжести, то неважно и когда они движутся с ускорением. Ускоряющийся относительно остальной вселенной, наблюдатель в космическом корабле по прежнему может считать себя неподвижным, как на поверхности Земли, а наоборот, вселенную вокруг считать двигающейся вокруг него с ускорением.

                            Более понятно (но в то же время без матана) это объясняется, например, у Брайана Грина во всем известных книгах "Элегантная вселенная" и "Ткани космоса...".
                  • +1
                    Вблизи нуля координат операции с плавающей точкой точнее. Это может быть одной из причин.
                  • –9
                    очевидно, что раздел «Я пиарюсь» себя не оправдывает.
                    С другой стороны, почитать подобные личные истории всегда интересно.
                    Boomburum, может сделать отдельный хаб на Мегамозге для этого?
                    Или вообще «Я пиарюсь» сделать симлинком в Мегамозг. Пишешь в него,
                    а статья автоматом там публикуется.
                    • +14
                      Я новенький на хабре, чтоб попасть в «Я пиарюсь» нужен рейтинг вроде.
                      Ну и плюс я не указывал линку на игру, не хочу быть слишком навязчивым.
                      • +3
                        Это даже к лучшему. Меня он забанили за пиар в хабе «Я пиарюсь» =).
                        • +1
                          Ни в коей мере! Вы молодец, что сделали красивую игру и вдвойне, что написали об этом.
                          Мой комментарий как раз и был призван привлечь внимание к таким людям как вы,
                          выделив отдельный хабр, в который можно было бы писать, не имея таких жёстких требований как в хабе «Я пиарюсь».

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

                          Я бы вообще предложил сделать этот хаб с возможностью публикации постов пользователями Read@Comment.
                        • +2
                          Не все читают «мегамозг». Кроме того, история действительно интересная и достойна хабра.
                          • –3
                            Если вы заметили, я предложил сделать хаб в виде симлинка на мегамозг.
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • +2
                            Ура! Я победил бота на низкой сложности со второй попытки! Пять звёзд!
                            Как это здорово, что люди делают то, что им интересно. И оно получается! Это вдохновляет.
                            Более подробный хаброориентированный рассказ будет?
                            ЗЫ. С меня чашка кофе (или полчашки)! [купил версию без рекламы]
                            • +4
                              Спасибо!
                              Насчет более хаброориентированного рассказа: я продолжаю работу над игрой, и свободного времени совсем мало.
                              Плюс, я не уверен что внутренности моей игры будет хорошим примером. Я изобретал колесо, когда стоило посмотреть что делают другие.
                            • 0
                              Расскажите, как вы реализовали glow-эффекты на шейдерах?
                              • +2
                                Там нет шейдерных glow эффектов. О чем конкретно вы спрашиваете?
                              • +1
                                Не нашел в статье, где скачать-то? Бесплатно без регистрации без смс? Может плохо искал?)
                              • +2
                                Онлайн режим? А есть желание? С чатом? Моё мнение: не нужен чат. Это скорее станет геморроем.
                                Вот посмотрите на Хартстоун. Там нет чата, но есть икс условных смайликов (интернациональных). Не более того. Кроме Хартстоуна видел подобный подход ещё в нескольких играх 1:1. Скорее одобряю именно такой подход.
                                Видел игровые чаты с ушлёпочными диалогами. Я думаю, вы запаритесь с модерацией, если в чате будут буквы.
                                • +1
                                  Для начала будет просто со смайликами.
                                  Может знающие люди поскажут — если у игроков будет возможность свободно отправлять любой текст друг другу, скажем небольшие сообщения по 50 символов, 5 раз в минуту. Без модерации, но у другого игрока есть возможность отключить чат. Есть ли запреты скажем у гугла на такое?
                                  • +2
                                    Мне кажется даже вести список стоп-слов — уже очень утомительное занятие.
                                    А чат без стоп-слов (или как они там называются)… Вот напорется игрок на ушёпка, настроение упадёт, он выйдет и больше никогда не зайдёт. И ваш труд будет испорчен каким-то малолетним идиотом.
                                    ЗЫ. (отключить чат один раз — это не решение проблемы, надо банить виновника после икс попыток)
                                    • +1
                                      Подобная система с отключениями есть в World Of Tanks от Wargaming. Однако это ухудшает ситуацию в некоторых случаях: например, когда нужно координироваться или спросить что-либо важное, а у некоторых игроков чат отключен из-за негатива, который довольно не редкое являение
                                      • +1
                                        Но там также модераторы банят, если на игрока пожалуются. Плюс в игре есть возможность не слушать конкретного игрока.
                                        Стоп слова мне не очень нравятся, к примеру слово «оскорблять» содержит мат, в некоторых играх такое слово полностью или частично закрашивается.
                                        • +1
                                          Модераторы там не учавствуют никак — все автоматизированно. «не слушать конкретного игрока» конечно можно, но неадекватов достаточно много и всех не добавишь. При этом система банит субъективно лишь 5-10% таких.
                                      • +1
                                        Вы ж поймите, в несоциальных играх чат обычно используется для того, чтобы проделывать однообразные действия с мамкой другого игрока.
                                        Поэтому чат в них не нужен.
                                        • +1
                                          Хех. Что если чат будет выключен по умолчанию, а если игрок хочет слышать гадости, то он может включить чат в настройках?
                                          Просто иногда реально хочется похвалить противника за хороший удар, а сказать можешь только смайлом <палец вверх>.
                                          • +1
                                            Тогда нужно два смайла — палец вверх и палец вниз. Но уже ими игроки могут злоупотреблять, постоянно спамя.
                                    • +4
                                      Размер apk <5mb, круто. Юнити б сразу из коробки около 16-18 был бы.
                                      • +1
                                        Онлайн режим добавит еще около 1.5 мегабайта.
                                        • +3
                                          Хотелось бы больше услышать про графику. А именно как были сделаны эффекты: полупрозрачная стенка с двигающимся шумом, анимация отскока от стенки, как был реализован ray tracing. Было бы хорошо, если бы автор написал отдельную статью про это. И мне кажется, что это было бы намного лучшим пиаром, чем рассказ про какие-то основы OpenGL.
                                          • +2
                                            Поскольку я уже дома, то могу посмотреть как я это сделал (давно это было). На отдельную статью пока что не хватает времени.
                                            Стол это простой куб, 6 граней, на который наложена текстура с прозрачными частями — лузы. На альфа канал текстуры накладывается текстура шум, т.е. в шейдер передаются 2 текстуры. Также в шейдер передается смещение текстуры шума, которое обновляется с каждый кадром. На самом деле текстура шума используется дважды, условно: смещение * 1 — смещение * 2 (движение в разные стороны).
                                            Анимация отскока это квадратик с полупрозрачной текстурой кольца, который с каждым кадром увеличивается и становится более прозрачным.
                                            Ray tracing просит физический движок предсказать где окажется следующее столкновение если задать шару такое направление полета. Дальше рисуется лазер (axis alligned billboard, квадратик всегда направленный перпендикулярно камере, каждый кадр пересчитывается его матрица), и «муравьи» (point billboard).
                                          • +3
                                            Здесь немного информации о спрайтах или billboards
                                            nehe.gamedev.net/article/billboarding_how_to/18011
                                            • –2
                                              Круто же постреляться в родной школе?
                                              Эм!?.. ок…
                                              • +9
                                                Мне уже делали замечание по этому поводу, я это писал без плохой мысли.
                                                Я думаю людям, играющим кс, было бы интересно побегать в игре по знакомым им местам. А в школу ходили все.
                                              • +5
                                                3 года… снимаю шляпу перед вами. Сколько же труда и времени сюда было влито. Жаль только, что через неделю никто и не вспомнит по вашем приложении. И это конечно печально, но это суровая реальность текущего положения для мобильных игр. Неблагодарный труд и в какой-то мере бессмысленный.

                                                Вот, что меня всегда останавливает, это что тратишь силы, время, вкладываешься в приложение, а в итоге просто не можешь его показать людям. Но приходят толстые дяденьки и вкладывают 40 миллионов в своё творение уровня удержи шарик на линии и набирают 50 миллионов аудитории. Снимают свои 4 миллиона и по новому кругу.

                                                Весь гугл плей забит этой мутью вроде закажи отель, установи показ погоды, установи будильник и прочее в таком духе. Достойные приложения как обычно в самой глубине, откуда их уже никто не вытащит. Идиотская система, одни деньги решают всё.
                                                • +7
                                                  Да и черт с ним, я не жалею.
                                                  Я уже очень рад что люди оставляют позитивные отзывы, сижу довольный :)
                                                • –2
                                                  Выше уже поднимался вопрос про хабрахабр/«я пиарюсь»/мегамозг, но я все-таки напишу это в отдельном комментарии, а не в ответе на тот.

                                                  Посту действительно не место на хабре. Судя по скринам, игра действительно классная и прочитать про движок и _технические_ проблемы, возникшие в процессе разработки было бы очень интересно. И это хотелось бы увидеть именно здесь. Но в текущем виде — однозначно на мегамозг. Уверен, не приведи вы скрины/видео — комментарии были бы куда резче и негативнее.
                                                  • +2
                                                    Поддержал разработчика отключением рекламы! Инди разработка рулит, чо.

                                                    Из отзыва:
                                                    Сделано красиво и необычно! На OnePlus One полет нормальный, бегает шустро. Музыка также приятная электронная.

                                                    Из минусов:
                                                    1) При ударе мешает ближняя стенка стола, особенно на гранях (все белое, ничего не видно);
                                                    2) Нельзя вертеть камерой во всех плоскостях.
                                                    2а) Хочется вертеть камерой не только во время свободного просмотра, но и поставить кий и посмотреть, как там все пойдет.
                                                    2б) Если я летаю по комнате, а противник производит удар, камера всегда перемещается на его удар (лучше бы это делалось по горячей клавише).
                                                    image
                                                    • +2
                                                      Спасибо за отзыв!
                                                      Да я знаю об этой проблеме, много людей пишут.
                                                      Я хочу в ближайшем времени убрать ближнюю стенку стола (не знаю еще как). Пока можно воспользоваться кнопочкой с глазом слева чтоб поменять точку обзора.
                                                      • +1
                                                        Я не знаю как у вас всё работает но как вариант: Сделать каждую грань «стола» отдельным объектом. То есть получиться 6 плоскостей. После чего делаем рейтрейсинг (пускаем луч) от камеры в сторону «объекта интереса». И дальше либо меняем прозрачность плоскости в которую попал луч, либо меняем текстуру плоскости.

                                                        Ещё, как вариант, можно заморочится с шейдером. Чтобы он отрисовывал текстуру тем насыщенее чем дальше она от камеры. Это наверно предпочтительнее визуально, потому что не будет скачков при смене прозрачности плоскости.

                                                        • 0
                                                          Примерно так и сделал с помощью шейдера.
                                                          Прозрачность точки стола = dot(view, normal) — скалярное произведение (косинус угла) нормали и вектора взгляда. Нормали сглаженые (в точках где стыкаются плоскости, нормали этих плоскостей равны), что делает гладкий переход прозрачности.

                                                          image
                                                          • 0
                                                            Обзор предметов стал лучше, но теперь контрастность заднего фона всё перебивает. Можно его сделать более тусклым, чтобы игровая область выделялась. Вот просто глядя на этот кадр создаётся впечатление, что задняя стенка бильярдного стола нарисована прям рядом с дверью на стене. То есть нет глубины и позиции в пространстве. Это можно сделать заблюрив фон, но так как это ресурсоёмко — поэкспериментируйте со степенью освещённости заднего фона. И дальние от игрока стенки можно сделать более насыщенными.
                                                    • +2
                                                      Очень талантливо сделано, жалко у меня не андроид
                                                      • +1
                                                        Попробуйте ближнюю стенку стола плавно притушиваться по яркости и повышать прозрачность.
                                                        • +1
                                                          Спасибо, попробую. Многим неудобно целиться изза этой стенки.
                                                        • +2
                                                          Мысль возникла, как раз глядя на иконку приложения
                                                          Почему-то кажется, если у вас космический антураж, и текстуры на шарах поменять на текстуры планет — будет интереснее выглядеть.
                                                          • +1
                                                            Возможно сделаю как достижение — выиграл 10 боев, получи шарики, 20? Получи кий дарта вейдера :)
                                                            • +1
                                                              Вместо кия — ракета. Навёл на шары, дал ускорение и полетели планеты по орбитам )
                                                          • +1
                                                            Не очень логичным кажется утверждение «главной целью было получение знаний и опыта в создании 3D игр для Android… поэтому я не использовал готовые движки ». Всё-таки обычно 3D игры для Android делаются на движках, и знание популярного движка может в будущем пригодиться больше, нежели свой велосипед.

                                                            Ну а игра классная, поздравляю!
                                                            • +3
                                                              Не соглашусь. Цель же была — освоение инструментария. А освоив принципы, научиться пользоваться сторонним движком — сравнительно лёгкая задача.
                                                            • 0
                                                              Идея игрухи супер и сделано красиво
                                                              • 0
                                                                Если бы был девайс с Андрюхой — обязательно поставил бы, идея понравилась

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