sundwell.dev | Хроники инди-разработки – Telegram
sundwell.dev | Хроники инди-разработки
694 subscribers
224 photos
105 videos
136 links
Всё про инди от реального человека - девлоги, процесс маркетинга, геймдизайн, разработка и пиксель-арт
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
День 88

Летающие числа - это классно 1️⃣

Вчера занимался настройкой темы для проекта и летающими числами (урона и не только)

Пока что в моей мега уникальной теме только шрифт 👀

А насчет чисел поинтереснее, препод напрямую создавал числа в компоненте HurtboxComponent, но мне показалось, что это не совсем корректно, ведь Hurtbox отвечает за получение урона, а не за отображение чисел 🤔

Создал два компонента - первый с коротким названием FloatingTextSpawnerComponent и второй с еще более коротким названием HealthChangedTextSpawnerComponent

FloatingTextSpawnerComponent отвечает за спавн чисел, в него передаю сам текст и тип текста - "урон | лечение | поднятие апельсина". Этот компонент я напрямую добавил к сцене апельсина и вызываю spawn_text("+1", FloatingText.Type.ORANGE_PICK_UP) при поднятии последнего

А вот чтобы показывать изменение жизней (урон или лечение) - мне надо было персонажу и всем врагам добавлять этот компонент и прописывать так же само вручную в каждом скрипте спавн текста, вместо этого я сделал еще один компонент - HealthChangedTextSpawnerComponent, к нему я просто подключаю HealthComponent и этот новый спавнер слушает сигнал "damaged" или "healed" (еще нет такого, но будет) и спавнит текст с подходящим типом, обожаю компоненты и композицию - проект превращается в супер-гибкий конструктор 💃

Еще вот по мере роста этого огрызка недоигры у меня появился вопрос: "А как дебажить игры побольше? Мне уже неприятно"

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

Но мне уже это как бы не очень приятно делать - я часто забываю что-то вернуть на место. Например при тестировании системы опыта и уровней я захардкодил значение "experience_to_next_level = 1", то есть мне надо только один апельсин поднять для нового уровня (для легкости дебага), но там должна быть цифра "5", а я забываю о таких вещах бывает (да-да, надо смотреть ченжи перед пушем в репозиторий, но епт) и это уже причиняет некоторую попаболь, поэтому мне прям интересно - как же тестируют/добавляют что-то в огромные игры?

#godot #ritkarampage #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1🔥1
Хороший вопрос - это хорошо, а полезный ответ - еще лучше

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

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

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

Я уже говорил что за курс я прохожу, но вот еще разочек линка на курс по Godot 4, оно на английском, но даже если вы слабенько понимаете на слух, то там есть субтитры, оно того стоит
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
День 89

Спустя три месяца я считаю уже пора начать.. читать документацию по Godot и GDScript 😎

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

Когда-то там пару месяцев назад я говорил: "С понедельника я начну читать документацию по самому Godot...", ну да, у меня своё время, слегка иначе идёт, затянулось начало

Вчера просто сидел и читал доку годота, поузнавал некоторые полезные вещи (еще бы я не узнал) и заодно наткнулся на демо-игры от комьюнити, которые сделаны на годоте и их даже можно поклацать в браузере - https://godotengine.github.io/godot-demo-projects/

А вот сама ссылка на репозиторий с демками - https://github.com/godotengine/godot-demo-projects, некоторые вещи в теории можно оттуда подсмотреть, так что как-то выделю время на просмотр кода демок

P.S. Демку с названием "Saving and Loading (Serialization)" не открывайте.. у меня браузер и комп умер, я даже словил не синий экран смерти, а красный (чет новое), видосик записал с телефона, потому что.. комп же умер 👀

#godot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
День 9️⃣0️⃣

Числовой пост и юбилей

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

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

Даже мурашки по коже пошли пока пост писал и думал о прошедших 3х месяцах (мб просто холодно, ну не важно)

Нас уже ❗️96 ❗️, а это практически в два раза больше чем 30 дней назад, сообщество стало больше на 43 человека.. я в приятном шоке, ведь несколько лет назад вся моя писанина ограничивалась всеми известными карикатурами на стенах в заброшках

Ну ладно, не будем о буквах, будем о числах:

В этом месяце почти все время я уделял разработке, в основном прохождению курса на юдеми и разработку мини-игры R.I.T.K.A. Rampage

Временные циферки:

Программирование - 26 часов 58 минут
Пиксель арт - 4 часа 37 минут
Брейншторминг - 3 часа 7 минут
...и новый пунктик
Менеджмент - 22 часа 26 минут...+, даже сейчас время тикает

Менеджмент это время, которое я уделял монтажу видео и написанию постов

Каждый день, за исключением 31 августа, а также 3, 10 и 22 сентября я так или иначе уделял время разработке игр (кстати могут быть погрешности, т.к. частенько я ночью работаю, так что сужу только по графику)

Минимально уделённое время за день - 6 минут 55 секунд 15 сентября, которое я уделил на разработку, абсолютный рекорд в тяжелом весе по разработке 😎

