2010-08-22 7 views
1

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

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

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

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

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

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

ответ

0

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

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

3

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

+0

Я полностью согласен. Самая большая проблема, которую я могу увидеть, - это отсутствие Reflection.Emit на WP7. Есть ли способ сделать LUA в .Net без Reflection.Emit или Native Interop? –

+0

Ну, есть LuaCE (хотя он не управляется). http://github.com/ynezz/luace/downloads – ctacke

6

XML Scripting !? Гасп!что - это то, что «может вызвать проблемы по линии»!

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

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

Действительно ли они должны интерпретироваться во время работы? Потому что, если они действительно так делают, то can be done with C#.

И вот еще answer of mine to an almost identical question, на gamedev.stackexchange.com. Я даже привел небольшой пример возможной реализации.

Если вы хотите иметь действия, которые выполняются больше, чем кадр (в основном, совместные процедуры), например: «Пройдите сюда, поговорите, подождите, пройдите туда», вы также можете implement this with yeild in C# тоже хорошо.


Edit: Если вы хотите, чтобы смешивать уровни 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(); 
    }; 
} 
+0

Я бы хотел, чтобы они были интерпретированы в Runtime, чтобы позволить двигателю быть более динамичным. Наш текущий дизайн ориентирован на контент. Я рассматривал использование C# в качестве языка сценариев, но еще раз, WP7 не имеет поддержки CodeDom и Compiler, что и было бы идеальным. Я даже посмотрел на Бу и Лую. Проблемы с Reflection.Emit там. Спасибо за ссылки. Я прочитаю –

+0

Вы поднимаете интересный момент. На XNA/Xbox 360 игры нельзя изменить или получить доступ к внешнему контенту - так что вы можете также предварительно скомпилировать его (это то, что я сделал бы в вашей ситуации). Но, похоже, вы * можете * извлекать данные из Интернета на WP7. Мой вопрос: есть ли реальное деловое дело «немного более динамично»? Вы собираетесь предоставлять контент через Интернет? Повлияет ли это на политику одобрения Microsoft? Не могли бы вы пройти через одобренный MS механизм обновления? (И технически: если вы продолжите это, можно ли распространять предварительно скомпилированные библиотеки DLL?) –

+0

Я сам это задавался. Мы находимся в Кубке Imagine, и поэтому хотим иметь гибкий двигатель для соревнований. Я чувствую, что это поможет нам получить преимущество, если мы сможем быстро освободить контент. Именно по этой причине мы рано отказались от XBox 360. Нам нужна полная поддержка динамического кода и Windows Azure, а XNA не может предоставить это на 360. Я полагаю, что с помощью System.Reflection или MEF я мог бы использовать предварительно скомпилированные библиотеки DLL, но я не знаю, будет ли это поддерживаться на WP7 –

0

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

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

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

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

Кроме того, я нашел следующее полезно думать о скриптовых событий:
Riverman Media - Object Oriented Programming, the Scripted Event System
Brandon Furtwangler - First Impressions Matter

0

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

+0

Я хотел бы использовать эту библиотеку, но я не планирую лицензировать этот проект как GPL. Спасибо, хотя это отличный ресурс :) –