sundwell.dev | Хроники инди-разработки – Telegram
sundwell.dev | Хроники инди-разработки
694 subscribers
224 photos
105 videos
136 links
Всё про инди от реального человека - девлоги, процесс маркетинга, геймдизайн, разработка и пиксель-арт
Download Telegram
День 129

Вчера приступил к новому разделу в курсе - звуки и музыка (а еще я хотел вчера написать пост за вчера, каламбур или реальность?)

Хоть отчасти у меня уже есть какие-то звуки в игре, но далеко не факт что я их правильно "использую" если можно так выразиться

Например из текущих вопросов по звукам есть один нерешённый

Как правильно проигрывать звук до конца, если родительская нода "очищена/удалена"?


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

Пока что решение у меня довольно банальное, но очень и очень неудобное - использовать AnimationPlayer. Т.е. когда я подбираю апельсин, то он у меня становится невидимым, проигрывается звук и спустя пол секунды я удаляю апельсин с помощью queue_free(), но это прям реально неудобно если делать для всех врагов, для каких-то разрушаемых объектов и т.д.

Препод на курсе сделал костыль, что не есть плохо в контексте микроигры, но для чего-то большего его вариант уже не подходит. Варианты на курсе:
1 - Враги. Враг получает урон - проигрывается звук, когда враг умирает - то у него есть специальный DeathComponent, который оставляет какой-то след после врага (у меня это "души" врагов), и в этом DeathComponent он запихивает тот же самый звук и вызывает его при смерти врага. Довольно сложно это описать вот так сразу - но надеюсь что-то понятно 👀

2 - Поднятие опыта. Звук поднятия опыта у него сделан не при соприкосновении "опыта" с персонажем, а в момент, когда опыт попадает в радиус подбора этого опыта, анимация полёта длится около 0.3 секунды и звук успевает проиграть за это время

Но вот в комментах к видео кто-то предложил интересный вариант - проигрывать звук поднятия опыта в ExperienceManager, т.е. когда опыт увеличивается - тогда и звук проигрывать. Звук не прервётся, потому что наш ExperienceManager всегда существует и не удаляется из сцены

Про опыт понятно, а про врагов и остальное? В общем изучаю сейчас этот вопрос, задам его сейчас преподавателю и потом поделюсь с вами решением этой проблемы

Еще уже как почти месяц у нас есть саундтрек для первой арены, ну ооочень хочется с вами поделиться им, я вообще в шоке с того, какой он классный вышел и профессиональный (саундтрек > вся игра). Но добавлением его в игру я займусь или же сейчас или же завтра, а также добавлю его в видео-отчет за 30 дней, который кстати задерживается уже почти на 10 дней 🤝🤝

Саундтрек вообще мощнейший реально, он состоит из 5-ти частей, которые имеют "хвосты" в начале и в конце, тем самым я могу после первой части включить сразу пятую и наоборот, что это даёт? Я могу менять настроение музыки незаметно для игрока в зависимости от ситуации на экране, допустим битва с боссом это максимальное напряжение (5-я часть), когда много врагов на арене - 3 или 4-я часть, когда врагов мало - 1 или 2-я. У нас очень похожие вкусы с звукарем и будущие игры будем делать с большим упором на музыкальное и звуковое сопровождение - динамика, световые эффекты, вкусные звуки и визуальщина.. эх, мечты 😊 (но мечта выполнимая)

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤝21
День 130-131

Вчера и сегодня занимался звуками и музыкой и.. как же это нереально сложно 😫

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

Т.е. как минимум все звуки должны:
- Быть одной громкости
- Быть в одном стиле (ретро, фэнтези, рпг и т.д.)
- Быть в "тему", чтобы не перегружать звуками игру
- И еще какие-то пункты, которые я забыл 👀

Ну ладно, это мы что-то придумаем с звукарём потом, может есть какой-то курс "Как сделать звуки хорошо и не сделать плоха к игре", который поможет в этом всём

