Итак, я наконец-то нашел время поиграть с XNA и занялся созданием 2D-игры (у меня есть куча художественных ресурсов от друга, который разработал его для iOS)
Многие вещи кажутся легкими для выполнения и выходят из коробки, однако я остаюсь в тупике из-за множества вещей, так как большая часть литературы (например, книги, которые я купил) не уделяет слишком много внимания 2D.
Буду очень признателен за любые разъяснения или указание на дополнительную информацию о следующих квестинах:
В чем смысл игрового сервиса? Я понимаю всю идиому регистрации объекта в качестве службы, чтобы любой другой GameComponent мог его захватить, но как это превзойти, просто сделав его публичным или статичным? Например, моя книга рекомендовала зарегистрировать объект SpriteBatch в классе Game.cs. Я не уверен, насколько это предпочтительнее, чем просто сделать его публичным / статическим, поскольку в любом случае должен быть только один экземпляр Game (синглтон)?
Я запутался, когда мне следует наследовать от GameComponent или RenderableGameComponent. Я пытаюсь следовать дизайну диспетчера / контроллера, чтобы все сущности создавались / принадлежали одному менеджеру и одинаково для других вещей. В настоящее время у меня есть каждый диспетчер / контроллер, унаследованный от GameComponent, однако, как это превосходит, если объект Game владеет всеми менеджерами и вручную вызывает update для них и рисует?
Я заметил, что Initialize вызывается до ContentLoad (), я обнаружил, что это раздражает, поскольку в моей Initialize я хотел бы создать некоторые из своих сущностей (например, Sprite, Player и т. Д.), Однако я не могу дать им их загруженные SpriteSheets или Textures, поскольку вызов для их загрузки еще не произошел. Возможно, я неправильно инициализирую или люди просто назначают текстуру ниже в ContentLoad?
Похоже, это мой самый большой " WTF " не совсем понимающий
источник
SpriteBatch.Draw
указывается в координатах текстуры-пикселя относительно верхнего левого угла текстуры (или исходного прямоугольника, если вы его используете).public
/static
свойств. Почему? Тестируемость. Практически невозможно переключить вещи с помощью подхода со свойством, тогда как это тривиально, если все инициализируется с тем,IServiceProvider
что может быть заполнено всем, что нужно классу вашим методом тестирования. Это также избавляет от необходимости создавать экземпляр самогоGame
объекта в вашем тесте, который очень быстро запутывается.Game
объекта. К ним просто обращаются через интерфейсы, которые проталкиваются,Game.Services
а затем передаются всему, чтобы получить то, что им нужно.На ваш первый вопрос, я должен признать, что на самом деле не знаю фактического ответа. Я думаю, это будет по той же причине, по которой синглтон, как правило, является плохим шаблоном дизайна. Я отсылаю вас к цитате по этой ссылке :
Что касается вашего второго вопроса, я бы предположил, что использование таких Компонентов было бы более полезным, если бы вы вместо этого следовали компонентному подходу, как если бы у вас был список
Sprite
компонентов, которые бы знали, как рисовать и обновлять себя вместо менеджер, который знает, как обновить и нарисовать каждый спрайт. Я согласен, это звучит одинаково, но я предпочитаю компонентный дизайн, потому что мне действительно нравится объектно-ориентированный подход, который у него есть.Для вашего третьего вопроса: да, вы должны загрузить любую форму контента (ресурсы, шрифты и т. Д.) В методе LoadContent. Что касается инициализации, вы обычно создаете объект Player в функции Initialize и затем загружаете его содержимое в LoadContent. Или вы можете просто сделать все это в LoadContent, если хотите.
источник