Дизайн игрового уровня с XNA?

10

Меня интересует дизайн в игре. Моя текущая ситуация вращается вокруг Tiled - у меня есть много разных слоев с различными типами объектов (для тех, кто не знаком с Tiled, объект является не чем иным, как координатой с произвольными назначенными ему свойствами).

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

Кристофер Хоренштейн
источник

Ответы:

8

Я предполагаю, что файлы вашей карты обрабатываются через Content Pipeline, а затем загружаются во время выполнения с помощью Content.Load. У вас есть два варианта:

  • Сохраните свои карты в виде файла XML через IntermediateSerializer.Serialize. Затем во время выполнения вы можете прочитать их с помощью IntermediateSerializer.Deserialize, чтобы увидеть изменения.
  • Это сложнее: вызвать MSBuild во время выполнения, чтобы перекомпилировать ваши файлы в надлежащие XNB, и перезагрузить их с помощью ContentManager. Этот образец делает это.
r2d2rigo
источник
Между этими двумя я уверен, что смогу что-то уладить. Спасибо!
Кристофер Хоренштейн
2

Вы также можете использовать Karvonite, если хотите, чтобы все было очень быстро.

Это гибкая основа постоянства. Я не уверен, будет ли новая версия работать на Windows Phone 7 или Xbox.

Вы бы создали определение персистентности с помощью их редактора персистентности (это довольно просто, вы просто импортируете сборку и проверяете поля / свойства тех классов / структур, которые хотите сохранить). Вы инициируете ObjectSpace в коде и добавляете / удаляете / получаете объекты из него. , (эти объекты сохраняются)

Если бы вы могли создать абстракцию так, чтобы движок плиток или как бы вы его ни называли, его не волнует, как именно он получает карту, просто он получает тот, о котором просил. Затем вы можете вернуться и использовать XmlSerializer или Intermediate. (что бы вы ни предпочли) Все, что вам нужно сделать для реализации этих других сериализаторов, - это создать еще одну реализацию абстракции (интерфейс или абстрактный класс).

Я думаю, что есть пример того, как создавать контент во время выполнения на веб-сайте клуба создателей XNA. Это может быть не построено с последними рамками, хотя. Таким образом, вы можете сохранить свой старый код, если вы уже используете конвейер контента. Вот ссылка: Winform Series 2: загрузка контента

Майкл Коулман
источник
Я чувствую себя немного глупо, спрашивая об этом, но не могли бы вы описать, каким вы видите рабочий процесс с использованием этой среды? Звучит очень аккуратно, но я не уверен, как к нему подойти.
Кристофер Хоренштейн
1
Ну, вы определяете сериализацию в их редакторе постоянства. (это действительно просто, вы просто импортируете свою сборку объекта и отметьте некоторые поля в структурах / классах и полях / свойствах, которые вы хотите сохранить). После того, как вы это сделаете, вы можете просто инициализировать пространство объектов, которое сериализует / десериализует ваши объекты. , Это довольно аккуратно и быстро, чтобы начать работать.
Майкл Коулман
1
Вы также можете посмотреть на этот проект на codeplex для лучшего примера того, как создавать контент за пределами Visual Studio. ( xnadevru.codeplex.com/… )
Майкл Коулман