2009-03-07 4 views
2

В настоящее время я пишу приложение. Если я хочу избежать Синглтонов, мне нужно просто передать ссылки на все вокруг?Избегайте глобального государства

Например,

У меня есть "основной" класс.
Класс: Главный
+ ---- Экран
+ ---- камера
+ ---- Terrain
+ ---- Автомобиль
+ ---- PhysicsWorld

Он содержит мою камеру, ландшафт и автомобиль, и т. Д. Классы. Теперь у меня возникают проблемы, когда я создаю, скажем, объект Terrain. Ландшафт хочет получить доступ к объектам экрана «Основные классы», чтобы он мог добавить свою графику ландшафта к экрану. Он также хочет знать о объекте Camera, когда он рисует, и он знает, какой масштаб его нарисовать. Он также хочет узнать о моем объекте PhysicsWorld, чтобы он мог добавить себя в физический движок.

Должен ли я всегда перетаскивать эти объекты туда и обратно между конструкторами? Я имею в виду, когда я создаю объект Terrain, мне просто нужно передать свой экранный объект, мою физику, камеру и т. Д.?

Другой случайный сценарий, который у меня есть, теперь ... внутри моего класса Vehicle Мне нужно вызвать метод Restart() в моем основном классе. Означает ли это, что я должен передать экземпляр основного автомобиля? В самом деле??

Он чувствует себя громоздким постоянно приходится проходить 4-5 вещи на занятия, особенно в моем сценарии, где сейчас почти каждый в игре объект У меня нужен экран, физика, данные камеры и т.д.

Любой предложения?

ответ

1

Я не знаю ActionScript, но при условии, что переменные передаются по ссылке, по крайней мере, вы можете создать класс среды, содержащий Camera, Screen, Terrain, PhysicsWorld, который вы передаете экземплярам.

2

Он чувствует себя громоздким постоянно иметь пройти 4-5 вещи на занятия, особенно в моем сценарии, где сейчас почти каждый в игре объект У меня есть нужен экран, физика, данные камеры, и т. д. Тогда правильный вопрос: «зачем мне все 5 объектов во всех моих классах?» Почему на Земле каждый объект, находящийся в гаме, нуждается в каком-либо из перечисленных предметов? В игровом объекте требуется положение и все, что ему нужно для обработки своего поведения. Тогда отдельный рендерер может, вы знаете, визуализировать объект. Это означает, что только рендерингу нужна информация и экран камеры.

Физика может идти в любом случае. У вас может быть отдельный физический объект, который обновляет игровой объект, или вы можете передать этот объект физики каждому игровому объекту. Но даже если вы пройдете это, мы дойдем до одного из трех перечисленных объектов. :)

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

Однако, если вы придерживаетесь глобалов, сделайте себе одолжение и, по крайней мере, избегайте одиночных игр.Вам не нужны дополнительные ограничения, обеспечиваемые синглом.

Terrain хочет получить доступ к основным классам объекта Screen, чтобы он мог добавить свои Terrain графики на экран. Он также хочет знать о Камере объект для рисования, поэтому он знает, какой весы его нарисовать. Он также хочет знать о моем объекте PhysicsWorld , чтобы он мог добавить себя в физический движок .

Объект местности должен знать одно: что такое ландшафт. Кто-то может взять на себя ответственность за его рендеринг. То, что кто-то должен будет знать о графике камеры, экрана и ландшафта, конечно, что предполагает, что один и тот же объект может правдоподобно выполнять другие задачи, связанные с этими объектами (например, другие задачи рендеринга). Почему ландшафт должен заботиться о том, какой масштаб он нарисовал? Он должен знать масштаб игры, но не масштаб в пространстве камеры. И почему кто-то еще не может добавить ландшафт в физический движок? Возможно, основная функция может это сделать. Создайте ландшафт, создайте физический движок, зарегистрируйте рельеф с физическим движком, начните игру.

0

У меня такая же проблема (также в ActionScript 3, по совпадению).

Я работаю над RTS для flash и обнаружил, что мне нужно передать большое количество ссылок на каждый новый класс (например, gameGrid, currentSelection, visibleUnits и т. Д.).

В конце концов я понял, что то, что я действительно должен делать, состоит в том, чтобы каждый класс поддерживал свои собственные свойства и вместо этого передавал ссылки на эти классы (объекты объектов).

Но в любом случае теперь то, что я делаю, имеет статические переменные, содержащие ссылки на обычно используемые объекты, такие как основной этап, интерфейс, движок и область отображения внутри класса RTSGlobals. Я также устанавливаю такие константы, как размер экрана.

Я знаю, что это на самом деле не отвечает на ваш вопрос, но иногда я полагаю, что стоит проигнорировать немного хорошей практики ООП в пользу эффективного решения.

Если кто-то имеет действительно есть хорошее решение, хотя практика, пожалуйста, сообщите :)

0

Я предлагаю вам взглянуть на образцы проектов XNA в (Google это). Они хорошо разработаны и могут дать вам несколько советов.

Кроме того, поскольку вы используете AS3, вы можете использовать систему событий для отправки сообщения другим объектам. Например, вместо того, чтобы передавать свой класс Main на ваш автомобиль, сделайте свой основной (или что еще интересным) слушателем вашего класса Vehicle. Затем, скажем, автомобильный сбой, и вы хотите перезапустить игру, отправьте событие, например CAR_CRASHED. Слушатели вашего автомобиля должны делать что-то на основе этого сообщения. Если вы хотите понять систему событий, введите EventDispatcher, выделите его и нажмите F1 в Flash IDE.