Реализация простого языка сценариев на основе XML для игры XNA - PullRequest
1 голос
/ 22 августа 2010

Я работаю с командой над движком RPG в C # и XNA. Мы планируем ориентироваться на Windows и Windows Phone 7, но сталкиваемся с проблемами взаимодействия с ИИ и управления действиями игроков во время кат-сцен. В большинстве случаев все извлекается с использованием шаблона проектирования MVC, но абстрагирование всей логики и перемещения в контроллер может вызвать проблемы в будущем. Поэтому идея состоит в том, чтобы иметь интерфейс (IScriptEngine), который принимает IScriptObject и соответствующим образом обновляет данные в модели карты. Я думал о том, чтобы поместить сценарии в синтаксис XML-типа:

<Script Name="MoveNPC_1"> 
    <Action Command="MoveToTile" Target="NPC_1" Value="10,2"/> 
</Script> 

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

switch(Action.Command)
{
    case "MoveToTile":
      { 
         doMovement(Action.Value, Action.Target); 
         break;
      }
}

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

Edit: Я хотел бы как-то встроить все это в файл карты. В XML-файле карты у нас есть области, обозначенные несколькими тегами. Затем будет раздел, в котором указано, где находится NPC на карте, и какие ресурсы и сценарии он будет использовать. Затем будет раздел, где будут определены все битвы (опять же, определение ресурсов, а что нет), а затем, возможно, раздел, где будут определены эти сценарии. Я просто хотел бы иметь возможность компилировать C # на лету с использованием WP7. Если бы я мог получить поддержку с обеих сторон, это не было бы проблемой. Интересно, будет ли какая-либо библиотека Mono, которая могла бы быть перенесена на WP7, которая бы разделяла функциональность CodeDom и всех классов Compiler?

Ответы [ 5 ]

6 голосов
/ 22 августа 2010

XML Scripting !? Вздох! Теперь , что - это то, что "может вызвать проблемы в будущем"!

Почему бы просто не использовать C #? Я слышал, это довольно потрясающе. Я уже высказал свое мнение по этому вопросу .

Вы должны спросить себя: действительно ли ваши сценарии должны управляться данными? Есть ли причина, по которой данные не могут быть выражены с помощью C #?

Действительно ли их нужно интерпретировать во время выполнения? Потому что, если они действительно это делают, то можно сделать с помощью C # .

А вот еще один мой ответ на почти идентичный вопрос , на gamedev.stackexchange.com. Я даже привел небольшой пример возможной реализации.

Если вы хотите, чтобы выполнялись действия, для выполнения которых требуется больше кадра (в основном, сопрограммы), например: «Идите сюда, говорите, ждите, идите туда», вы можете реализовать это с помощью yeild в C # тоже неплохо.


Редактировать: Если вы хотите смешать свои уровни XML и скрипт C #, вот пример того, что я имею в виду:

<Level>
    <Door position="4,4" name="spookyDoor" />
    <Region position="4,2" name="spookyOpener" />
</Level>

А в C #:

public void LevelStart()
{
    this.Regions["spookyOpener"].OnPlayerEnter += () =>
    {
        (this.Items["spookyDoor"] as Door).Open();
    };
}
3 голосов
/ 22 августа 2010

Вы можете рассмотреть возможность встраивания реального языка, такого как Lua , вместо использования синтаксиса XML. Есть причина, почему вы не видите много языков программирования, построенных на фактическом синтаксисе XML! Это действительно неудобно для реальных задач программирования.

0 голосов
/ 12 сентября 2010

Вы также можете рассмотреть библиотеку под названием XNA Debug Terminal в http://www.protohacks.net/xna_debug_terminal. Это позволяет вам выполнять произвольные операторы c # во время выполнения. Он в основном работает как метод Eval () для языков сценариев. Может быть, вместо выполнения действий с использованием сценариев xml, вы можете позволить пользователям создавать сценарии действий на лету, пока игра выполняется с использованием этой библиотеки? Или вы можете использовать его для написания своих собственных действий, чтобы увидеть, что происходит в каждом случае. Одна из специальных команд терминала позволяет вам взять строку, содержащую код на C #, и оценить код. Таким образом, вы можете настроить некоторые предустановленные действия и позволить пользователю выбирать из них. Эти идеи могут не работать в вашем конкретном случае, но я подумал, что я дам вам (и всем, кто читает это) еще несколько вариантов для размышления.

0 голосов
/ 24 августа 2010

Вам обязательно нужно интерпретировать сценарии во время выполнения?Вы говорите, что ваша разработка ориентирована на контент, и это хорошая вещь.Но вам не обязательно нужно интерпретировать ваши сценарии, чтобы воспользоваться преимуществами увеличения скорости и эффективности от использования XML или языка сценариев.

Я следую примеру Шона Харгривза по созданию данных XMLи позволяя Content Pipeline скомпилировать его в .XNB.Если вы реализуете систему сценариев или интегрируете существующую и создаете для нее проект ContentPipeline, вы можете скомпилировать только те сценарии, которые были добавлены или изменены, с очень небольшим временем простоя между запусками по сравнению с перекомпиляцией всей игры.

И я определенно не стал бы использовать XML, XNA может автоматически иметь его импортер, но это будет ужасно, черт возьми, пытаться его использовать. XNUA должен был быть библиотекой lua для XNA, которая должна работать достаточно хорошо для такого рода вещей.

Создание компиляторов для .XNB не так уж и отличается от той чуши, которую выв любом случае мне нужно работать в таких движках, как Source.

Кроме того, я нашел следующее полезное для размышлений о сценариях:
Riverman Media - объектно-ориентированное программирование, система сценариев событий
Брэндон Фуртвенглер - дело первых впечатлений

0 голосов
/ 22 августа 2010

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

Тогда вы можете использовать XPath для ссылки на узлы в вашем документе.

...