Про фактический прогресс:
- Закончил главу с звуками в курсе
- Сделал пару компонентов для проигрывания случайных звуков (такое уже есть встроенное, но его не хватает). Под "случайные звуки" имеется в виду один из нескольких звуков для одного и того же действия, например может быть 3 вариации звука выстрела и каждый раз будет случайный проигрываться (ну или же pitch_scale менять)
- Добавил музыку в игру. Пока что она "глупая" и не подстраивается под игру, но хоть что-то уже есть
- Расстроился, потому что "блин, как же сложно, проще код писать, чем звуки подбирать"

И как же я рад, что наконец-то закрыл все "хвосты" по работе (работам) и даже в завтрашнюю пятницу я смогу уделить нереально много времени разработке игры и, наконец-то, закончу видео с отчетом за дни с 90 по 120 (руки не доходили доделать)

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

К слову музыку и звуки делает мне Женя, и у него есть ютуб канал с его музыкой, в основном это фонк, вот парочка прям мощных треков - первый и второй. Женя прям обожает музыку с "дропами", и я, кстати, тоже. Поэтому концепт следующих игр, их динамику и всё такое буду делать учитывая наш звуковой стиль (динамичный, агрессивный, современный или даже киберпанковский)
В музыке дроп − это своеобразная «яма» в треке, затишье, после которого трек возобновляется с новой силой


Прикреплю пару видео - одно с процессом поиска и добавления звуков и музыки, второе - превью с результатом (с 0 кадрами временами, ох уж этот макбук на интеле...)

Сам трек и его части я закину в комменты. Меня лично трек прям разрывает, осталось как-то правильно его в игру интегрировать (но возможно даже и такое, что мы поменяем саундтрек 🤔)

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥4🎉2👍1
Media is too big
VIEW IN TELEGRAM
Отчет готов 🐸

За дни с 90-го по 120-й

Разработка и фактические результаты по игре
- Новый дизайн, некоторые новые текстуры и анимации
- Переработал систему улучшений оружия и.. внедрил её 👀
- Архитектура. Я реально стал увереннее себя чувствовать в архитектурном подходе к игре (хотя много чего еще хромает)

Менеджерские штучки
Тот месяц я больше был менеджером и геймдизайнером, чем разработчиком
- Сделал гейм дизайн-документ
- Собрал команду с двух художников и одного звукаря (и я есесна - разработчик)
- Как-никак организовал работу в команде с помощью HacknPlan и группы в ТГ

Утиные истории
- Поделился велоисториями и моей гениальной аварией
- Рассказал про начало карьеры - "работяга на заводе"

Видео монтировал 20тыщ часов, мне в принципе понравилось, надеюсь вам тоже зайдёт, глянуть в норм качестве можно на ютубе - https://youtu.be/cMBEN8S75j8

А так прикреплю его и к этому посту (в конце превьюшку для ютуба не убрал, да да я..)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71👍1
This media is not supported in your browser
VIEW IN TELEGRAM
День 132

Юайная часть готова.. я так думал

Вчера (в пятницу) продолжил смотреть курс (я так рад что я его уже почти досмотрел ☺️)

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

Сейчас выходные, но команде уже подкинул пару заданий - сделать заставку для главной менюшки и сделать мелодию для неё же

На данный момент делаю все менюшки, которые были во всех пройденных видео, ведь я всё еще считаю, что лучший вариант обучения по видео-материалам это:
1. Просмотреть часть видео/несколько видео до логичной точки
2. Попробовать сделать это всё самому не подглядывая никуда и, что самое главное, делать немного иначе и не повторять 1 в 1
3. Если не выходит - заново всё пересмотреть и вернуться к пункту №2

