Игровые иерархии не должны включать много наследства. Я не могу указать вам на какие-либо веб-страницы, но это чувство, которое я собрал из нескольких источников, особенно из серии игровых гемов.
Вы можете иметь иерархии, такие как ship-> tie_fighter, ship-> x_wing. Но не PlaysSound-> tie_fighter. Ваш класс tie_fighter должен состоять из объектов, которые он должен представлять сам. Физическая часть, графическая часть и т. Д. Вы должны предоставить минимальный интерфейс для взаимодействия с игровыми объектами. Реализуйте как можно больше логики физики в движке или физическом элементе.
При таком подходе ваши игровые объекты становятся коллекциями более базовых игровых компонентов.
Все это говорит о том, что вы захотите установить физическое состояние игровых объектов во время игровых событий. Таким образом, вы столкнетесь с проблемой, которую вы описали для установки различных частей состояния. Это просто неприлично, но это лучшее решение, которое я нашел до сих пор.
Я недавно пытался создавать функции состояний более высокого уровня, используя идеи из Box2D. Есть функция SetXForm для установки позиций и т. Д. Другая для SetDXForm для скоростей и угловых скоростей. Эти функции принимают прокси-объекты в качестве параметров, которые представляют различные части физического состояния. Используя такие методы, вы могли бы уменьшить количество методов, которые вам понадобятся для установки состояния, но, в конце концов, вы все равно могли бы реализовать более мелкозернистые, и прокси-объекты потребовали бы больше работы, чем вы бы сэкономили, пропустив на несколько методов.
Итак, я не сильно помог. Это было скорее опровержением предыдущего ответа.
Таким образом, я бы порекомендовал вам придерживаться подхода многих методов. Между игровыми объектами и физическими объектами не всегда могут быть простые отношения один к одному. Мы столкнулись с тем, что было гораздо проще иметь один игровой объект, представляющий все частицы от взрыва. Если бы мы сдались и просто выставили указатель тела, мы бы не смогли упростить проблему.