Задать вопрос
  • Entity Component System + ООП подход?

    siRius32,
    получается в идеальном варианте, абсолютно любой компонент можно добавить/удалить абсолютно любой entity и система, которая использует этот компонент что то сделает, если же какой то компонент нельзя дать сущности, то что то не так значит надо пересматривать архитектуру?

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

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

    Сам компонент означает некоторое свойство, которым сущность может обладать. Например, это может быть свойство мертвого персонажа. Есть компонент - персонаж мертв. Такому компоненту не нужны данные, мертв - это как бы однозначно и без оговорок.

    CharacterStateComponent - это пример очень плохо сформулированного компонента. Я вижу там мультикомпонент - этот компонент можно и нужно разделить на несколько: движение, навыки, привязка к локации, боевка, смерть и умирание. Процесс умирания и смерть - это два разных состояния игрока, это разные компоненты.

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

    Любая система в любой момент времени может добавить или убрать компоненты сущности. Так, например, система жизни может увидеть что после работы системы урона очков жизни больше нет, значит пора сущности умирать. В этом случае система жизни добавляет компонент умирания и больше ничего не делает.
    Далее, система умирания подхватывает сущность с компонентом умирания и удаляет у нее компоненты подвижности, здоровья, атаки, магии, компонент цели атаки или навыков, а так же добавляет компонент лута и компонент смерти. После этого система умирания удаляет и компонент умирания. Все, сущность умирла и не важно что это за сущность: сундук, моб или игрок.
  • Entity Component System + ООП подход?

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

    А если попробовать все-таки сформулировать такие компоненты для таких сущностей, то зачем эти компоненты сущностям фигур? И зачем сущностям поля или состояния игры компоненты фигур? Это вносит в мир ECS неоднородность, набор компонентов становится несвязным. Для одних сущностей становятся характерны только один компоненты, а для других - только другие. Получается снова недоархитектура.
    Такой ECS-мир является избыточным и, вероятно, должен быть разделен на несколько ECS миров, компоненты в которых будут связными.
  • Entity Component System + ООП подход?

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

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

    А проблема заключается в том, что ECS в любой момент должен иметь возможность распорядиться по-своему абсолютно каждой сущностью. Создать новую, удалить текущую, добавить компоненты, убрать компоненты. В этом гибкость подхода ECS. Более того, ECS изначально, как архитектура, спроектирован так, чтобы дать разработчику возможность неблокирующего массового распараллеливания симуляции мира. На все ядра сразу и сразу на 100%.
    Когда ты замешиваешь ООП в ECS, часть опор архитектуры ECS рушится. В результате ты получаешь недоархитектуру, которой уже не так удобно пользоваться. Так всегда бывает с любым архитектурным шаблоном: ты не можешь пользоваться им с присущим ему удобством если сам же это удобство загубил.
    Ты можешь получить внезапный удар в спину от невозможности больше удалять компоненты после их добавления. Или - невозможность оперировать жизнью компонентов после создания сущности. Или - недоступную более возможность массового распараллеливания.
    Это все больно бьет по удобству использования ECS.
    Это я говорю как участник двух Open Source разработок ECS библиотек и создатель трех собственных версий ECS.
  • Entity Component System + ООП подход?

    siRius32, да, это плохой дизайн. Java не оставляет тебе шанса в отказе от ООП, но даже в Java можно реализовать правильный подход ECS.

    Важным пунктом идеологии ECS является эфемерность сущности. В ней не должно быть логики, в ней не должно быть данных. Сущность - это что-то среднее между абстрактным указателем и хешем. И только системы должны иметь понимание семантики сущности. Доступ ко всем данным сущности и всю логику сущности должны реализовать именно системы.
  • Как решить проблему в visual studio 2019 c++?

    @MarkusD Куратор тега C++
    JoJikRe , этот крестик - это сообщение об ошибке исполнения. std::out_of_range говорит о том, что код попытался обратиться за пределы стандартного контейнера. Исключение было сгенерировано на той строчке, на которой ошибка и присутствует.
    Тебе стоит просто отладить свой код.
  • Вызов C++ функций в python?

    @MarkusD Куратор тега C++
    newuser20, тебе нужно это все описать в своем вопросе. В комментариях к ответам эта информация бесполезна.
  • Вызов C++ функций в python?

    @MarkusD Куратор тега C++
    newuser20, тебе стоит расписать больше, т.к. сейчас твой вопрос только вводит в заблуждение.
    Сформулируй свой вопрос в более подробной форме, чтобы было понятно, какую именно функцию ты хочешь вызвать и какой результат получить.
  • Нужно ли инициализировать статические переменные?

    @MarkusD Куратор тега C++
    oftywave, это уже выходит за рамки текущего вопроса. Оффтоп запрещен правилами.
    Тебе будет лучше оформить это как свой новый вопрос. В этом случае ответить на него смогу не только я, но и другие люди тоже.
  • Как удалить символ из строки?

    @MarkusD Куратор тега C++
    Руслан Тиляев , а чем удаление слова отличается от удаления символа?
  • Нужно ли инициализировать статические переменные?

    @MarkusD Куратор тега C++
    oftywave, мои вопросы подразумевают некоторое знание, обладая котором в вопросе можно сориентироваться.
    Хорошо что ты открыто говоришь о том, что не сориентировался.
    С твоих слов статическая переменная ни чем не отличается от утекшей динамической памяти. Ее тоже один раз выделили и один раз проинициализировали, а потом она утекла и прожила до кона жизни процесса.

    И, все-таки, это не верно. Тебе нужна информация о природе статического времени жизни: [1], [2]. Это как минимум.
    Дополнительно, тебе стоит сразу понять проблему фиаско статической инициализации.

    Статической переменную (или константу) делает расположение этой переменной в памяти с характеристикой статического времени жизни (static storage-duration).
    Статический объект от глобального отличается тем, что определен с применением слова static, которое разрешает только внутреннее связывание (internal linkage) объекта в рамках текущего модуля трансляции. Глобальные объекты имеют внешнее связывание (external linkage) и могут быть использованы в других модулях трансляции. Возможность связывания - это именно то, что отличает глобальные объекты от динамической памяти. Для динамической памяти связывание недоступно.
    Объекты в памяти статического времени жизни инициализируются до начала работы главной функции и деинициализируются после выхода из главной функции.
    При этом, инициализация происходит в соответствии с общим правилом инициализации любого объекта любого типа. В случае с тривиальными типами инициализация объекта будет фиктивной. Тривиальные типы не имеют функционального конструктора по умолчанию и всегда должны быть явно инициализированы.

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

    @MarkusD Куратор тега C++
    oftywave , что делает переменную статической, какие свойства добавляются переменной чтобы она стала статической?
  • Не выравниваются функциональные блоки?

    oftywave,
    это уже вкусовщина пошла

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

    Между тем, тысяча с лишним строк в файле исходного кода - это средний объем кода в крупном проекте. И студия легко с этим объемом справляется. Я иногда работаю в файлах с тремя или пятью тысячами строк. Проблем не испытываю.
    Проблема у тебя явно локальная. Будет хорошо если ты покажешь настройки Intellisense.
  • Как заставить ботов убегать от преследователей?

    Magneto903, тебе стоит почитать про Navmesh building и Convex Hulling.
    Результирующее навигационное пространство может содержать дополнительные свойства, в числе которых может быть свойство тупиковой ветви движения (ближе-дальше относительно тупика), свойство поверхности передвижения, свойство габаритов прохода.
    Такие дополнительные свойства добавляются в пространство для того чтобы варьировать поведение разных аниматов в рамках единого навигационного пространства.
  • Влияет ли низкое напряжение сети на работу фотополимерного принтера?

    Jek, тогда советую сделать тест на засветку. Просто берешь каплю на что-нибудь капаешь и кладешь под солнце.
    Минуты засветки будет достаточно чтобы фотополимер полностью затвердел. Если не твердеет, значит он уже деградировал.
    Китайская смола от Anicubic такая себе, быстро сепарируется и быстро деградирует.
  • Влияет ли низкое напряжение сети на работу фотополимерного принтера?

    Jek , был ли принтер все время простоя включен в сеть? Встряхивал ли ты фотополимер перед заливкой в ванну для печати? Делал пробу фотополимера на засветку солнечным светом?
  • Что за файлы sources в папках с исходным кодом?

    Сергей Карбивничий, я занимаюсь разработкой, в частности, под Win и XBox. И, нет, про структуру этого файла я ничего не знаю, да и не должен. Никогда даже не задумывался о том, что эти файлы должны для меня нести какой-либо смысл.
    Но тебе сперва стоило бы провести более детальный поиск по файлам. Все вполне хорошо описывается прямо в этих файлах.
  • Что за файлы sources в папках с исходным кодом?

    Сергей Карбивничий, в таких случаях принято в вопросе публиковать ссылку на публичный репозиторий.
  • Что за файлы sources в папках с исходным кодом?

    Сергей Карбивничий , П5.4 регламента работы сервиса.
    Надеюсь, у тебя есть право на разглашение и на просмотр исходных кодов ОС от Microsoft.
  • Как обратиться к ячейке памяти?

    @MarkusD Куратор тега C++
    Никита, а давай для начала определим что такое динамическая память, рас ты с ней уже работал.
  • Как обратиться к ячейке памяти?

    @MarkusD Куратор тега C++
    Никита , и в чем конкретно у тебя проблема?