Решение о наследовании / интерфейсе для физического движка

Это для небольшого игрового проекта с 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: В конце концов, я отделил свойства сущности и формы, аналогично тому, как это было описано в принятом ответе, и аналогично модели сущность-компонент-система. Это означает, что у меня все еще есть юк-логика: «Это круг или линия, и это линия или круг?», Но я больше не притворяюсь, что полиморфизм мне здесь помогает. Это также означает, что я использую какую-то фабрику и могу одновременно выполнять несколько вычислительных миров!

6
задан Bingo 21 February 2012 в 02:01
поделиться