Boogernator

Boogernator

Дилетант широкого профиля
Пикабушник
Дата рождения: 8 августа
derro2
derro2 оставил первый донат
20К рейтинг 92 подписчика 40 подписок 126 постов 31 в горячем
Награды:
5 лет на ПикабуС Днем рождения, Пикабу!
7

Неожиданный эффектик

Вообще конечно собирался доделать цепную молнию, но неожиданно получилась такая прелесть, короче надо подумать над классом чернокнижника.

Дорогие подписчики, есть вопрос, о чем лучше написать? Вариантов два или сделать боевку максимально похожую на Disciples, подробненько распишу все или дальше про эффектики продолжать?
Завтра целый день свободный, надо что-нибудь запилить. Вообще конечно посещает меня крамольная мысль, перебраться на UE4, ну тут надо подумать ещё) Носит с одного на другое вечно.

Показать полностью 1
19

Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3

Добрый вечер, мои дорогие подписчики. Это продолжение поста Godot путь новичка. Шейдер ч.2 Буду сейчас может понемножку, но чаще писать. Поймал себя на мысли, что у меня работа над своим проектом движется только тогда, когда пост дописываю. Сразу и у себя, написанное в посте, допиливаю до приемлимого уровня. А мне уже порядком поднадоело находиться в статусе вечного неудачника с бесконечным проектом. Ладно с лирикой потом.


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

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

Ладно приступим.

Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3 Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3 Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Да повторюсь ещё раз, условные операторы по идее нежелательно использовать, с другой стороны динамически однородные условия будут выполняться лишь с небольшими проблемами производительности, насколько мне удалось разобраться на текущий момент. Вобщем вспоминаем про принцип KISS и огромный ущерб от преждевременной оптимизации. Простенько? Да. Понятненький код? Тоже да. Так что все чудесненько.
Если прям вот надо надо, то могу переписать без использования if'ов, но мне без них кажется гораздо запутаннее и непонятнее.

Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3 Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3 Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Вот в принципе и всех делов пока.


Бонусом добавлю ещё такой простенький вариант.

Godot путь новичка. Добавим красок блеклой анимашке. Шейдеры ч3 Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

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

На видосике это не артефакт остался, это остановил запись раньше чем анимация доигралась)
С шейдерами пока ненадолго закончу, дальше будет либо про Tween, либо про всплывающие цифры урона или про простые анимашки с партиклами.


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

Всем спасибо за внимание, честно очень сильно подбадривает, что читаете. И вдвойне рад, если удается действительно полезной информацией делиться.

Показать полностью 5 1
21

Godot путь новичка. Шейдер ч.2

Добрый вечер, мои дорогие подписчики. Это будет продолжение поста Godot путь новичка. Первый Enemy и первый Шейдер


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

Ну во первых, что такое UV - это развертка, по сути просто преобразование координат с трехмерного объекта в соответствующие координаты на текстуре, поскольку спрайт это двумерный объект, то все ещё проще и развертка соответствует самому спрайту, разве что координаты в UV идут от 0.0 до 1.0.
Очень наглядно демонстрируется это в туториалах Godot.

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

Ну добавим в шейдере ранее написанном, одну строчечку для наглядности ещё разок.

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

Вот ну думаю из этого уже можно догадаться, что белый цвет это значения всех каналов равны 1, а черный это когда цветов нет и значения всех каналов равны 0. Серый это смешение всех каналов в равной пропорции, чем ближе к 1 тем ярче цвет серого. Что это дает и зачем нужно, а так же какое отношение имеет к тому, что пиксели начинали пропадать. Как говорил, в прошлом посте функция random, дает случайные значения от 0.0 до 1.0, то есть по сути разные значения серого. Применим этот шум, к текущему спрайту, чтобы было понятнее о чем говорю.

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

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

Но просто рандом это дискретный набор случайностей, потому и выглядит как не пойми чего итоговый результат. Шум Перлина же в свою очередь, имеет градиентную основу, что позволяет делать более плавные и крутые штуки. https://ru.wikipedia.org/wiki/Шум_Перлина
вот гуглите про шум Перлина на здоровье, в детали алгоритма у меня влезать большого желания нет пока, но попользоваться им очень даже можно и нужно.

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

Смело топаем на godotshaders и в снипетах копируем шум перлина
https://godotshaders.com/snippet/2d-noise/

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

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

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

