Как лучше всего получить доступ к полям/свойствам класса Game1 в xna?

Я делаю игру xna, и будет много классов, которые управляют рисованием, обновлением и тому подобным.

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

Проблема в том, что у меня будет сеть классов, классы, которые вызывают другие классы, и классы в самом низу цепочки все еще должны иметь возможность доступа к классу Game1 для графического устройства и тому подобного.

Как лучше всего это сделать? Просто продолжать передавать Game1 в качестве параметра, что ли?


person Thomas    schedule 02.08.2012    source источник


Ответы (2)


«Правильный» ответ с точки зрения разработки программного обеспечения/архитектуры заключается в том, чтобы передавать определенные ресурсы, которые вам нужны, в качестве параметров в ваши методы. Это дает много преимуществ, возможно, самым большим из которых является то, что он отделяет различные части вашего кода, позволяя использовать их независимо друг от друга.

Чтобы дать вам пример: у вас может быть ваша игра. Но тогда вы, возможно, захотите взять тот же самый код и сделать редактор, или модульные тесты, или любой другой сумасшедший инструмент. Во многих из этих случаев у вас может даже не быть класса Game. (Чтобы привести вам конкретный пример, это мое видео показывает вам два очень разных способа запуска одного и того же игрового кода — это было бы невозможно без надлежащего разделения.)

(Исходя из этого, вам, вероятно, следует передавать более конкретные вещи, чем класс, производный от Game.)

Вы можете пойти еще дальше, если у вас достаточно открытые требования к версиям/зависимости, и обойти IServiceProvider (например, это то, что XNA передает конструктору ContentManager). Я провел подробный анализ того, почему вы можете сделать это в этом ответе.

ОДНАКО

Вы не пишете библиотеку, которая будет использоваться третьими лицами. Вы пишете игру. Единственными людьми, которые будут использовать ваш код, является ваша собственная команда, и у вас есть доступ к исходному коду, и вы можете свободно изменять его.

Это означает, что вы можете срезать путь.

На практике обычно можно получить статический экземпляр вашего игрового класса или (и это мой предпочтительный метод, когда я собираю что-то вместе) статические свойства вашего игрового класса. А в XNA вы знаете, что на практике у вас будет только один экземпляр игрового класса.

Во-первых, это легко и быстро сделать. И также быстро и легко вернуться позже и переключиться на «правильный» путь. Пока вы к этому готовы. Здесь особенно полезны хороший контроль версий и использование «Найти все ссылки» в Visual Studio.

По сути: до тех пор, пока вы понимаете, что идете по более короткому пути, почему вы идете по нему и каков "правильный" путь, тогда можно пойти по этому пути.

person Andrew Russell    schedule 02.08.2012

Почему бы не оставить где-нибудь статическую ссылку на game1, и все ссылки на нее?

person Brian Mains    schedule 02.08.2012
comment
Вы уверены, что это лучший способ? По сути, все, что я создаю, будет основано на том, как я решаю эту проблему, поэтому все должно быть очень правильно... - person Thomas; 02.08.2012
comment
Передача его в качестве параметра или конструктора везде может быть ненужной; статическая ссылка обеспечивает центральное расположение для доступа к этому. Это не обязательно специфическая проблема XNA, но аналогичная проблема для любого типа приложений. Мое мнение, и в качестве отказа от ответственности, я смотрел на программирование XNA, но еще не создал свою собственную игру... пока. - person Brian Mains; 02.08.2012