У меня есть следующий класс Game1, который я немного изменил (хе-хе, и может быть причиной того, что это не работает должным образом ...):
Game1 Class
public class Game1 : Microsoft.Xna.Framework.Game
{
//GraphicsDeviceManager graphics;
SpriteController _spriteController;
GraphicsDevice graphicsDevice;
ContentManager _contentManager;
public Game1()
{
_contentManager = new ContentManager(new Chronos.Engine.Infrastructure.ServiceContainer());
_contentManager.RootDirectory = "Content";
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
_spriteController = new SpriteController();
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
_spriteController.GraphicsDeviceService.GraphicsDevice.Clear(Color.CornflowerBlue);
string fileAsset = "pacmansprite";
_spriteController.AddSprite(
new Sprite(
10,
10,
fileAsset,
_contentManager
),
fileAsset
);
_spriteController.Draw(10, 10, fileAsset);
base.Draw(gameTime);
}
}
Дополнительная информация
Контроллер спрайтов - это просто класс, который содержит несколько спрайтов, которые рисуют спрайты на основе указанного ключа (т. Е. Для их хранения используется IDictionary<string, Sprite>
). Внутри spriteController есть ссылка GraphicsDevice
, к которой можно получить доступ, а также менеджер контента, который может быть возвращен. В конечном счете, я хотел бы сделать так, чтобы SpriteController был единственным полем в классе Game1, так как он предоставляет все необходимые компоненты для выполнения того, что необходимо для визуализации простой графики, но я не смогу сделать это, пока не исправлю это.
Проблема возникает в конструкторе Sprite
class '. Вот метод, который передает данные:
Из класса Game1
protected override void Draw(GameTime gameTime)
{
_spriteController.GraphicsDeviceService.GraphicsDevice.Clear(Color.CornflowerBlue);
string fileAsset = "pacmansprite";
_spriteController.AddSprite(
new Sprite(
10,
10,
fileAsset,
_contentManager
),
fileAsset
);
_spriteController.Draw(10, 10, fileAsset);
base.Draw(gameTime);
}
Из класса спрайтов
public Sprite(float x, float y, string assetName, ContentManager contentManager)
{
_position = new Vector2(x, y);
_texture = contentManager.Load<Texture2D>(assetName); //Error: file not found
}
Ошибка возникает прямо здесь: мне нужно сослаться на файл .png (который загружен во внешний файл контента, имеет то же имя и имеет импорт / процессор Texture
), который не загружается. fileAsset
имя, как показано, "pacmansprite".
Есть ли что-нибудь, что кто-нибудь может увидеть, что я делаю не так? В случае необходимости я выложу больше кода, но пока думаю, что этого будет достаточно.