на самом деле, шейдер полностью готов к использованию и даст результат такой же, как и в видяшке из начала поста. Но покажу, что именно рисует функция noise в зависимости от параметра density.

Godot путь новичка. Шейдер ч.2 Godot, Godot Engine, Шейдеры, Туториал, Видео, Длиннопост

В принципе готов даже к неконструктивной критике, ибо влезаю в вещи которые сам не до конца ещё понимаю. Но работает же, учел ошибки прошлого поста, немножко разъяснил. К следующему посту, постараюсь максимально разобрать непонимание в этом, а заодно погляжу, как сын будет делать, чтобы самое непонятное высмотреть так сказать.
В любом случае, визуально эффект очень приятный, в следующем посте сделаю цветную линию, которая будет появляться перед исчезновением пикселя ну и дающая тот самый чудесный эффект, типа спрайтик плавится перед исчезновением. В целом думаю можете и сами догадаться, что надо просто параметр прогресс сравнивать не только с альфой, а добавить ещё один, чтобы разброс значений был чуть больше. Условно, если прогресс, 0.3, то все что меньше 0.3 то исчезает, а все что между 0.3 и 0.5, меняет цвет. Это и даст тот самый эффект, а можно по краешку пустить черную каемку, линию сделать красненькую и запилить эффект сгорающей бумаги. Ну это унесло меня опять, ладно поглядим что дальше получится.
Спасибо за внимание, надеюсь это разъяснит ещё чуть больше и вы начнете пилить крутые шейдеры и делиться своим практическим опытом в постах, а те кто уже опытные, те не будут писать, что все гавно и ты все делаешь не так. А подробненько изложат, как делать правильно, но не взрывая при этом мозг сложными материями.

Показать полностью 10
32

Godot путь новичка. Первый Enemy и первый Шейдер

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


Создам новый проект, основную сцену неважно, как назвать. Создам ещё одну сцену, назову её Enemy, сцена наследуется от Node2d скриншоты каждого шага делать не буду, их уже показывал ранее. На сцену Enemy добавляем ноду Sprite.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

После того как спрайт выбрали, добавляем ноду TexturedButton, по размеру делаем её со спрайт, текстур к ней никаких не добавляем.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Для Enemy создаем новый скрипт, для кнопки соединяем сигнал pressed со скриптом Enemy.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Если на прошлом этапе никаких проблем не возникло, то значит все идет как надо, теперь немножко модифицируем скрипт Enemy.

Не буду выкладывать скрипт текстом, по сыну заметил, что если можно скопипастить, то обязательно скопипастит, а лучше 10 раз написать одно и тоже, пока не придет осознание, что надоело это уже писать, до чертиков. Вот как только появилась такая мысль, то все можно уже и копипастить.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

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


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

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

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Ну все монстры исчезают, перейдем к мудреному, забамбасим простенький шейдер.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

скину ссылки которые вам могут очень пригодится.
https://docs.godotengine.org/en/latest/tutorials/shaders/you...
https://docs.godotengine.org/en/latest/tutorials/shaders/sha...
https://godotshaders.com/
https://thebookofshaders.com/
Для понимания предыдущего, суперского туториала, нужно сказать пару слов, там используется GLSL, в godot свой язык шейдеров, но глобально это тот же самый GLSL. По следующей ссылке, детально расписано, как конвертить GLSL в godot'овский ну и так же обратно.
https://docs.godotengine.org/en/latest/tutorials/shaders/con...


функцию рандома взял отсюда https://godotshaders.com/snippet/random-value/
вообще черная магия какая-то и очень мне непонятная ещё местами, ну типа почему так сложно и где встроенная функция random(),
Генерит псевдослучайное значение между 0.0 и 1.0

Ладно погнали, назовем наш новый шейдер - desintegrate.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Тут не успеешь создать, уже сразу начинает ругаться, тут вобще на все подряд будет ругаться, можно забывать теперь про неявное указание типов данных и прочие радости, за каждую точку с запятой будет ругаться) Сучек, какой строгий) Ну сейчас он ругается, что не указали тип шейдера, использовать будем сейчас canvas_item, он для спрайтов.  spatial для 3d моделек, до particles ещё не добрался пока.

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

self_modulate.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

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

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост
Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

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

