От макушки головы (вы можете перепроверить меня, используя Reflector), порядок вызовов во время инициализации XNA таков:
Initialize()
в вашем игровом классе
LoadContent()
в вашей игре компонентов (вызывается с Game.Initialize
)
LoadContent()
в вашем игровом классе (вызывается с Game.Initialize
)
- Обновление и отрисовка звонков
(Кстати, это далеко не полный список.)
Поэтому я бы предположил, что, добавляя игровой компонент в функцию LoadContent
вашей игры, LoadContent
в вашем игровом компоненте не вызывается, поэтому его SpriteBatch
не создается. Вы можете проверить это, добавив точку останова в функцию LoadContent
вашего игрового компонента.
Как правило, вы хотите создавать и добавлять свои игровые компоненты в функцию Initialize
вашей игры.
(Также вам следует и, возможно, нужно, вызвать соответствующие функции base
в LoadContent
и UnloadContent
.)
Лично я предпочитаю избегать использования DrawableGameComponent
и просто делать свой собственный отдельный класс. Это позволяет мне делиться экземплярами SpriteBatch
более напрямую (вместо того, чтобы создавать экземпляры для каждого компонента), и позволяет мне более явно контролировать порядок вызова объектов.