I've not been feeling like making a blog post for a while, mostly because there haven't been any cool development milestones -- just steady progress. But it's been basically a month since the previous post, and i think it's healthy to give myself a pat on the head and count up the recent technical achievements, even if it's not much.
Since the last time, i've hammered a few more core aspects into the code, like functional tile objects and projectiles. PROTIP: Don't use Godot's physics-controlled nodes unless absolutely necessary, as the physics engine is so protective of its precious children and their parameters that you can't even set their position on spawn without jumping through hoops.
I also made a nerdy built-in debug console like in real videogames, which helped me in a several days-long crusade that was creating an easy and uniform spawner system. Now i can easily write code for things that spawn other things -- like traps that spit out darts. These required a LOT of calibration, but i'm also super proud of this silly system i wrote for them where a trap will always look at eligible bricks in the floor tiles and sneakily replace one of them with a pressure plate:
В последнее время не очень было настроение писать девлог, потому что не было каких-то сиятельных достижений -- просто постепенный прогресс. Тем не менее, с последнего поста прошел уже почти месяц, так что пора погладить себя по голове и подвести итоги, что же я там такое успел накодить.
Со времени последнего девлога я научил свою злополучную игру паре новых слов, например, "тайловые объекты" и "снаряды". Вот вам мой совет: не используйте в godot узлы, которые привязаны к движку физики, потому что эта дьявольская машина так сильно следит за физикой, что даже чтобы научить её попросту телепортировать объекты, вам понадобится совершить несколько совершенно безумных акробатических трюков с клавиатурой. Когда надо снаряды какие-нибудь добавить, используйте CharacterBody2D -- она тоже видит столкновения, но не питает иллюзий по поводу существования какой-то там непреклонной "физики".
Ещё я прикрутил консоль для дебаггинга, прямо как в настоящих видеоиграх. Нововведение оказалось очень полезно при последовавшем крестовом походе на систему спавна объектов. Теперь я очень просто могу заставить различные объекты спавнить другие объекты -- например, добавить ловушку, которая плюётся дротиками. Для неё потребовалась СЕРЬЁЗНАЯ калибровка, но я очень доволен результатом. Зацените, я написал систему, которая выбирает случайный кипич в полу и заменяет его на нажимную плиту:
I also made this nice flame trap, and in process created a wonderful and auspicious status effect system, since fire is officially the first effect to be added. The status effect system is optimized and tidy and keeps track of all effects for all entities, because it's just a dictionary of dictionaries of dictionaries, basically a cute little database. A refreshingly straightforward solution in this infernal antiparadise where simple ways to fix problems tend to conceal treacherous riddles. Sounds grim? Yes. Do we press on? We always do >:3
A health bar exists now, and dashing, and a few test tile entities like pillars and doors. I've also amassed a pile of bugs and questionable solutions that gently tap me on the shoulder and then slap me in the face whenever i get too involved in adding new stuff. Gotta clean up after myself, and i've been slowly finding ways to rebuild old code as i learn more cool things about this "prog🎸 ramming🐏" that everyone is talking about.
Sometimes i wonder if i should have not tackled a project this big without previous gamedev experience. All the gamedev gurus online will tell you that starting with small games is the best approach, and while they're not wrong at all, you must remember that small games normally have small systems, and therefore won't teach you how to make big games that require an entirely different, more responsible approach to adding features. Aaand while the game i'm developing sometimes feels bigger that i can handle, in the end it's mostly just basic programming. You know, vector maths, variables, loops, all the stuff they teach you in school. Just, LOTS of it.
After all is said and done, it's just a pet project that i won't ask any money for, so there's no stakes or responsibility besides the burning desire to create things. Also, when the coding gets too insufferable, i can always retract into my notes and draw/write up more concepts for the game, because the thematic components are just as important as the technical ones, and are arguably WAY more fun to rotate in one's head. Stay tuned for cool revelations about the game's setting and unique gameplay mechanics. Uhh, eventually. Once i'll start implementing them. And i gotta implement a lot more basic stuff first!
For example, i've just finished an outline for a competent asset loading system, and now all the important data is loaded up before the gameplay begins. Just like in real videogames. It's truly enchanting to tread in the footsteps of the titans...
Ещё я сделал миленькую огненную ловушку, и в процессе написал прекрасную систему эффектов, поскольку огонь нужно какием-то образом отслеживать. Эта система оптимизированная и очень компактная, потому что это по сути массив в массиве в массиве: маленькая миленькая база данных. Очень прямолинейное решение, что довольно редко встречается в этом инфернальном мире программирования, где простые решения обычно таят в себе страшные испытания. Звучит пессимистично? Да. Движемся ли мы дальше? Всегда движемся >:3
Теперь в игре есть полоска здоровья, и рывок на пробел, и несколько тестовых энтити, приязанных к тайлам, например, колонны и двери. А ещё у меня полные штаны багов и сомнительных технических решений, которые напоминают о себе каждый раз, когда мне хватает наглости игнорировать их и добавлять новые штуки вместо того, чтобы наводить порядок. Чем больше я работаю над игрой, тем больше узнаю про эффективные и простые способы реализовывать разные системы. Похоже, потихоньку я начинаю понимать, как работает это самое "программирование", про которое все говорят.
Иногда я сомневаюсь, стоило ли браться за такой крупный проект без опыта в разработке игр. Все интернет-мудрецы вам в один голос скажут, что лучше начинать с миниатюрных игр, и будут, в общем-то, правы. Но нужно помнить, что умение делать маленькие игры не очень хорошо переносится на большие игры. В маленьких играх ты думаешь: "Ну, да, я добавляю инвентарь, но в игре будет всего 20 предметов, поэтому я могу схитрить и просто забить их в код врчную, а не делать большую и навороченную систему, в которую потом будет легко добавлять новые предметы". И так с каждым аспектом игры! Так что это сознательное решние -- делать такую игру, в которой я научусь созданию всяких крупных систем. Да и если подумать, она не ТАКАЯ УЖ и крупная: на самом деле тут в основном задействуются азы программирования. Ну, знаете, циклы там, переменные всякие, векторная математика. Девятый класс, короче. Просто у меня это в огромных количествах, так что ощущается, как очень крупный проект для одного маленького человечка.
Ну, и в конце концов, это просто хобби. Я же не буду за деньги это продавать, так что и ответственности ни перед кем не несу. Меня движет вперёд лишь страстное алкание создавать крутые штуки. Ну, а когда программирование встаёт мне поперёк горла, я всегда могу зарыться в записки и продолжить работу над тематическими составляющими игры -- рисовать концепт-арты и всякое такое. Всё-таки игры -- это искусство, а не только побегушки и стрелялки! Так что не переключайтесь, дальше нас ждут крутые откровения по поводу сеттинга игры и уникальных игровых механик, которые лягут в её основу. Ну, или, переключайтесь, а потом возвращайтесь. Потому что перед этими механиками нужно еще много всяких типичных систем накодить.
Вот, например, система загрузки ассетов. Совсем недавно закончил прототип. Теперь все важные данные загружаются до начала игры, как в реальных видео игрушках. Ах, как завораживает идти по стопам титанов...