Всем рекомендую придерживаться именно такой "тактики" в обучении по видео, ведь если смотреть видео и параллельно писать код/повторять за преподом, то толку от этого меньше, чем просто смотреть видео без практики, ведь:
1. Вы не сосредоточены ни на том, что происходит на видео, ни на том, что вы пишите
2. Вам приходится постоянно перематывать, чтобы успевать за преподом и происходит пункт №1
3. Вы не закрепляете это всё на практике и не сталкиваетесь с возможными проблемами при самостоятельной работе. Ведь уже всё "на блюдечке" подано, а если не бороться с какой-то проблемой, то готовое решение не закрепится в голове надолго (или вовсе)

И, что самое радостное - так это следующее видео в курсе.. метапрогрессия 💃

Сама по себе эта механика мне не прям чтобы нравится, потому что она так или иначе ломает изначально заложенный геймплей и там в любом случае будет числодрочерство в улучшениях (+0.2 к урону за уровень, +3% к скорости передвижения...)

Но для меня самое главное это попрактиковаться с разными системами улучшений, ведь в будущем диаблоиде мне нужно будет ой как хорошо разбираться в перманентных улучшениях (и не только), поэтому мне такое надо 🎩

Уже есть мутации и улучшения для оружий, а будет еще и метапрогрессия, главное не превратить игру в что-то по типу:
1. Первая наковальня и выпала +1 пуля? - Это легкая и скучная победа
2. Первая наковальня и не выпало редкое улучшение? - Скучно, не интересно + смэрть

Но с балансом уже потом разберусь, сначала доделать метапрогрессию, менюшки и еще пару небольших (очень больших) изменений

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

И, как всегда (почти) - прикрепляю видео с результатом

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61👍1
Нас становится всё больше и больше (даже не знаю почему 👀) и я бы хотел вкратце рассказать про то, как обстоят дела сейчас и что планируется в будущем

Начну с самого главного - конечная цель

Мне очень нравится играть во всякие игрушки с прокачкой, лутом, гриндом боссов/ресурсов (но умеренным), поэтому моя цель - это сделать ARPG диаблоид с видом сверху, в котором будет как обычная сюжетка, так и серьёзный лейтгейм (как в Path of Exile)

Пример я буду брать из следующих игр:
- Path of Exile (основная)
- Last Epoch
- Diablo 2
- Torchlight и Torchlight 2
- Titan Quest
- Grim Dawn
- Slormancer

Во всех этих играх у меня очень много наигранных часов (от 70 до 800+) и во всех кроме POE мне вот чего-то не хватало. С течением того, как я разбираюсь в самой разработке игр и в самом геймдизайне я начинаю понимать проблемы каждой игры (стараюсь объективно смотреть на такие игры)

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

Общий темп игры

Лично мне нравится подинамичнее, в то время как в Grim Dawn и особенно в Titan Quest всё довольно таки медленное в сравнении с другими ARPG'шками

Про лейтгейм

В Grim Dawn по личным ощущениям уже после 30% сюжетки делать в игре нечего, всё однообразно и монотонно, а уровни сложности просто повышают здоровье и урон врагов, а твой уменьшают.. классное решение, обожаю такой скейл сложности 👍

Механики

Всё очень банально - есть 10 навыков, но одним удобно пользоваться, зажал кнопку - и пошло с автонаводкой. А для другого надо ждать заряд, потом перезарядка, потом пока этот скилл борщ сварит, а DPS (урон в секунду) больше ну максимум на 10%, если вообще не меньше чем у первого навыка. И этих всех навыков десятки, они просто бесполезны, игрок никак не вознаграждается за задротство сложных механик, их совмещение и так далее и эти механики, условный огонь, кровотечение, яд - это всё просто 10тыщ видов ядов, которые почти никогда друг с другом даже не синергируют (взаимодействуют)

Например игра Slormancer. Воин - кровотечение, стрелок - яд, маг - arcane bond (хз как перевести, в общем тоже яд, только магический). Но.. эти все "яды" ни с какими навыками не синергируют, а сами навыки бесполезны и наносят меньше урона, чем первый навык каждого персонажа - обычный удар/выстрел

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

Чем я занимаюсь сейчас