Теперь идем в скрипт Enemy.

Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

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

float random (vec2 uv) {

return fract(sin(dot(uv.xy,

vec2(12.9898,78.233))) * 43758.5453123);

}

берем эту функцию из сниппетов на https://godotshaders.com/snippet/random-value/
Godot путь новичка. Первый Enemy и первый Шейдер Godot Engine, Godot, Шейдеры, Туториал, Видео, Длиннопост

Ну и результат.

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

Показать полностью 14 2
18

Салют из монстров, в честь дня программиста

Добрый вечер мои дорогие подписчики. Каюсь, хотел вообще полностью забить на эту серию и сосредоточиться полностью на своей игрульке.
Но благодаря моему подписчику @xenofob, передумал. Во-первых, осознал свою ошибку, мне казалось, что проще предложенного в прошлом посте Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток толком и не придумать ничего. Я ошибался, вконтактике с ним заобщались, разбирали его проблему. Понимание сигналов и событий, быстро не приходит, есть гораздо проще способы, буду делать методы напрямую в синглтон, не самый лучший способ, но он очень понятный. Во-вторых, он хоть ещё и только начинает знакомство с движком, но тем не менее, сказал, что пиши лучше про то, как всякие красивости и приколюхи делать. Так что скорее всего так и буду поступать. Сегодня выложу просто видяшечку, а в следующем посте уже выложу сам шейдер, с пояснениями как его применять, детальный разбор шейдера с ним приторможу пожалуй, не могу объяснить ещё принцип работы ребенку, значит я точно не до конца разбираюсь в том что делаю) скорее по наитию, хотя вроде сам его и переписал из нескольких чужих под себя))

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

Ну и ещё из странного за сегодня, вселенная меня настигла, к нам на работу приходил программист, новую 1С ставить и попутно нас дебилов обучать, что-то разговорились с ним, о том, о сем. Ну и поступило мне предложение к ним пойти программистом 1С, обучать с нуля готовы всем премудростям, в торговле я уже года два, вообще нравится) Вообщем думаю пока, вот уж действительно - "Не надо ничего делать, не надо ни к чему стремится, вселенная сама тебе даст, все что нужно". Я потихоньку планировал b2b приложуху, конкретно под тематику где работаю, столкнулся с тем, что мне надо понять, как интегрироваться с 1С и тут бац предложение. Карма, не иначе. Так что все будет ещё, как дозрею так сразу выложу эффект, спасибо за внимание.

п.с. мы с @xenofob, договорились, что я попробую ему помочь, с его маленьким первым проектом, он платформер делает по урокам, забыл спросить по чьим. Возникла мысль, что может записать разбор по этому делу? Скорее всего это будут нудные 3-4 часа сопения и копания в коде без всякого редактирования, с другой стороны у него возникают с одной стороны, вроде и простые вопросы, а с другой довольно необходимые, так-то)

Показать полностью
5

Godot путь новичка. Купил анимаций. Unpacking

Добрый вечер мои дорогие подписчики. Это не продолжение серии Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток это просто вставочка, как есть.

Сегодня будет пост без всякого программирования и заморочек. Но куча рассуждений зато.

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

Да можно начать опять песню заводить, типа простой код, в котором каждый ненавистник разберется, написать не так и просто. Но это не совсем так, абсолютно точно так же писал и на ActionScript, когда на галерах был(спустя полгода Юниорства, ofc), и на Haxe на заказиках, и на Defold удаленно немножко работал, в сжатых сроках всегда всё приходит к подобной архитектуре -" давайте ебошить, потом разберемся" - это важнее, скорость важнее всего.

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


Фичекат(Feature Cut) тоже будет всегда, не надо бояться дедлайнов, не надо бояться выкинуть код, программисты вообще ничего не решают. Они решают свои 25% задач, а то и меньше, игра это не только код. Это не поисковый алгоритм, вокруг которого вырастает компания, это не фреймворк и не бизнес-процесс какой-то хитрожопый. Плывущее бревно по красивой воде с бликами, на UE4 с рейтрейсингом, лодами, реальной физикой и прочим, все одно остается просто бревном.

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

