Это для небольшого игрового проекта с SDL на MinGW / Windows.
Я работаю над физическим движком, и моя идея заключалась в том, чтобы иметь Physics :: Object
, от которого должны происходить все физические объекты, и который регистрируется в глобальном Physics :: System
(это шаблон моносостояния), поэтому пользователю не нужно отслеживать, какие объекты включены в вычисления физики, а просто нужно вызвать функцию вроде Physics :: System :: PerformTimestepCalculation (double dt)
.
Это работает нормально, и я даже реализовал это с помощью одного производного класса Physics :: Circle
, который представляет собой 2-мерный круг. Я был очень доволен прогнозным обнаружением столкновений, хотя мне все еще нужно его оптимизировать.
Так или иначе, я столкнулся с проблемой , когда начал добавлять другие примитивы для включения в вычисления, например линия. Physics :: System :: PerformTimestepCalculation (double dt)
завален вызовами Object :: GetID ()
или аналогичными функциями (может способ избежать dynamic_cast ), но я чувствую себя грязным.
Я немного прочитал и понял, что мои элементы моей иерархии не являются заменяемыми (т.е. столкновение между двумя кругами очень отличается между столкновением двух строк).
Мне нравится, как мои Physics :: Objects
«саморегистрируются» с классом System
, поэтому они автоматически включаются в вычисления, и я действительно не хочу терять это.
Должны быть другие разумные пути проектирования. Как я могу лучше переделать вещи, чтобы незаменимые объекты не мешали?
Отредактируйте FYI: В конце концов, я отделил свойства сущности и формы, аналогично тому, как это было описано в принятом ответе, и аналогично модели сущность-компонент-система. Это означает, что у меня все еще есть юк-логика: «Это круг или линия, и это линия или круг?», Но я больше не притворяюсь, что полиморфизм мне здесь помогает. Это также означает, что я использую какую-то фабрику и могу одновременно выполнять несколько вычислительных миров!