С самого первого дня геймдева я твёрдо решил - никаких "игр мечты" пока не наберусь опыта, иначе я прогорю/расстроюсь/вырежу 90% контента с игры или всё одновременно

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

Общие дела

Нас сейчас в команде четверо - я (разработчик), двое художников и один звукарь

Работаем через HacknPlan, но, возможно, скоро пересядем на чет другое

Текущая игра - R.I.T.K.A. Rampage, смесь Vampire Survivors, Brotato и 20 Minutes Till Dawn

Поиграть в неё можно тут - https://sundwell.itch.io/ritka-rampage, исходный код открыт и лежит на гитхабе - https://github.com/Sundwell/ritka-rampage

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

P.S. Поешка - ван лав ❤️
P.S.S. Очень рекомендую поиграть во все игры, которые упомянул в посте - каждая затянет на десятки часов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥172👍2
Media is too big
VIEW IN TELEGRAM
День 133-134

Главное меню ✔️
Настройки ✔️
Пауза ✔️

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

Также добавили с звукарем мелодию в главное меню, закину её полную версию в комменты (может пора делать плейлист на ютубе с OST как у других 🤔)

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

Что сейчас нужно для того, чтобы игра считалась играбельной:
1. Добавить еще 6 улучшений для пистолета
2. Добавить Лук с уникальной механикой стрельбы для игры (не просто зажать ЛКМ) + продумать и добавить 10 улучшений ему же
3. Добавить разделение мутаций на три класса - стрелок, призыватель и ... третьего еще не придумал. Воин это классно, но игра про стрельбу 👀
4. Заплейтестить игру, чтобы игралось +- адекватно и не было дикого дисбаланса. Подгонять, вероятно, буду всё одновременно - улучшения для оружий, мутации и систему прогрессивной сложности. Кстати, напоминаю про табличку, где я "изобретаю" сложность - https://docs.google.com/spreadsheets/d/1h0yJn5iCdGbwNw9AluOc30mQPv30KUZ34NJrTOjpJzE/edit?usp=sharing, эксель мощная вещь 😎
5. Боссы. Каждые 5 минут будет босс
6. Самое главное - система сохранений, а то без сохранений как-то не ахти

А для того, чтобы полностью закончить этот проект и приступить к следующему нужно будет дополнительно:
1. Добавить 2 локации со своими мобами и боссами. Каждая локация будет сложнее предыдущей. Это не просто редизайн мобов и локации, а вот чтобы даже начальные мобы были сложнее/умнее чем на предыдущей локации
2. Добавить метапрогрессию
3. Отшлифовать UI (добавить иконок, картинок, исправить некоторые неточности)
4. Добавить недостающие звуки и отшлифовать/изменить существующие. Вообще щас звуки так-то не готовы по-большему счету, мы их будем делать в последнюю очередь, как говорил ранее
5. Добавить эффектов (уместная тряска экрана и в некоторых местах побольше визуальных эффектов aka VFX)
6. Поспать (опционально)

Также только что обновил версию на itch.io - https://sundwell.itch.io/ritka-rampage

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍4
День 135

Самый свежий вчерашний пост

В понедельник полностью посвятил себя теории - просмотр курса и просмотр видео на ютубе из плейлиста "Смотреть Позже" (их там миллиард..)

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

Что я глянул:
- 2D glow in Godot 4 - Вроде как и показано как сделать эффект "сияния", но вот без теории что-то не то. Глянуть можно, всего-то 35 секунд
- How to use Classes in Godot! - Intermediate Tutorial - Меня обманули 😢. Тут не intermediate, тут beginner, ничего нового не узнал, в ролике просто показывается как используются классы на микропримере с деревьями, но толком ничего не объясняется
- Premature Optimization (преждевременная оптимизация) - Для меня это не в новинку, но иногда стоит напоминать себе про "очевидные" вещи, чтобы не забывать о них. Настоятельно рекомендую вообще всем для просмотра и, дополнительно, еще рекомендую эту статью для прочтения. А еще классную фразу из комментов под видео процитирую:
Если твой код не работает, нам не важно насколько быстро он не работает

