Как организовать структуру 3D-игры? - PullRequest
2 голосов
/ 27 ноября 2010

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

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

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

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

То, что вы делаете со своим представлением о мире в иерархии, очень похоже на то, что обычно называют «графом сцены», и во многих случаях это хорошая идея. Хороший пример библиотеки, которая делает это точно: Open Scene Graph .

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

0 голосов
/ 06 декабря 2010

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

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

...