Как динамически загружать содержимое?

#xml #dynamic #xna

#xml #динамический #xna

Вопрос:

следующая проблема.

У меня есть XML-файл:

 <Question>
  <questionTxt>In welchem US-Bundesstaat befindet sich der "Yellowstone National Park?"</questionTxt>
    <a>"Wyoming"</a>
    <b>"Illinois"</b>
    <c>"Iowa"</c>
    <d>"Mississippi"</d>
    <texturePath>"YellowStone"</texturePath>
  </Question>
  

В другом классе я прочитал все значения для узла, подобного этому. Проблема в том, что все мои методы LoadContent выглядят следующим образом:

 internal static void LoadContent(ContentManager Content)
    {

        currentTex = Content.Load<Texture2D>("gfxData/"   texturePath);

    }
  

Таким образом, они являются внутренними и статическими и могут быть вызваны только один раз для класса. Но что, если я прочитаю другой узел, и «texturePath» изменится. Как перезагрузить текстуру изображения?

Ответ №1:

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

Ответ №2:

Что вам нужно сделать (для XNA 4.0), так это:

  • Добавьте игровой проект Windows к вашему существующему проекту. Это будет содержать класс, который считывает XML в виде списка

  • Убедитесь, что у вас есть следующие ссылки

    используя систему; используя System.Коллекции.Общий; с использованием System.Linq; с использованием Microsoft.Xna.Framework; с использованием Microsoft.Xna.Framework.Содержание;

  • Создайте пространство имен, описывающее проект (EnemyData), а внутри него открытый класс, который хранит данные (ENEMIES).

  • Добавьте элементы, которые вы хотите прочитать из XML, в качестве общедоступных переменных. Важно, чтобы они были общедоступными, иначе это не сработает. Вы получите сообщение об ошибке типа «Элемент в строке 4, символ 7 недопустим».

  • Щелкните правой кнопкой мыши на папке содержимого и добавьте XML-файл или скопируйте свой XML-файл.

  • Убедитесь, что XML-файл используется <XnaContent> в качестве КОРНЕВОГО узла.

  • Убедитесь, что XML-файл использует <Asset Type="namespace.classname[]"> , например <Asset Type="EnemyData.ENEMIES[]">

  • Используйте узел <Item> для каждого создаваемого элемента, даже если он только один. В моем случае мне нужно <Item> для каждого врага.

  • Установите для импортера содержимого XML-файла значение XML Content — XNA Framework, а для обработчика содержимого — значение «Обработка не требуется».

  • В вашей основной программе (или игре) обязательно щелкните правой кнопкой мыши на главном проекте и добавьте ссылку на созданный вами класс.

  • Вы также должны сделать это для проекта контента. Очень важно. И основной проект, и проект содержимого должны иметь ссылку на ваш класс.

  • В main/ game Game1 добавьте инструкцию Using для вашего класса.

    // Пространство имен XML-класса My Enemy Data

    использование EnemyData;

  • Создайте переменную для класса, такую как:

    //Вражеские данные

    ВРАГИ[] myEnemyData;

  • Загрузите содержимое в процедуре LoadContent:

    // Загрузить таблицу данных о врагах

    myEnemyData = Содержимое.Загрузка («Враги»);

  • Используйте данные из XML-файла

    Вражеская текстура = Контент.Загрузить(myEnemyData[3].enemyTexture);

    Урон = MyEnemyData[3].Ущерб;

Вот и все! Просто нужно убедиться, что тип в узлах XML соответствует типу в классе, и что они являются общедоступными классами. Я не хочу публиковать здесь весь код и XML, но вот ссылки на них.

 http://www.DCJoys.com/Class1.cs
http://www.DCJoys.com/EnemyData.csproj
http://www.DCJoys.com/Enemies.xml
  

Ответ №3:

Я полагаю, что ответ — Вайоминг.

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