[EN] If your code doesn't work, we don't care how fast it doesn't work

Именно поэтому нет плохих языков (кроме пхп конечно же), на C++ можно сделать нереально быстро работающий код, а надо ли это вообще бизнесу? Ведь написание эффективного кода с точки зрения перформанса сильно бьёт по скорости разработки, а пока нет что оптимизировать - не надо над этим и задумываться (естественно на отвались код тоже писать не надо)

Последний год я стараюсь подходить к написанию любого кода со следующей стратегией:
1. Написать абы-как, но быстро, чтобы оно работало
2. Отрефакторить - разбить на маленькие части если надо, поправить названия функций и всякие другие мелочи и не только

Самое главное пункт №2 не пропускать 👀

- Learn how to structure scenes! || Composition Demo - Снова обманули, тут чел не композицию делает, а наследование, еще и стиль кода у него скажем так странненький.. не рекомендую, лучше бы эти 30 минут поиграл в весёлую ферму
- How To Create A Health Controller In Godot (Tutorial) - И тут я понял, что не надо заглядывать в своё "Посмотреть позже", а лучше продолжать читать документацию Godot до потери пульса, а то с такими гайдами пульс можно потерять раньше времени. Контроллер из видео (по факту компонент) был сделан чтобы его использовать и переиспользовать в виде композиции, он прям создан для этого, но автор видео не развил полностью идею композиции и сделал гайд на "отвались", по крайней мере мне так показалось
- Let's Fix Your Sprite's Sorting Order... - А вот это видео рекомендую всем, тут за полторы минуты реально показывается как фиксить Y-Sort спрайтов, что особенно актуально для top-down игр. Только z-index не надо поднимать как он это делает, это лишнее

Также забыл написать про ответ на вопрос про звуки "Как правильно проигрывать звук до конца, если родительская нода очищена/удалена?". Я предложил своё сомнительное решение, но препод сказал что так как раз нормально делать, только надо следить чтобы слишком много звуков одновременно не было и все такое

Решение заключается в том, чтобы создать глобальный скрипт, у которого будет функции по типу "play_sound(stream)" и эти функции будут добавлять прям в корень сцены звуки, которые будут автоматически удаляться по проигрыванию. К слову для "летающих чисел" тоже прикручу такую же логику, а то сейчас там неюзабельный подход через "общий" компонент-спавнер и еще один спавнер, только он подключается к HealthComponent и переиспользует "общий" спавнер, в общем это неудобно и надо переделать

Ночь - идеальное время чтобы просмотреть часть про метапрогрессию (страшная механика), а сразу после можно и к доделкам игры приступить, всё по плану 😎

#godot #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🤔2🤝2🔥1
День 136

Наконец-то добрался к постам

Сначала про вторник

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

Страшное оно было почему - потому что я начитался в чатике по годоту 20тыщ вариантов реализации сохранений, 30тыщ вопросов про эти самые сохранения, и тут я сижу, смотрю курс - а сохранения.. реализуются в "пару строк", так еще и максимально удобно и там ну вообще никаких разногласий даже быть не может, м-да 🙂

Грубо говоря это просто три этапа:
1. Определить путь к сохранению. Используется папка с user data, на каждой ОС она своя и годот любезно делает всю работу по поискам за нас, нам же только надо дать название файлу с сохранением
2. Сохранять игру когда надо
3. Загружать данные когда надо

И все? Да, и всё.. а я то в чатиках столько ужасов и костылей насмотрелся, кто-то в .txt файл сохранял данные, потом их парсил чтобы в дикт собирать, кто-то тупо в res:// (корень проекта) сохранял данные через файлы ресурсов .tres и так далее

А сохранять-то игру просто и удобно - закинул словарь с данными в метод file.store_var(save_data) и готово, загрузить данные? Пожалуйста - file.get_var() и все данные уже "на столе"