Сейчас  и во всех прошлых постах, я пишу гораздо более компактный и емкий код, да, потому что так позволяет писать Godot. Есть такая странная фразочка :"Программист должен понимать на уровень абстракции ниже, чем тот язык на котором он сейчас пишет". Но и это ничего не дает для понимания происходящего. Cейчас пишу по факту код, по сути так же как писал ТЗ для программистов, GDScript для меня сейчас идеальный псевдокод. Cам начал забывать, что я не программист, я программистом-то по случайности устроился, как геймдиз изначально устраивался. Я отличным был и тимлидом и проект-менеджером, но только для программистов, для ГД, художников и того странного тестерского отдела я был просто адом, по началу особенно.


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

Неделю я готовлюсь по факту к посту, но ничего из этого просто не выкладываю, у меня есть базовый сценарий, есть диздок даже для текущего проекта. В следующем посте собираюсь делать первую вражину, на работе целый день сегодня искал бесплатные ассеты, каких-то мобцов нашел для свободного использования, попутно попалась пара занятных паков с анимацией ударов. Обратите внимание, мог купить и оба, и ещё десяток сверху, бюджет имеется. Но купил один пока самый дешевый, за 2$ - 20 анимаций) очень бюджетненько, не хватит у того же чувака есть ещё 38 за 5$. Добавил в интересуемые, будут скидки куплю) Ассеты на itch.io искал, юнитисты сами знают где им все искать)

Собственно их анпакингом, а равно как и подготовкой к следующему посту, я сегодня и займусь, в целом я бы уже все сделал давно, но решил все поудалять и с нуля на картиночках показать. Это важная штука, как по мне. Ну типа нихера за 2$ такие эффекты, которые не каждый аниматор за 50к в месяц нарисует))

Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост

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

Создам новый проект, засуну туда все атласы.

Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост

Можно создать новую сцену, базовый класс AnimatedSprite.

Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост
Godot путь новичка. Купил анимаций. Unpacking Godot Engine, Gamedev, Godot, Распаковка, Видео, Мат, Длиннопост

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

Ну и все, добавляем экземпляры на сцену и радуемся происходящему

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

Перенесу в основной проект, добавится одна строчка у моба что-то типа
$HitAnimation.play(WeaponData.animation_get())
И усе, при ударе поверх него отрисуется эффектик выбранный. Разве плохо? Хорошо.

Кодил я сегодня? Нет? А упростил себе код на будущее? Безусловно.
Может сумбурный конечно получился пост, но мне так приходится жить. У меня биполярное расстройство, я считал это большим недостатком раньше, сейчас просто воспринимаю себя как конечный автомат с разными состояниями, когда у меня гипомания, то могу вот выпить, арт какой-то ищу, странные вещи всякие делаю(весь пиздец который творил в жизни, происходил именно когда на пике эйфории, с ощущением своей охуенности я так и под 112 попал). В депрессивной фазе, в основном пишу в стол, диздоки, сценарий, стихи, всякую херню, в редкие периоды интермиссии, стараюсь кодить и по возможности успеть законченный компонент сделать какой-нибудь, если не успел, ну пофиг, подожду недели две. Избегаю этого увлекательного состояния Flow, оно к слову легко достигается под амфетаминами, но даже без них в периоды гипомании легко в него войти, это деструктивное состояние, в нем нет вариантов ощущать возможность совершить ошибку, ты ебошишь много кода и кажешься сверхпродуктивным, но это приносит потом адовый спуск с небес на землю. Кодить надо очень спокойно и очень размеренно и желательно очень понемногу, я сейчас освоился по неделе-две размышляю над буквально десятком строчек и это очень позитивно сказывается на его качестве, да и на личном комфорте заодно.

Такой вот получился пост, может поможет кому, кто испытывает схожее, но ещё не нашел своих решений с этим справится, мне уже 38, молодой ещё, но с точки зрения текущего IT, я вроде как просрал свой шанс. А с другой стороны я и не хочу в текущее IT, я уже в нем был, хочу в другое)

Главное, не ровняйтесь на других, в геймдеве личностная деформация, очень даже может привнести новый взгляд на общепринятые вроде вещи. Будьте собой и верьте в себя, вас никто не поддержит и не будет ждать 3-5-18 лет когда вы разродитесь чем-нибудь, что запросто понравится десятку гиков и все) Я пережил свой экзистенциальный кризис, мне проще смотрится сейчас на многое, но не всегда так было. А о личностной деформации и как это помогло подняться в топгроссе фейсбука на 40+ позиций, я ещё расскажу как-нибудь, есть у меня реальный кейс лично мной проработанный)

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

