2010-11-27 2 views
2

Это немного смутный вопрос, но неся со мной. Я нахожусь в процессе написания игры с использованием Python/Pyglet и openGL. В настоящее время я структурирован так, что есть объект, называемый «мир», в этом есть другие объекты с другими объектами внутри них и т. Д. Я сделал это так, потому что, например, одна часть игры представляет собой платформу с другими объектами на ней, и когда я наклоняю платформу, я хочу, чтобы объекты на ней наклонялись вместе с ней. Поэтому я делаю platform.draw(), который вызывает glRotate, glTranslate, а затем рисует каждый из объектов, сохраняя матрицу viewview между ними, таким образом все объекты на платформе перемещаются вместе. Первый вопрос: это разумный способ организовать вещи, или я должен использовать какой-то другой метод?Как организовать структуру 3D-игры?

У меня нет класса камеры, в настоящее время я просто переводя весь мир или его части, чтобы создать иллюзию движения. Однако в будущем я хочу иметь возможность переключаться между точками зрения между объектами, поэтому, например, переключитесь с того, чтобы смотреть вниз на мир сверху до 1-го лица с одного из объектов в мире. Итак, второй вопрос - это лучший способ структурировать мою программу, чтобы это было возможно в будущем?

ответ

1

Не вероятно, полный ответ, но я думаю, что полный одна бы целую книгу ...

Что вы делаете с вашим представлением мира в иерархии очень похоже на то, что обычно известно как «scene-graph», и во многих случаях это хорошая идея. Хорошим примером библиотеки, чтобы сделать это, является Open Scene Graph.

О «переводе мира», если вы действительно не трансформируете все вершины каждый раз, это также отлично. Это всего лишь вопрос относительной точки зрения и то, что у вас на самом деле, это то же самое, что и матрица камеры. Вы можете видеть трансформацию, как размещение камеры в мире, или как перемещение мира перед камерой.

+0

Проблема заключается в том, что, когда я хочу сделать что-то с одним из объектов в моем мире, я имею сделать world.object1.object2. object3.do_something(), его становится немного уродливым. Мне также нужно передать указатель на остальную часть мира каждому объекту, а не на то, что это действительно огромная проблема. – eggbert

0

Вы можете поместить логику в отдельный модуль/в отдельные классы/функции. В моей 2D-игре у меня есть класс GameLogic, который упрощает регистрацию его методов для определенных событий или их планирование (и отмена регистрации + их отладка), и я создал декоратор @state_wrapper, который вводит простой объект нового стиля в качестве хранилища состояний для этого метод. Если вы это сделаете, вам не нужно передавать указатель на все ваши объекты мира, только методы-события должны получить доступ к вашим объектам.

Но я бы не стал утверждать, что это является лучшим решением;)