Прикреплю скриншот с видео, где показана реализация сохранения мета-улучшений. Один "чистый", а второй с комментариями от меня лично 😎

Конечно же при сохранении текущего состояния игры, всех сцен и нод на экране это будет слегка сложнее, но костылями-то и не пахнет, всё по-человечески 🤷‍♂️

В документации есть даже пример сохранения текущего состояния игры

#godot #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👏3👍2
День 137

TL;DR Звуки это сложно.. снова

В среду я продолжил разрабатывать игру был проджект-менеджером

Нам нужны звуки. И музыка. 🏃‍♂️

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

Поэтому я доделал дебаг-сцену, на которую добавил и дальше буду добавлять разные кнопки по типу "Открыть это", "Открыть то", "Поднять уровень", "Заспавнить что-то" и т.п.

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

На данный момент мы работаем над следующими звуками:
- Экран поражения
- Экран победы
- Повышение уровня / экран выбора мутаций
- Улучшение оружия / экран выбора улучшения
- Выбор улучшения оружия
- Выбор мутации

Вроде еще несколько, но я как-то подзабыл (подзабил) и не вписал это в нашу борду в HacknPlan 🥴

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

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

Звукарь немного поигрался со звуками в движке и сказал, что "работа со звуком в годоте мягко говоря никакущая, так сказать ползунки громкости это максимум что работает стабильно и хорошо, фильтры грубые/не точные" и всё в таком духе

Но вот я наткнулся на интеграцию WWISE в виде плагина для годот (это официальный плагин от WWISE к слову). WWISE (Wave Works Interactive Sound Engine) - это профессиональная "программа-посредник", которая позволяет создавать, редактировать и делать практически что-угодно со звуком в игровых движках, конечно же включая тот же Unity и Unreal Engine. Осталось только обрадовать звукаря и сказать, что жизнь у него удалась 🤝🤝

Женя (звукарь) - реально талантливый и жесткий чел, так что мы будем уделять особое внимание звукам и, в особенности, музыке/композициям/саундтрекам в играх

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

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

Довольно много игр вывозят стилистикой ИЛИ музыкальным сопровождением ИЛИ геймплеем и т.д.. Чаще всего это из-за того, что главный разработчик это "человек-оркестр", который физически не может быть экспертом-экспертом в очень разных областях. Если же есть команда - можно стараться вывозить если не сразу всем, то как минимум несколькими, что более чем реально

Это правда тяжело - находить время на хобби, когда уже есть грубо говоря семья + две работы, но мне нравится и я разгружаюсь этим (как бы странно это не звучало). Через пару месяцев вероятно времени станет значительно больше (на 8 часов как минимум, если вы понимаете о чем я 👀) и я смогу уделять х2 времени разработке. Мечты мечты..

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

#godot #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
Media is too big
VIEW IN TELEGRAM
День 138-139

Вчера я наконец-то приступил к игровым доделкам, начал с первого пункта - "Добавить 6 оставшихся улучшений для пистолета"

Начал с Пронзающих Выстрелов, сделать их было очень просто, ведь я уже реализовал когда-то ранее систему прочности у пуль, переиспользовав компонент HealthComponent и создав ProjectileHurtboxComponent, ведь я знал что оно мне понадобится 🎩

Для пуль будет одна логика прочности, для стрел - другая

У пуль прочность/здоровье отвечает за кол-во максимально пораженных целей, после которых пуля исчезнет

У стрел же оно будет отвечать (в теории) одновременно и за наносимый урон и за кол-во прочности

Как будут работать стрелы:
1. У стрелы есть 6 прочности
2. Стрела летит в Кролика, который имеет 4хп
3. Стрела наносит Кролику 4хп, убивает его и летит дальше, НО у стрелы теперь урон = прочности = 2

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

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

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

На выходных планы наполеоновские:
1. Добавить все недостающие улучшения пистолету
2. Добавить лук (вряд-ли улучшения успею к нему запилить, так что главная цель - сделать второе играбельное оружие)

