#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:
Я полагаю, что ответ — Вайоминг.
Если серьезно, я думаю, вы путаете статические методы и статические переменные. Статический метод может вызываться много раз. Статические методы относятся к классу и не требуют от вас создания экземпляра класса.