Исключение в C # XNA 4.0: «Не удается открыть файл» - PullRequest
1 голос
/ 05 июля 2011

Я работаю в XNA 4.0 Game Studio (C #) и пытаюсь загрузить изображение с помощью метода LoadContent ().Я загрузил множество файлов изображений в эту игру, и все они работают на 100% нормально, но по какой-то причине XNA не открывает файлы внутри одного из моих методов loadContent.Вот метод:

    protected override void LoadContent()
    {
        //spriteBatch = new SpriteBatch(GraphicsDevice);
        //Sets up an array of textures to be used in the Icon class
        Texture2D[] icons = new Texture2D[24];

        #region Loading talent textures
        //These are all of the icons that need to be loaded for the talents
        //Paladin
        icons[0] = Content.Load<Texture2D>(@"C:\Users\Student\Desktop\Dropbox\Public\platformer\Platformer\Content\Talents\blade_of_light3.jpg");
        icons[1] = Content.Load<Texture2D>("Talents\\divine_grace");
        icons[2] = Content.Load<Texture2D>("Talents\\divine_storm");
        icons[3] = Content.Load<Texture2D>("Talents\\hammer_of_the_righteous");
        icons[4] = Content.Load<Texture2D>("Talents\\healing_hands");
        icons[5] = Content.Load<Texture2D>("Talents\\heavenly_fury");
        icons[6] = Content.Load<Texture2D>("Talents/momentum_of_light");
        icons[7] = Content.Load<Texture2D>("Talents/retribution");
        icons[8] = Content.Load<Texture2D>("Talents/righteous_fury");
        icons[9] = Content.Load<Texture2D>("Talents/sanctuary");
        icons[10] = Content.Load<Texture2D>("Talent/searing_light");
        icons[11] = Content.Load<Texture2D>("Talent/wrath_of_the_heavens");

        //Warrior
        icons[12] = Content.Load<Texture2D>(@"Talents\bloodstorm");
        icons[13] = Content.Load<Texture2D>(@"Talents\bloodthirst");
        icons[14] = Content.Load<Texture2D>(@"Talents\die_by_the_sword");
        icons[15] = Content.Load<Texture2D>(@"Talents\furious_blades");
        icons[16] = Content.Load<Texture2D>(@"Talents\unleash_rage");
        icons[17] = Content.Load<Texture2D>(@"Talents\lifeblood");
        icons[18] = Content.Load<Texture2D>(@"Talents\red_like_my_rage");
        icons[19] = Content.Load<Texture2D>(@"Talents\eternal_thirst");
        icons[20] = Content.Load<Texture2D>(@"Talents\bladesurge");
        icons[21] = Content.Load<Texture2D>(@"Talents\bathed_in_blood");
        icons[22] = Content.Load<Texture2D>(@"Talents\bladerunner");
        icons[23] = Content.Load<Texture2D>(@"Talents\bloodfury");
        icons[24] = Content.Load<Texture2D>(@"Talents\grapple_chain");
        #endregion

Как вы можете видеть, я пытался использовать ВСЕ местоположение файла.Он находит файл, но выдает исключение при вызове метода LoadContent () и говорит: «Не удается открыть файл blade_of_light3.»

Я не получаю никаких ошибок о путях перехода или чем-то подобном, и я использовалтакого рода путь к файлу для других изображений, и они работают нормально.Именно здесь, в этом классе, в этом методе loadContent они не будут работать.

Ответы [ 2 ]

5 голосов
/ 05 июля 2011

Методы Content.Load не загружают файлы, а загружают специализированный контент или ресурсы.Посмотрите на это .Вы не можете загружать файлы напрямую, вы можете загружать только ресурсы.Эти активы генерируются с помощью конвейера содержимого .Это в основном для предоставления абстрактного слоя для контента.Поскольку XNA не зависит от платформы, и на одном компьютере вы можете использовать увеличенное изображение или другое изображение, вам нужно только изменить ресурс в конвейере и использовать код повторно.

3 голосов
/ 06 июля 2011

Просто добавьте к превосходный ответ dowhilefor , если вы хотите загрузить необработанный файл .jpg (или .png), вы можете сделать это следующим образом:

using(var s = File.OpenRead(fileName))
{
    Texture2D texture = Texture2D.FromStream(GraphicsDevice, s);
}

В отличие от , когда вы загружаете что-либо, используя ContentManager, , в этом случае вы «владеете» этим.Это означает, что вы отвечаете за вызов Dispose() для него в UnloadContent.

Также в отличие от , когда вы проходите через конвейер содержимого (используя настройки по умолчанию), текстуру, которую вы загружаетене будет предварительно умноженного альфа.Вам необходимо применить предварительное умножение самостоятельно или отобразить его с помощью BlendState.NonPremultiplied.

Конечно, если вы по какой-либо причине не можете этого сделать (например, загружаете изображения из Интернета или позволяетеконечный пользователь выбирает их), вы должны использовать конвейер контента .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...