К слову в каждом оружии будут взаимоисключающие улучшения, для пистолета можно взять или Рикошет или Пронзающие Пули. Логику такого поведения уже продумал, если вкратце - то всё просто 👀

Всё просто - к каждому улучшению добавляется массив incompatible_uprades: Array[Id], который содержит улучшения, которые будут исключены из пула при подборе текущего

Также прикрепил микро-видео с наработками для пронзающих пуль

Всем хороших выходных, наконец-то отдых 🥲

#ritkarampage #разработка #godot
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥92🫡1
День 140-141

Снова двойной пост, но это последний (не обещаю)

Это будет небольшой пост, основная интересная визуальная часть связанная с улучшениями оружий будет сегодня/завтра

— Часть про график —

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

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

Пару скринов прикрепил с моего так называемого графика

Прокрастинация выходит на уровень "по графику" 🎩

— Разработка —

Сделать всё не успел за два дня, но вышло сделать самое главное - WeaponUpgradesPoolComponent, это компонент, который я подсоединяю к WeaponUpgradeManager и менеджер просто вызывает upgrades_pool.pick_upgrades() и всё, больше в менеджере нет логики по выбиранию нужного улучшения, удаления из пула улучшений, которых больше нельзя подобрать. Фильтрация всякая, дополнительная логика, например:
1. Эволюционные улучшения появляются только начиная с 3-й наковальни
2. Если игрок по любой причине не взял эволюционное улучшение для оружия, а уже поднято 5 или больше наковален, то при каждом подборе наковальни будет появляться как минимум одно эволюционное улучшение

В общем для баланса некоторые штуки накрутил, чтобы было всё честно

Компонент пула улучшений полностью самостоятельный - он подписывается на разные сигналы от GameEvents и реагирует на них, то ли обновить полностью пул улучшений то ли отфильтровать его, оставив только "доступные". Менеджер в эти дела не лезет

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

WeaponUpgradeManager почистил (коммит), а WeaponUpgradesPoolComponent создал (коммит) и перенёс туда всю логику пула улучшений

— Маркетинг на будущее —

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

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

На данном этапе я-то делаю игры просто для практики, но в планах спустя 3-6+ месяцев начать разрабатывать серьёзный коммерческий проект, но для этого нужна серьёзная подготовка

Я когда-то это писал и вот решил снова упомянуть - рекламы в канале никогда не будет, это вот моя отдушина, история, и если и рекомендовать что-то, то только по собственному желанию и что реально будет всем полезно (как тот курс на юдеми - он божественен). А деняк мне и так хватает, работы то две 🤝🤝

Пост вышел небольшой, ведь я хозяин своего слова, слово дал - слово забрал 😎

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍21
Media is too big
VIEW IN TELEGRAM
День 142

Сегодня финализировал улучшение PiercingShots и немного порефакторил логику пистолета и пули

— Апдейт по прогрессу —

Добавил уменьшение урона на 30% с каждым попаданием по врагу, уменьшение именно базового урона, а не текущего. Т.е. если урон был 10, то после 1-го врага будет 7, а после - 4. К слову на прикреплённом видео я еще это не пофиксил, и там урон отнимался от текущего, т.е. 10 => 7 => 4.9 (7 - 30% = 4.9)

Также добавил уменьшение скорости пули, единоразовое замедление пули на 20% при подборе PiercingShots

И перенёс ответственность за кол-во наносимого урона из сцены пистолета в сцену пули, а то раньше в скрипте пистолета было что-то такое:
var bullet = bullet_scene.instantiate()
...
bullet.hitbox_component.damage = 2.0


Теперь же пуля сама решает, сколько урона ей наносить, сильная и независимая 😎

Завтра в планах добавить рикошет и взрывопули

Да вот только я никак не могу придумать пятое улучшение для пистолета типа "Механика", которое добавляло бы еще какой-то эффект пистолету/пуле, может кто идею подкинет? 👀

— Технические детали —

Я познал небольшую боль типизации в GDScript - тут нет дженериков. И мне их уже начинает не хватать

