Я пытаюсь написать SpriteManager
класс в XNA, но мне нужен доступ к Game
переменным. Например, Game.Content
свойство будет очень полезно при загрузке текстур и Game.GraphicsDevice.Viewport
поможет получить размер окна.
На данный момент у меня есть следующий класс:
public MainGame : DrawableGameComponent
{
public SpriteManager<Enemy> EnemyManager { get; get; }
public SpriteManager<Powerup> PowerupManager { get; set; }
...
}
Я могу думать о трех способах получения доступа к этим переменным в SpriteManager
классе:
Сделайте мой класс спрайт-менеджера производным от
GameComponent
. Это было бы идеально, за исключением того, что мой менеджер спрайтов используется вMainGame
, который являетсяGameComponent
.Используйте
((Game) Game1)
для доступа к переменным. Однако, выполнение этого вида уродства ужасно и нарушает инкапсуляцию.Передайте все от
MainGame
. Например,EnemyManager
необходимо загрузить случайный противник типа каждый раз , когда он порождает противника, поэтому вместо загрузки текстур вMainGame
, передатьEnemyManager
вGame.Content
собственность и позволить ей обрабатывать текстуры нагрузку. Однако я не уверен, что это лучший способ справиться с ситуацией. Я не могу положить на нее палец, но в некотором смысле это кажется «неправильным».
Я мог бы воспользоваться некоторыми советами о лучшем способе достижения этого.
На самом деле # 2 не так уж и плох (я предполагаю, что вы хотели понизить с
Game
доGame1
). Вы можете установить типGame1
в вашем конструкторе следующим образом:Вы могли бы даже сделать хорошую удобную собственность как это. Это всегда будет безопасно, при условии, что базовый
DrawableGameComponent
не делает ничего недокументированного.Или, если вы хотите быть предельно анальным по поводу отсутствия кастинга (а в этом нет необходимости ), вы можете сделать это:
источник