Показать полностью 9 1
16

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток

Добрый вечер, мои дорогие подписчики. Это продолжение серии Godot путь новичка. Main Menu ч5. Рефакторинг(Практика)

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

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


Вот описание с вики https://ru.wikipedia.org/wiki/Канал_событий_(шаблон_проектирования)
не вижу смысла дублировать описание, все так и есть.

Преимуществ у этого подхода куча, самое главное легкость для понимания и простота реализации. Недостатки тоже имеются, главный это появляется некая асинхронность в проекте, со временем может возникнуть ситуация, что не очень понятно, что и когда, после чего произойдет. Тут уже не получится последовательно с контролом кликать по методам, чтобы понять суть происходящего, код станет читать сложнее. Зато интереснее, проект уже похож не на скучный структурированный учебник, а на увлекательный детективчик, с незабываемыми Шьямалановскими поворотами сюжета. С другой стороны, просто не стоит делать большие конструкции. Добавляя GlobalDispather(EventChannel) к проекту, уже не стоит смотреть на проект как на дерево, хотя формально структура древовидная сохранится отчасти. Теперь на него лучше смотреть уже как на поляну грибов. Есть грибница(EventChannel) на ней сверху растет куча грибов, которые сообщаются друг с другом посылая сигналы не напрямую друг другу, а посылая их в грибницу, а кому надо те их слушают. Красота тут в том что если половину грибов соберут, то пофигу, те что останутся так и продолжат работать.

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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

В Game оставим только кнопку назад.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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


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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост
Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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


Переходим в настройки проекта.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост
Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

Вот такая должна получится картинка.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

Что такое Singleton можете посмотреть на вики https://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)


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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост
Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

ну теперь осталось только научиться их добавлять.

в Dispather'е добавляем всего одну строчку. Офигенный класс, будьте уверены он вам придется по нраву, в нем меньше всего будет кода и больше всего пользы) Создатели godot, удивительным образом все сделали уже сами, при том сделали очень хорошо. Используя этот паттерн на флеше или на яве или на javascript, надо было очень внимательно следить за тем, чтобы своевременно отписываться от событий, в противном случае, останется ссылка на объект, он будет недоступен для сборщика мусора, а новые создаются, ссылки оставляют. Ну самый главный по большому счету MemoryLeak и бич всех невнимательных флешистов в свое время)) В godot вообще пох, можно лепить бездумно, ему по барабану, он удаляет объект из памяти даже если тот подписан на какие-то события и проблем никаких нет вообще. Очень трудно наломать дров. Нраица.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

Все с Dispather'ом закончили, он готов к использованию.

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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

Все это уже добавлялось ранее, подробно как добавить кнопочку расписывать не буду, в целом и так все понятно надеюсь. Да, для отдельных страдальцев базовой нодой для CheatPanel, сделана Control, на самом деле сейчас это не принципиально, можно и Node2d. Ну пусть будет, не заморачивайтесь если не понятно, помните про YAGNI.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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

Ещё один маленький нюансик, поскольку теперь не так просто отследить зависимости между разными объектами, имеет смысл добавить небольшой комментарий к сигналу.

Godot путь новичка.Singleton. Dispather(Event Channel). Сбор монеток Godot Engine, Godot, Gamedev, Туториал, Длиннопост

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


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

Чтобы менять кол-вол добавляемых монеток прямо из игры, надо в читпанели изменить тип Label, на TextEdit.


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

Dispather.emit_signal("CHANGE_MONEY",MonsterData.money_reward)
при открытие сундука, при выполнении квеста, да при покупке золотишка за реал, все так же будет добавляться всего одна строчка. Параметров разве что добавится ещё, тип источника, позиция откуда добавилось и тд. И механика будет всегда одинаковая, пофигу с читпанельки нажали или с сервера через сокет пришло сообщение. Это на самом деле плюс.


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

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


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


@xenofob, вдруг с монетками не разобрался ещё, то вот пожалуйста)

Показать полностью 15
36

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика)

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

И так самое главное в рефакторинге, это не сломать уже работающее, потому начнем потихонечку. Основная цель рефакторинга, это упростить читаемость кода. Читать проще маленькое, чем большое. Собственно и будем большие куски уменьшать, до приемлимых.