Максимальное - 3 часа 15 минут 8 сентября, тоже разработка

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

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

Т.к. раньше не было постов с видосиками с результатом за долгий период - в этот раз я соберу всю фигню в одно видео все 90 дней прогресса, думаю выйдет четко вообще
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
Media is too big
VIEW IN TELEGRAM
Как и обещал - пост с видосом за результат 3х месяцев геймдева (и на ютуб тоже залил)

Ну и текстом немножко

Моей целью все еще является ARPG игра с прокачкой, навыками и лутом - как в Diablo 2 / Path of Exile / Titan Quest

Сейчас заканчиваю разработку игры R.I.T.K.A. Rampage в жанре игр Vampire Survivors + 20 Minutes Till Dawn

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

За 90 дней я успел:
1. Порадоваться, что начал заниматься любимым делом
2. Захотеть дропнуть это дело (сложности возникли, ну да)
3. Наговнокодить по-дикому в первом проекте и стать счастливым
4. Снова порадоваться, что не дропнул геймдев и щас уже идёт все как по маслу
5. Попробовать себя в пиксель арте и даже сделать что-то сносное (не член)
6. Написать 20 тыщ самых свежих вчерашних постов
🔥20👍1
This media is not supported in your browser
VIEW IN TELEGRAM
День 91

Наконец-то добрался до написания поста, хоть и не очень информативного 🦤

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

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

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

Да только есть проблемка - в годот в вебе шейдеры нагружают страничку сильно, если верить ребятам из чата, условно какая-то игра на 9мб грузится 10+ секунд, хотя могла бы почти моментально*

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

#godot #разработка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🫡1
День 92

Спавн мобов пофикшен

Как у меня спавн мобов вообще работает:
1. Выбирается точка за пределом зрения игрока (точки на краю круга с радиусом около 355px)
2. Если точка находится за ареной - перемещаем эту точку на 90°, если снова за ареной - еще раз, и так 4 раза максимум, какая-то точка 100% должна быть на арене (ага, расскажите это кроликам за ареной)

Определение "находится ли точка спавна за ареной" делается следующим образом - я провожу невидимый физический луч, который идёт от игрока до потенциальной точки спавна моба, если этот луч соприкасается с границами арены (спрайты воды) - то перемещаем точку на 90°

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

Когда Ритка стояла посередине арены и по бокам было видно воду - это значило что точка спавна может быть прям на воде, что является нормальным, но если арена небольшая и "круг спавна" больше самой арены, то все 4 точки потенциальные были на позициях 0, 90, 180 и 270 градусов и все они были на воде и враг спавнился на последней

Решение простое (easy yet powerful) - увеличить арену

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

Забыл в одном из прошлых постов показать неплохой и бесплатный набор пиксельных шрифтов, я использую "KarenFat", препод использует "Rockboxcond12", но мне он не очень зашел - слишком высокие/длинные символы

Прикрепил пару видео - короткое с результатом пофикшенного спавна и минутку ускоренного "брейншторминга" где я выяснял что не так со спавном (на 33 секунде до меня дошло где была собака зарыта, я там четыре точки нарисовал еще 🥳)

И наконец-то залил обновлённую версию на itch.io и вы можете потыкать игру прямо в браузере - https://sundwell.itch.io/ritka-rampage

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

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

Вчера был день рефакторинга
⌨️

Во первых - меня мучали два вопроса:
1. Как дебажить игру, когда она станет побольше? (детали на скриншотах с вопросами и ответами)
2. Как бороться с "магическими строками"

Насчет дебага вкратце - можно и нужно делать отдельные инструменты для дебага. Например сделать сцену, где будет несколько кнопок на экране, например "Заспавнить случайного моба" или "+100" опыта и так далее, звучит как план и мне он нравится. Конечно же сейчас прям мне это не надо, но на скриншоте я описал пару проблем, с которыми уже сталкиваюсь (например оставил "опыт до след. уровня = 1" и забыл вернуть в исходное состояние)

Насчет магических строк - сделать константы. Вариант бомбезный, препод подсказал как это правильно сделать - создать скрипт с константами, загрузить его как синглтон (иначе не сработает) и использовать глобально - уже всё переписал на константы, теперь доволен как слон 💃

Переписал логику выбора случайного врага, а точнее сделал "таблицу весов" универсальной, а не прям хардкодно привязанную к EnemyManager, прикреплю скриншот с ДО и ПОСЛЕ и сам скрипт WeightedTable тоже. Сделал я это из-за того, что скоро буду добавлять новый тип улучшений - апгрейды для оружия (пока что оно одно, но будет еще как минимум два) и для них я сделаю "редкость", впрочем как и для "мутаций"