У меня есть универсальный класс - WeightedTable, и в функции pick_random_items и pick_random_item я возвращаю заранее неизвестный тип данных, вот к примеру возьмём pick_random_items - он возвращает массив.. чего-то, чего-угодно. Во многих языках я могу ему сказать что: "Тут я ожидаю от тебя Array[WeaponUpgrade], а тут я ожидаю от тебя Array[int]", делается это примерно таким образом:
var picked_items = pick_random_items<Array[WeaponUpgrade]>()
# или так
var picked_items = pick_random_items<Array[int]>()


Но так нельзя, и приходится лопатить костыли (как мне кажется) для точной типизации. Я делаю это таким образом:
var random_picked_upgrades = upgrade_pool.pick_random_items(3)

var picked_upgrades: Array[WeaponUpgrade] = []

for upgrade in random_picked_upgrades:
if upgrade is WeaponUpgrade:
picked_upgrades.append(upgrade)
else:
push_error("Picked item is not WeaponUpgrade")


Еще мне ответил добрый человек в чатике насчет использования Array.assign, я еще не тестировал, но должно работать, в доке есть упоминание про типы "... Performs type conversions if the array is typed.". Если это будет работать корректно - то это просто спасение

Как обычно - прикрепляю видео с прогрессом и делаю акцент на багах с врагами, когда они краснеют (буквально). Об этом баге и еще нескольких мне очень помог еще один добрый человек, который написал большой фидбек про текущее состояние игры

Когда игра уже будет примерно законченной (через пару недель (верим)), то я добавлю возможность давать фидбек из самой игры (почти), может будет кнопка "Нашел баг / Есть идея?" и по нажатию скорее всего будет открываться форма гугловская, где можно будет и видосик с скриншотами прикрепить и может идеи расписать

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

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
День 143

Сделал улучшение "Рикошет"

— Улучшение "Рикошет" —

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

В общем угол я искал постоянно не тот, пробовал global_position.angle_to(enemy.global_position) и дебажил что тут не так, потом Vector2.RIGHT.angle_to(enemy.global_position) и снова дебаггинг, принты в консоль и всё такое

Почему-то пристал я к этому angle_to, хотя решение оказалось очень простым - global_position.direction_to(enemy.global_position).angle()

— Красные враги —

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

До этого я пару раз искал "А как же мне переиспользовать Tween?" - ответ почти всегда был однозначный: "Никак. Их не нужно переиспользовать". В общем-то так и есть, но все-таки надо будет найти способ переиспользовать анимации появления/затухания/и т.п., ведь AnimationPlayer нельзя нормально переиспользовать для разных нод (а часто вообще невозможно)

Пока что идеи как решить это две:
1. Создать функции-аниматоры в каком-то синглтоне под названием TweenEffector, где каждая функция будет принимать настройки для анимации (длительность, элемент), а первым аргументов будет tween, который создается перед вызовом этой функции, но самое главное создавать этот твин в той ноде, где будет происходить анимация, иначе не сработает (они привязаны к текущей ноде походу)
2. Похожий вариант на первый, но с одним отличием - это будет метод для анимации, а использовать его нужно будет как-то так:
var tween := create_tween()

tween.tween_method(TweenEffector.fade_in.bind(panel_element), 0, 1, 0.3)

...
#TweenEffector

func fade_in(value: float, item: CanvasItem):
item.modulate.a = 1 * value


Пока писал это всё то решил сделать вариант №2, потому что вариант №1 у меня уже реализован и он мне не нравится 👀

— Дебаг Сцена —

Потихоньку улучшаю дебаг сцену и очень активно ей пользуюсь, хотя изначально она делалась только для звукаря, но вот эти кнопочки и "защита" от обезяны (меня) мне очень сильно помогает и ускоряет разработку и тестирование игры

Прикрепил видео с процессом моих страданий с поиском угла для рикошета и сам результат

#godot #ritkarampage #разработка
👍2🔥21