Опять же SRP принцип, единственной ответственности. Каждый кусок должен отвечать за что-то свое. MainMenu, только за главное меню. Game, только за всю игру. Так и поступим.

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост
Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост
Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

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

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

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

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

Собственно, а почему плохо может возникнуть вопрос? Работает же, так-то оно так, но будет ли это работать если убрать сцену Game из проекта? Очевидно что даже если убрать все упоминание $Game из скрипта в Main, то по нажатию на Start Game, игра упадет с ошибкой.

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

Это проблема которая возникает, если на проекте высокая связность. Что под этим подразумевается, один класс знает о существовании другого, либо предполагает его наличие. Как следствие будут появляться такие ошибки, даже если поначалу кажется, что все хорошо, структура у нас монолитна и надежна. При переделках, придется залезать снова в класс MainMenu, менять пути или ссылки на другие классы. А мы помним, единственное что неизменно при разработке игры, это то что переделки будут 100% всегда. Задача сцены MainMenu, это красиво показывать две кнопки и давать их нажимать, потому хочется сделать это именно так и больше не залезать сюда никогда, только если в целях улучшения самой этой сцены. Например добавить пару кнопок Save\Load, ResumeGame, BuyNewDLC, Buy Premium и тд.

Чтож попробуем спроектировать его, именно таким образом.

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост
Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

Делаем тоже самое со сценой Game.

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост
Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост
Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

Вот итоговый скрипт Main, разнесли частично по разным сценам. Сохранили полностью работоспособность. В Main еще конечно осталась логика, касающаяся сцены Game.
Тут можно спросить, и чего ради все это затевалось, кажись только больше кода стало ещё. В целом да, но сейчас появляется простор для модификации. Допустим я хочу, чтобы у меня из игры выходило теперь не только по нажатию мышкой на кнопочку, а ещё и по кнопке ESC. Сделаем это.

Godot путь новичка. Main Menu ч5. Рефакторинг(Практика) Godot, Godot Engine, Туториал, Рефакторинг, Gamedev, Видео, Длиннопост

Весьма наглядно получилось, мне для написания этого функционала не нужно знать, как устроен выход из игры или где он там находится. Я просто знаю что мне нужно дать нужный сигнал,  занимаюсь только этим. Это вдвойне удобно когда вы работаете над проектом не один, у вас есть 2-3-10 возможных реакций на пользовательский ввод, но логика обработчика для них одна. Её вполне может писать условный Мишаня, а вы занимаетесь своим компонентом MainMenu в данном случае. Ему не надо знать, как и что у вас устроено в меню, ему наплевать. Он знает что у вас есть открытый один сигнал в компоненте, он подписывается на него где ему нужно и работает с этим. Этот подход на самом деле хорош, в принципе это и есть инкапсуляция, закрытый компонент, со своей рабочей и независимой реализацией.
Ну и соответственно, если мне надо как-то обрабатывать выход, то мне тоже будет удобно, я могу поручить джуну разработку отдельного компонента, сказать ему делай там что хочешь, мне надо чтобы по нажатию на кнопку эмитился конкретный сигнал, все пускай он там городит свои огороды, если это никак не касается другого кода в проекте, меня это тоже устраивает. Так можно задешево нанять разработчика, который будет делать простые, но скучные и объемные вещи. В моем случае, я вообще могу использовать бесплатный детский труд(сына не бомби).


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

Это на самом деле не единственный конечно способ, но он довольно неплох. Несложно поддерживать и расширять проект впоследствии, по сути и есть MVC. В последующих постах, покажу ещё один вариант, на самом деле он мне импонирует даже больше. Он ещё проще, но там тоже есть нюансы.

@xenofob, пардон муа, большой пост получился и в этом не успел уложиться. Тяжечко с одним выходным жить, времени не хватает) В следующем посте будет уже про сцену Game, а там как раз и планировал начать с накоплением и отображением монеток за убийство монстра. Так что все будет, но попозже)

Если что-то упустил важное или написал запутано, то сорян. За три часа хорошо не сделаешь( А иначе ещё на неделю пришлось бы отложить написание поста. Спасибо за внимание всем кому интересно.

Показать полностью 12 1
Отличная работа, все прочитано!