Devlog игры про ниндзю. 0x00

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

Порисовав немного для twitch канала своего, я поверил в себя и понял, что можно делать игры. Тогда я начал делать игру три-в-ряд про Флоренцию. Меня побудило сделать про это игру книга "Книготорговец из Флоренции". Так как я люблю книги, то торговля книгами меня тоже заинтересовала. Уж очень хотелось узнать что же там такого написано на 400-та страниц. Но как оказалось, что мои навыки рисования оставляют желать лучшего. То-есть я не во всех моментах мог хорошо что-то нарисовать. И немного обдумав своё положение, понял, что нужно пробовать ещё делать игры. Тогда я приступил к мозговому штурму, но те немногие игры, которые мне лезли в голову, было сложноваты для первого раза, а я ведь хотел игру в 3d сделать.

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

Первым делом отделил движок игры 3-в-ряд и сделал на её основе две программы, одна движок с ImGui, другая сама игра. Вот скриншот движка на раннем этапе.

Движок на раннем этапе
Движок на раннем этапе

Также у меня уже был готов упаковщик ресурсов. Расскажу об этом подробней. У меня каждый объект, ну или почти каждый объект в игре имеет свой набор данных. К примеру возьмём картинки. В игре я не использую png библиотеку для работы с изображениями и поэтому у меня есть отдельная программа, которая картинку переводит в нужный формат данных для моей игры, но проблема в том, что сам этот файл начинает весить очень много, в разы больше чем png картинка. Тогда я решил посмотреть и убедиться, что в android есть zlib библиотека, это такая библиотека, которая может работать с данными, сжимать их и разжимать. Она там была. Как работает мой упаковщик ресурсов?! У меня есть каталоги objects sprites fonts sounds. Он проходит по каждому каталогу и пакует файлы данных, файлы данных уже должны находиться в нужном формате. На выходе получается data.res файл со всем упакованными данными всей игры и res.h файл заголовков, который я использую, чтобы в коде обратиться к нужному ресурсу data.res. Вот как выглядит код загрузки 3d модельки к примеру.

m->mod = BLOCK_OBJECT; m->load_res(BLOCK_OBJECT); m->load_texture(BLOCK_PNG_TEXTURE); ... res = download_manager->get_res(RES_OBJECTS, _res);

Я привел образец моего кода. Тут два участка кода из разных мест в игре. У нас есть download_manager, который может выдать ресурс на объект. Он читает один раз этот объект, а потом выдает всегда один и тот же объект, если мы на него ссылаемся. Я думаю, что так все делают. Хотя раньше, когда я впервые писал свои движки, были вот такие тупняки что выделял для каждого объекта отдельную память.

Я проработал всю ночь и к утру мне удалось отобразить сцену, но сцена, объекты на сцене были прописаны кодом, а это капец как неудобно. Мне не хватало опыта сделать всё логично. Нужно было распределить правильно всю логику игры, чтобы код было удобно править. Я понимал, что мне нужно сделать в движке возможность размещать объекты на сцене и сохранять это в файл сцены. До этого я переписывал координаты из blender в игру и там всё отображалось так же как и в blender. Но нужно было упростить себе жизнь, сделав сложные вещи. И, я приступил к разработке.

Я поспал, отдохнул и приступил к разработке. Включил оркестровую музыку и начал делать движок.

Как же я страдал, пока делал Файловый менеджер для движка. Я стал копировать код из игры, чтобы в движке не повторять тот же функционал, и я столкнулся с проблемой. Дело в том, что у меня объекты хранятся отдельно от спрайтов, текстур, как вам будет угодно слышать. Если в игре я для каждого объекта задавал текстуру, которую задумывал, то в движке нужно было сразу иметь такой функционал. А то и понятно, что к объекту должна быть привязана уже какая-то текстура. Нужно было решить как присобачить номер текстуры для модельки. Что же такого придумать, чтобы не усложнять себе жизнь?

В итоге я придумал, что упаковщик будет сначала паковать текстуры и запоминать их названия. Потом, у каждого объекта должна быть текстура с таким же названием. Например, block.object block.png.texture. И исходя из этого я мог сделать связывание по названию, но сама связка означала всего лишь номер текстуры в файле данных. Так что всё удалось. Далее, я сделал файловый менеджер и он вроде работал как нужно.

Файловый менеджер
Файловый менеджер

Тогда я решил отдохнуть и погрязнуть в пучину чтения книжек, так как испытывал нехватку в чтении. Я читаю несколько книг одновременно. Могу к примеру захотеть читать Эпиктета: Беседы, а потом захотеть Искусство войны к примеру. В общем я остановил разработку и начал читать книги.

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

Размещение двух объектов
Размещение двух объектов

Далее нужно было сделать работу с камерой и триггерами. Кто-нибудь может помнит, если ему столько же лет сколько и мне, что в warcraft 3 был редактор карт и там были триггеры. Можно было установить триггер на область и если туда попадает персонаж, то срабатывает какое-то действие. Такое же я хотел сделать в движке. Нужно было реализовать перемещение камеры, сохранение её позиций, сохранение объектов, позиции и повороты, и триггеры. И всё, редактор карт готов.

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

3.4K3.4K показов
154154 открытия
8 комментариев

Читая твой блог я смогу стать разработчиком и заработать миллион денег на своей игре?

Ответить

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

Ответить

Да, если правильно организуешь своё развитие. Чтобы придумывать нормальные игры, нужно быть всесторонне развитым. Если ты можешь принять от меня совет, то вот он будет такой - по возможности уделяй больше времени себе. Ходи в спортзал, читай книги не только программерские, но и те, которые содержать в себе информацию о мире. Всё-таки мы делаем игры, которые хоть как-то похоже на наш мир. Чем больше ты будешь начитан, тем больше вероятность, что ты придумаешь игру. Меньше развлечений с друзьями, больше чтение книг и уделения себе внимания. Потом когда заработаешь много денег, уже будешь понимать как жить дальше, ну и развлекаться с друзьями. Я бы сам хотел так, но пока мало книг прочитал. Если бы заработал много денег, то стал бы меньше работать наверное, а может я больше бы читал, пока не прочитал бы всё, что заказал в интернет магазине. Вообще развлечение это по молодости интересно, потом уже становиться скучным делом, если ты полюбил литературу, программирование, реверс-инжиниринг.

Ответить

Молодец что не сдаешься. Желаю успехов!

Ответить