Еще я очень часто ищу ноду игрока с помощью get_tree().get_first_node_in_group("player") и я решил упростить себе жизнь - сделал хелпер-функции глобальным объектом "Utils", теперь вместо var player = get_tree().get_first_node_in_group("player") as Node2D я пишу var player = Utils.get_player(). Аннотацию типа тут опустил, чтобы показать насколько класснючий подход 😎, а вообще - функции get_player() я добавил аннотацию возвращаемого типа как func get_player() -> Node2D так что автокомплит работает и жизнь налажена, но аннотация не помешает - так легче читать код

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

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

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

Столько думать - но мне реально в кайф

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

Переработка оружия и другие мелочи 🔫

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

Сделал WeaponController, которому даётся сцена оружия (в нашем случае пистолет), контроллер создаёт оружие и работает как прослойка между фактически оружием и персонажем. Т.е. в скрипте персонажа что-то такое:
# player.gd
@onready var weapon_controller = $WeaponController
...
if Input.is_action_pressed('fire'):
weapon_controller.shoot()


Также прикреплю скриншоты с деталями реализации

Забыл в прошлом посте написать что не все так гладко, баги тоже присутствуют и я случайно наткнулся на еще один - в EnemyManager изначально стоит 1 секунда на спавн врага и скорость спавна менялась только когда менялся уровень сложности (в смысле новая волна), это значит, что даже если бы я установил в настройках волны time_to_spawn = 0.1 то оно не применилось бы, если волна была бы первой. Сложно объяснить человеческим языком, надеюсь вы поняли 🫡

Добавил микроулучшение для оружия "Damage Up" просто чтобы протестировать, что всё работает как и надо (всё работает как и надо - подтверждаю)

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

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

К слову, репозиторий тут - https://github.com/Sundwell/ritka-rampage, может кому полезно будет всё это глянуть целой картиной

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

Вчера обдумывал в общем и целом механику улучшения для оружий, сидел, думал, рисовал

Пока что суть будет такова:
1. Наковальня не будет выпадать с врагов, а будет появляться в случайном месте на арене и к ней будет указывать стрелка от игрока (такой мини-гайд)
2. При подборе наковальни будет выбор из трёх улучшений для оружия
3. Улучшений для каждого оружия будет около 7-10 с разными уровнями редкости
4. Каждое улучшение будет иметь редкость - Common, Rare, Epic
4.1 Common - обычное улучшение, что-то на уровне "+10% к скорости атаки" или "+2 к урону". Вес - 5 единиц (для случайной выборки с помощью WeightedTable
4.2 Rare - редкое улучшение, уже не просто банальное добавление урона или скорости, а небольшое изменение оружия, например "+1 пуля, но стрельба теперь диагональная, а не по прямой"
4.3 Epic - самое мощное улучшение, которое должно по идее немного менять геймплей. Я еще не придумал какие тут могут быть улучшения, но, вероятно, это будет какой-то навык для оружия, который будет активироваться вручную или же автоматически
5. Первая наковальня появляется на 1 минуте, все остальные - каждые 2 минуты

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

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

Кстати.. надо бы где-то список мутаций и улучшений показывать, как в Hades, запишу себе эту идею 😎

То что я рисую-визуализирую можете смотреть вот тут - https://app.excalidraw.com/s/9y27NZhzu83/3X9j11vuHVJ, регаться не надо, все супер удобно

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

Вернемся немного на 2й день разработки, где я говорил, что всё хочу делать сам 😱

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

Так вот - я потихоньку начал искать себе по разным чатикам/каналам и просто по поиску в телеге пиксель арт художника и саунд-дизайнера + композитора

Очень хотелось бы все это дело делать с знакомыми или друзьями, но не все так просто

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

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

Так к чему это я - хотеть это всегда хорошо, но надо быть реалистом, все-таки делать игры вместе будет очень классно и, что самое главное, намного, намного быстрее и качественнее, чем быть человеком-оркестром. Конечно хочется чтобы было всё "свое", но таким образом можно стать разработчиком Kenshi (18 лет разработки, из них 6 лет в одиночку) или 7 Days To Die (вечная альфа/бета, недавно релизнулись спустя 20 тыщ лет.. а её разрабатывает команда, хотя сначала было только 2 человека)

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

Но ведь эти игры популярны и реально успешны и.. да, все так, но просто прикинуть сколько десятков тысяч людей делают уникальные игры в одиночку годами и о них никто не знает и они ничего не добиваются в итоге и забрасывают игры - это просто не счесть. Kenshi и 7 Days To Die по моему мнению это игры "1 на миллион" и что-то типа "ошибки выжившего"

Ошибка выжившего — это логическая ошибка, когда люди делают выводы только на основе тех, кто "выжил" или успешно прошёл отбор, игнорируя тех, кто не дошёл до цели. Это приводит к искажённой оценке ситуации, так как не учитываются неудачи или провалы.


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

В идеале на данный момент хочу следующую команду:
- Разработчик
- Геймдизайнер
- Художник
- Звукарь

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

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

P.S. ох и долго же я делаю эту мини игру R.I.T.K.A. Rampage, но я никуда не спешу, главное успевать прокрастинировать несколько часов в день - это самое главное 😬
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥1