Жанр: 2D ферма для аутистоов
Движок: Godot csharp mono
Описание: можно будет выращивать помидорки, огурчики, делать закрутки и все такое. А сейчас нет нихуя, поэтому, пока что беру прицел на уровень "стардьюваля на минималках".
- Сетка игровых объектов поверх тайлмапы
- Инвентарь персонажа + инвентарь контейнера, можно теребить предметы туда-сюда
- Подбор/дроп предметов
- UI инвентаря, UI контейнера, хотбар
- Использование предметов в инвентаре по райткликту
- Использование райткликом активного предмета в хотбаре
Сегодня вот сделал первый предмет, Use которого ставит под курсор блок забора.
>>33330
Не плохо, выглядит приятно. Если не забросишь в течение недели то красавчик.
Этого >>33335 серуна не слушай, он порватка.
>>33343
Благодарю
Пока говно, но желаю удачи!
Поздравляю, ты уже сделал больше чем 50% постеров на этой доске, продолжай в том же духе.
- Добавить логику роста растений от времени или другого фактора
- Реакция растений на касание коллизии игрока
- добавить музыку из лесного эмбиэнта или чего-то такого, чтобы не так гумозно было тестить
- сделать губами "чпок" в микрофон и поставить это на звук подбора предметов, по-моему, это забавно
- описать класс размещаемого объекта - ресурса на карте, например, дерево или валун
- сделать инструмент с типом добывающего инструмента, типа топора или кирки
- реализовать возможность добычи ресурса инструментом
- какой-нибудь базовый крафт, крафт станция и все такое
Сейвы сделай, анонче.
>кошкодевочек можно завезти
Это 99% успеха, делай ГГ милой кошкодевочкой и в принципе тебе простят многие огрехи.
Да не, если поймешь суть. Главное не делай хуйню на ресурсах, используй обычные текстовые файлы
Покожу вам базовые классы для предмета и объекта на карте, все максимально просто
Сразу скажу, на пиках кое где я ещё не размазал ответственность по классам. Так что там и try-out, проброс или отсутствие проброса параметров методов.
Сначала про предметы. Пик 1
Есть у нас базовый предмет, от него появляется разновидность предметов "юзабельных", неважно каким способом, из инвентаря или хотбара, главное что их можно юзать.
Закинул сюда свойство "Является инструментом" и реализую все инструменты типа мотыг, топоров, лопат и всего наследуясь именно от этого класса.
Пик 2. И самое вкусное в предметах - их реализация в готовом виде.
На скриншоте - класс предмета мотыга, которую я использую из панели быстрого доступа персонажа, для вскапывания грядок.
Имея ссылку на объект игрока, получаю окружение уровня, подготавливаю объект грядки и через менеджер уровня спавню его, возвращая true если все ок и предмет использован удачно, или же в случае неудачи false
Пик 3. От ItemUsable наследуется тип ItemConsumable, который потребляется при использовании.
Это всякие банки-склянки, еда, семена и все такое.
На скриншоте предмет "абстрактных семян", т.к. я не сделал ничего конкретного.
И вся прелесть наследования в том - что достаточно переопределить метод использования предмета для изменения поведения.
Подготавливаем объект семян, получаем окружение уровня и в отличие от копания грядок, здесь уже проверяем есть ли под курсором любой объект типа "размещаемый" и нет ли другого объекта типа "семян" и всего такого под курсором. Если снизу грядка и на ней пусто - сажаем семена
И вот из всего этого получается такое колдунство, что для создания нового предмета - достаточно натянуть новый спрайт и переопределить поведение при клике, без лишнего геморроя, что важно для программирования, и прочих запар
Наброски класса растущего растения - пик 1.
Принцип работы - когда объект готов, у него появляется система роста, куда помещается перечень стадий роста, у каждой стадии может быть своё условие и спрайт(пик2, пока так).
Сама система - пик 3
Растение в каждом кадре дёргает свой метод Process, где происходит вызов попытки системы перевести своё состояние на следующий этап и выбросить оповещение, что стадия изменилась, в свою очередь класс растения поймает этот ивент и сменит спрайт.
1152x648, 0:13
Собственно, работает так.
Ну и да, я понимаю что можно взять какой-нибудь готовый нюгет пакет стейт-машину, но хочется самому наговнокодить
1232x704, 0:13
база
Не знаю, правда, как лучше сделать: Все в инвентаре крафтить, крафт станции или комбинированный вариант.
>Эх, как же хочется 2D художника
Они всем нужны, но их нету.
Пока что буду использовать как меню для быстрого получения вещей
1152x648, 0:25
У рецепта есть поля:
Результат
Количество
Массив требуемых предметов и их кол-во
При крафте валидируется наличие предметов в инвентаре и их количества, затем все считается магическим образом
Если все ок - забираем материалы и выдаем результат.
Благодарю
На использовании предметов жидко дристанул, потому что эффект должен наступать либо в середине, либо в конце проигрывания.
Пока ухватился за AnimationTree и его AnimationStarted/Finished + длину анимации в ms.
Думаю завозить какую-то абстрактную работу с таймером или чисто на ивентах колдовать.
Энивей надо где-то закидывать референс на дерево в котором дерево анимаций и к тому же запускать саму анимацию.
Вот думаю как это сделать расширяемо и красиво без бойлерплейта
Худшие две вещи лично для меня это рисование пиксельных спрайтов и ебучая работа с анимациями.
Там делать ссылку на собственное дерево анимаций и сделать ивент что анимация завершена
В Use методе предмета подвязывать к этому ивенту реализацию использования предмета и файрить нужную анимацию в базовом классе, вынесу реализацию действия в OnUse и дергать его на все тот же ивент AnimationFinished из Creature, после чего отписываться от события
Посмотрим короче
Насмешил, всего-то на 4 кадра меньше типичного плейстейшн экспириенса
Говорю "хоть сегодня в игре будет луковый луп, все готово, ток нарисуй"
Ржёт надо мной из-за лукового лупа, а я выгоняю ее из ресторана
Да он пошутил же, по последней строчке понятно. Ну или это какой то юмор про тульп из геншина, не шарю
Дальше будут луковые оладья, луковый суп, новые грядки(наконец-то), и попытки в новых персонажей и их анимацию
да вот, делой больше энписей
Запрещаю дрочить в этом треде до готовности спрайтов, потом можно.
Вполне
Ещё требуется сделать 4 по 4 применения инструмента в руках
В ТГ поболтать можно здесь, либо в чатике, либо в профиль написать напрямую
https://t.me/+DU4kgH3gvT5jMTVi
>>37898
Прошу прощения, коту фотосессию устраивал, забыл вернуть разрешение
>Завафлил немного с разработкой
Это первые звоночки анончик. Все через это проходили.
В начале чутка проебешься, потом всё больше и больше. Не бывает такого что наоборот темп наращиваешь.
Походу R.I.P игре будет, а такие надежды были :(
Пока я не пишу код за компуткером делаются спрайты, все под контролем
Пока живём, физической работы много, к сожалению
Короче, шоб заборы соединялись адекватно. Штатный тайлмап рот-жопа ебал, сувать все в слои и пропертя с динамическими объектами тот ещё пердолинг
Но чутка докинул всяких штук
В том, что у меня не сетка тайлов, а сетка полноценных нод, с коллайдерами, спрайтами и прочими свистоперделками.
Я знаю что можно какие-то проперти засунуть в тайл у штатной тайлмапы, но там такие пляски с типизацией начинаются.
>сетка полноценных нод
Лол, серьёзно? 100% проблемы будут, если захочешь увеличить площадь своей фермы.
>какие-то проперти засунуть в тайл
У тебя всё наоборот должно быть.
https://ru.wikipedia.org/wiki/Model-View-Controller
1. Модель: хранит и управляет данными игры, например, территория фермы - это Array, в котором хранится информация о посаженных растениях.
2. Представление: отображает актуальное состояние модели с помощью графики и звука, например, через встроенный тайлмап (т.к. он удобнее велосипедов).
3. Контроллер: передаёт модели текущее желание пользователя, например, пользователь кликнул на клеточку - он хочет посадить там новое растение.
Движок упрощает представление и контроллер, а разработка должна фокусироваться на модели. К сожалению, дерево сцены этого не подсказывает.
Примеры для симулятора фермы:
1. Пользователь подходит к незанятой "дикой" клетке и нажимает "вскопать землю".
2. Модель проверяет, можно ли здесь вскопать участок земли, вскапывает, сигналит об этом:
>signal tile_updated(x, y)
3. Представление изменяет спрайт клетки с "ровная земля" на "взрыхлённая земля".
1. Пользователь ложит персонажа спать.
2. Модель обновляет этап роста растений.
3. Представление меняет спрайты, если надо.
1. Пользователь заходит в данж.
2. Модель спавнит мобов возле игрока.
3. Представление отображает мобов.
Собственно ноды - это начальный уровень, на Godot возможно сделать игру совсем без нод, чисто на обращениях к разным "серверам", и это, в теории, значительно эффективнее использования нод.
>>34530
>Растение в каждом кадре дёргает свой метод Process, где происходит вызов попытки системы перевести своё состояние на следующий этап и выбросить оповещение
Во-первых, это крайне неэффективно: 60 раз в секунду дёргать кучу методов для каждого растения, которых могут быть сотни и тысячи. В играх такое решается обратным подходом: берётся случайная клеточка, и если в ней есть какое-то растение, ему увеличивается стадия роста. Это позволяет размазать нагрузку по времени, снизив число обновлений до 1 за тик мира.
Во-вторых, в симуляторах фермы растения обычно растут только "ночью": рост растений завязан не на реальное время, а на число дней в игре, которые игрок может пропускать по желанию. Причина не только в оптимизации, но и в гибком геймплее, подходящим для более широкой аудитории.
Тред читал мельком, если что.
>сетка полноценных нод
Лол, серьёзно? 100% проблемы будут, если захочешь увеличить площадь своей фермы.
>какие-то проперти засунуть в тайл
У тебя всё наоборот должно быть.
https://ru.wikipedia.org/wiki/Model-View-Controller
1. Модель: хранит и управляет данными игры, например, территория фермы - это Array, в котором хранится информация о посаженных растениях.
2. Представление: отображает актуальное состояние модели с помощью графики и звука, например, через встроенный тайлмап (т.к. он удобнее велосипедов).
3. Контроллер: передаёт модели текущее желание пользователя, например, пользователь кликнул на клеточку - он хочет посадить там новое растение.
Движок упрощает представление и контроллер, а разработка должна фокусироваться на модели. К сожалению, дерево сцены этого не подсказывает.
Примеры для симулятора фермы:
1. Пользователь подходит к незанятой "дикой" клетке и нажимает "вскопать землю".
2. Модель проверяет, можно ли здесь вскопать участок земли, вскапывает, сигналит об этом:
>signal tile_updated(x, y)
3. Представление изменяет спрайт клетки с "ровная земля" на "взрыхлённая земля".
1. Пользователь ложит персонажа спать.
2. Модель обновляет этап роста растений.
3. Представление меняет спрайты, если надо.
1. Пользователь заходит в данж.
2. Модель спавнит мобов возле игрока.
3. Представление отображает мобов.
Собственно ноды - это начальный уровень, на Godot возможно сделать игру совсем без нод, чисто на обращениях к разным "серверам", и это, в теории, значительно эффективнее использования нод.
>>34530
>Растение в каждом кадре дёргает свой метод Process, где происходит вызов попытки системы перевести своё состояние на следующий этап и выбросить оповещение
Во-первых, это крайне неэффективно: 60 раз в секунду дёргать кучу методов для каждого растения, которых могут быть сотни и тысячи. В играх такое решается обратным подходом: берётся случайная клеточка, и если в ней есть какое-то растение, ему увеличивается стадия роста. Это позволяет размазать нагрузку по времени, снизив число обновлений до 1 за тик мира.
Во-вторых, в симуляторах фермы растения обычно растут только "ночью": рост растений завязан не на реальное время, а на число дней в игре, которые игрок может пропускать по желанию. Причина не только в оптимизации, но и в гибком геймплее, подходящим для более широкой аудитории.
Тред читал мельком, если что.
> В играх такое решается обратным подходом: берётся случайная клеточка, и если в ней есть какое-то растение, ему увеличивается стадия роста.
Я что-то не понял, то есть следующее растение вырастет только в следующий тик мира? Или имеется ввиду взять случайную клеточку одного вида растений и проверить не пора ли всем растениям этого вида вырасти прямо сейчас?
Если что я мимокрокодил зелёный*
Террария так работает (работала много лет назад):
>The entire map is stored as one huge array. Each cycle, the updateworld method picks out a couple tiles at random and does something based on what that tile is (spread grass, grow a mushroom, place a cobweb, spread corruption). If it's nothing, it tries to spawn an npc there.
Это даёт Террарии работать в реальном времени с игровым миром на миллионы тайлов, каждый из которых можно удалить и заменить другим. Для игрока это выглядит так: всё растёт в случайные моменты времени, но +/- средняя скорость одна.
Вот Майнкрафт (опять же описание старых версий):
>Each tick (1/20 of a second), all chunks within a certain radius of the player run updates. In 1.9pre5 the radius is 7, so the update area is a 15×15 chunk square centered on the chunk containing the player.
>When a chunk updates, it does the following 20 times:
>Pick a random block in the chunk.
>If that block is eligible for random updates, update the block.
>(The 20 selections are independent, so the same block can be picked more than once.) The probability of a particular block being chosen is about (20 / (16×16×128)) = 0.061%.
>If a selected block is a crop which is not fully grown, and its growth conditions are met, then it makes a grow check.
>(дальше описание проверок разных растений)
Т.е. опять же, в чанке 16×16×384 = почти 100 тысяч блоков, но каждый тик обновляются всего лишь несколько случайных блоков. Отсюда получается неравномерный "естественный" рост растений.
Впрочем, для игры типа Stardew Valley так делать не обязательно, потому что в таких играх все растения обычно растут только когда игрок ложится спать. Но если ОП хочет растить растения в реальном времени, придётся использовать этот трюк со случайностью, с целью оптимизации и визуального разнообразия (синхронный рост совсем неестественно выглядит).
А, ну кстати да, процесс вырастания в террарии и майнкрафте очень похож, всё понял, спасибо большое что объяснил <3
>сетка полноценных нод
>Лол, серьёзно? 100% проблемы будут, если захочешь увеличить площадь своей фермы.
Вот тогда и буду решать проблемы оптимизации.
>пояснения за MVC
>1. Модель: хранит и управляет данными игры, например, территория фермы - это Array, в котором хранится информация о посаженных растениях.
Я же так и написал, у меня полноценные массивы нодов.
Массив с тайлами -> самый нижний слой 2д спрайтов
Массив с размещаемыми обьектами -> средний слой объектов со своими спрайтами
Массив с свистоперделками -> все что нужно натягивать поверх объектов прошлого уровня
>3. Контроллер: передаёт модели текущее желание пользователя, например, пользователь кликнул на клеточку - он хочет посадить там новое растение.
Зачем, если можно пукнуть ивент в пустоту и кому надо - тот поймает?
>Собственно ноды - это начальный уровень, на Godot возможно сделать игру совсем без нод, чисто на обращениях к разным "серверам", и это, в теории, значительно эффективнее использования нод.
Да, но стоит ли ради хобби изобретать велосипед? Мне сурового энтерпрайз пердолинга и на работе хватает.
>Растение в каждом кадре дёргает свой метод Process
>Во-первых, это крайне неэффективно: 60 раз в секунду дёргать кучу методов для каждого растения, которых могут быть сотни и тысячи.
Абсолютно пофиг, сходить по ссылке и дёрнуть пару булевых Func/Expression не сыграет большой роли
>Во-вторых, в симуляторах фермы растения обычно растут только "ночью"
У меня необычно :)
И все ещё что раз может поменяться.
>Тред читал мельком, если что.
Ну ты заходи если что
>сетка полноценных нод
>Лол, серьёзно? 100% проблемы будут, если захочешь увеличить площадь своей фермы.
Вот тогда и буду решать проблемы оптимизации.
>пояснения за MVC
>1. Модель: хранит и управляет данными игры, например, территория фермы - это Array, в котором хранится информация о посаженных растениях.
Я же так и написал, у меня полноценные массивы нодов.
Массив с тайлами -> самый нижний слой 2д спрайтов
Массив с размещаемыми обьектами -> средний слой объектов со своими спрайтами
Массив с свистоперделками -> все что нужно натягивать поверх объектов прошлого уровня
>3. Контроллер: передаёт модели текущее желание пользователя, например, пользователь кликнул на клеточку - он хочет посадить там новое растение.
Зачем, если можно пукнуть ивент в пустоту и кому надо - тот поймает?
>Собственно ноды - это начальный уровень, на Godot возможно сделать игру совсем без нод, чисто на обращениях к разным "серверам", и это, в теории, значительно эффективнее использования нод.
Да, но стоит ли ради хобби изобретать велосипед? Мне сурового энтерпрайз пердолинга и на работе хватает.
>Растение в каждом кадре дёргает свой метод Process
>Во-первых, это крайне неэффективно: 60 раз в секунду дёргать кучу методов для каждого растения, которых могут быть сотни и тысячи.
Абсолютно пофиг, сходить по ссылке и дёрнуть пару булевых Func/Expression не сыграет большой роли
>Во-вторых, в симуляторах фермы растения обычно растут только "ночью"
У меня необычно :)
И все ещё что раз может поменяться.
>Тред читал мельком, если что.
Ну ты заходи если что
Жаль тред, хорошая была задумка, но конец очевиден. Покойся...
уже есть несколько игр с этими ассетами видел на итче и в вк, опоздал и соснул ты анон(( без негатива сам такой