Skip to content

Repository files navigation

TDC (top-down-craft)

Я очень люблю Valheim. То есть выживалки. С этого все и началось. Зачем вечно делать платформеры и учиться на них, когда...

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

Короче...

Изначальная задумка

Содержание

Что уже сделано

Разное

  • Уровень в 1920х1080, перезапускается на R и закрывается на Esc
  • На 4-ый день экспортировал проект в Web (GitHub -> Vercel) И ПОЧЕМУ-ТО НЕ РАБОТАЕТ ИНВЕНТАРЬ В ВЕБ БИЛДЕ (WTF)
  • Добавил прикольные шрифты

Игрок

  • Есть игрок (Player, CharacterBody2D)
  • Игрок нарисован
  • Игрок передвигается на WASD
  • Игрок смотрит на мышь (крутится его обьект)
  • При клике проигрывается анимация удара меча (крутится реальный обьект, анимация не фиктивная)
  • Меч это отдельная нода в дереве игрока
  • Направление удара меча всегда следует за мышкой (атакует туда, куда смотрит игрок)
  • Когда игрок поворачивается во время атаки, то меч перестает следовать его взгляду (иначе это выглядело очень странно)
  • Когда меч с чемто соприкасается, то вызывается сигнал атаки

Объекты

  • Есть кусты (ItemObject, StaticBody2D)
  • Куст нарисован
  • Куст имеет хп
  • Куст при попадании мечом получает урон и мигает (sprite.modulate)
  • На кусте в Loot Settings можно указать какой предмет будет выпадать (PackedScene), количество и шанс выпадения
  • С куста падает дерево в количестве 1-3 с 75% шансом

Предметы

  • Дерево нарисовано и создан ресурс (Resource, .tres)
  • Дерево (Item, Area2D) не имеет коллизии и может быть подобрано игроком (пока нет)
  • Когда дерево спавнится, то определяется случайная позиция в радиусе от куста, куда движется предмет дерева (tween анимация) - кучка нескольких дропов распределена в радиусе, а не лежит друг на друге
  • Есть ягода, семя, но они пока ниоткуда не выпадают и не отображаются в игре (Item, Area2D)
  • Ягода нарисована и создан ресурс
  • Семя нарисовано и создан ресурс
  • Камень, блюдо из ягод, топор, ой короче кучу всего добавил, даже стены (без логики, просто предметы)
  • Подробное описание и доп характеристики в зависимости от кагории, типа у Tool/Weapon будет damage и durability

Система лута

  • Таблица лута (LootTable) с конфигом предметов для дропа (ItemRes)
  • Кусту присваивается таблица, в которой настроено сразу какие вещи будут падать
  • Теперь не нужно делать отдельные сцены для каждого нового предмета, тк они автоматически генерируются на базе конфига предмета лута (ItemRes) и сцены (Item)
  • У игрока есть радиус сбора предметов
  • Когда предмет находится в этом радиусе, то пульсирует (hightlight), иначе лежит неподвижно (изменено)
  • При нажатии кнопки E, все предметы в радиусе сбора подбираются (анимация притягивания к игроку, добавление в инвентарь)
  • Можно включить автолут на Q и тогда предметы будут собираться автотически, когда в радиусе сбора
  • Когда предмет в радиусе сбора, то обводится белым контуром с плавной анимацией (первый раз писал шейдер, вухуу)

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

Короче это сложнее, чем казалось

НО! Будь я опытным разработчиком, то 100% сделал бы все за 2 дня.

Инвентарь

  • На Tab можно открыть инвентарь
  • Когда предметы подбираются, то сразу отображаются в инвентаре
  • Каждый предмет находится в слоте, а в углу отображается количество
  • (на самом деле это было пиздец как сложно сделать, я столько раз путался, ПОЧЕМУ В GODOT ТАКАЯ ПЛОХАЯ СИСТЕМА ТИПОВ? Я только изза этого ошибки допускал, когда нет проверки, что я передал Dictionary, а не ItemRes)
  • Нарисовал текстуры для инвентаря (слоты, панель, углы, обводка)
  • Анимация, когда добавляется предмет в инвентарь
  • Тултипы при наведении на предмет
  • Белая обводка и увеличение при наведении на предмет

Крафт

  • Еще одно окно интерфейса
  • Рецепты создаются отдельно конфигами (RecipeRes), как было с лутом
  • Все рецепты хранятся в услоной бд (RecipeDB), куда все складывается при запуске игры из файлов в папочке (код скана файлов)
  • В этот раз узнавал че такое ScrollContainer, V- и H- BoxContainer (как же игровым движкам не хватает флекса)
  • В первом рецепте, чтобы сделать каменную стену, нужно 3 дерева и 2 ягоды (так и задумано, все правильно)
  • В зависимости от доступности ингредиентов, кнопочка крафта может быть недоступна
  • При крафте, искомые предметы удаляются, а новый добавляется (вдруг неочевидно)
  • короче вот такой вот бутерброд бля жрать хочу ух ебать 6 утра сколько я сидел
  • Добавил еще кучу рецептов (6-ой день)

Бляя, львиную доли времени занимает понять, как что либо вообще сделать. Порйо я вообще логику и алгоритм не понимаю и долго долго гуглю примеры. А бывает я начинаю чтото писать и потом через пару часов это улетает в stage, потому что хуйня вышла. 8-ой или 9-ый день, забыл. Ебаный Drag & Drop - но мне нужно разобраться как это работает.


Вопросы

Releases

Packages

Contributors

Languages