Проблема с файлом XNA Not Found - настройки указаны правильно (т.е. это должно работать) - PullRequest
1 голос
/ 05 декабря 2011

У меня есть следующий класс 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".

Есть ли что-нибудь, что кто-нибудь может увидеть, что я делаю не так? В случае необходимости я выложу больше кода, но пока думаю, что этого будет достаточно.

1 Ответ

3 голосов
/ 05 декабря 2011

Первая ошибка, которую я вижу в вашем коде, не связанная с вашим исключением: вы действительно должны загружать контент в LoadContent, а не в Draw.Особенно с учетом того, что вы создаете новый объект спрайта каждый кадр.Вам следует рассмотреть возможность полного отказа от контроллера спрайтов и классов спрайтов - они кажутся ненужным слоем косвенности.

Следующая ошибка: способ настройки собственных _contentManager кажется неправильным.Служебный контейнер, который вы передаете, должен содержать GraphicsDeviceService, если вы хотите загрузить текстуры.Вы должны передать Game.Services или, что еще лучше, просто использовать Game.Content вместо создания своего собственного!

Наконец, ваше исключение: вы не предоставили достаточно информации, чтобы точно определить, почему вы ее получаете.Но вот как выяснить, что не так:

Сначала вам нужно выяснить путь, с которого он пытается загрузить вашу текстуру.Это сочетание RootDirectory и имени актива, а также расширение .xnb.Для меня это выглядит так, как будто он пытается загрузить Content\pacmansprite.xnb.

Так что следующим шагом будет поиск в каталоге вашей сборки (bin\x86\Debug или аналогичный) и проверка, существует ли файл по этому пути.Если нет, вам нужно изменить ваш контент-проект так, чтобы там отображались выходные данные компоновки контента.

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

Если у вас возникли проблемы, одна вещь, которая может помочь, - это попытаться создать новый проект с шаблоном по умолчанию и загрузить и вывести ваш актив.непосредственно.Тогда работай оттуда.

...