为XNA游戏实现简单的基于XML的脚本语言

时间:2010-08-22 04:56:23

标签: windows parsing xna windows-phone-7 scripting-language

我正在与C#和XNA的RPG引擎团队合作。我们计划针对Windows和Windows Phone 7进行定位,但遇到人工智能交互问题并在过场动画期间控制玩家行为。在大多数情况下,使用MVC设计模式提取所有内容,但将所有逻辑和移动抽象到控制器中可能会导致问题。因此,我们的想法是拥有一个接口(IScriptEngine),它接受一个I​​ScriptObject并相应地更新地图模型中的数据。 我正在考虑将这些脚本放在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;
      }
}

即使我的高中编程经验告诉我这是一个坏主意,但我想不出任何其他方式。

编辑: 我想以某种方式将这一切嵌入到地图文件中。在地图XML文件中,我们指定了包含多个标记的区域。然后会有一个部分,指定NPC在地图上的位置,以及它将使用哪些资源和脚本。然后会有一个部分,其中将定义所有战斗(再次,定义资源和不是什么),然后可能是一个部分,其中将定义这些脚本。我只是希望有一种方法可以使用WP7动态编译C#。如果我能得到双方的支持,这不会是一个问题。我想知道是否有任何可以移植到WP7的Mono库可以共享CodeDom和所有Compiler类的功能?

5 个答案:

答案 0 :(得分:6)

XML脚本!? 喘气!现在 是“可能导致问题的原因”!

为什么不使用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#相当好也是。


编辑:如果你想混合你的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();
    };
}

答案 1 :(得分:3)

您可能希望考虑嵌入真实语言,例如Lua,而不是使用XML语法。有一个原因,你没有看到许多编程语言建立在实际的XML语法之上!对于实际的编程任务来说真的很尴尬。

答案 2 :(得分:0)

您可以使用现有的XML解析器,有很多不同的方法(SAX,StAX)和解析器可用于多种语言。

然后,您可以使用XPath引用文档中的节点。

答案 3 :(得分:0)

您是否需要在运行时解释脚本?你说你的开发是内容驱动的,这是一件好事。但是,您不一定需要解释脚本,以便利用使用XML或脚本语言提高速度和效率。

我正在关注Shawn Hargreaves创建XML数据并允许Content Pipeline将其编译为.XNB的示例。如果您实现脚本系统或集成现有脚本并为其创建ContentPipeline项目,则只需编译添加或修改的脚本,与重新编译整个游戏相比,运行之间的停机时间非常短。

我绝对不会选择XML,XNA可能会自动拥有一个导入器,但是它会变得难看,因为他会试图使用它。 XNUA应该是XNA的lua库,应该可以很好地处理这类事情。

让设计师编译成.XNB与你在Source之类的引擎中所做的废话并没有什么不同。

此外,我发现以下内容对于编写​​脚本事件非常有用:
Riverman Media - Object Oriented Programming, the Scripted Event System
Brandon Furtwangler - First Impressions Matter

答案 4 :(得分:0)

您还可以在http://www.protohacks.net/xna_debug_terminal考虑​​名为XNA Debug Terminal的库。 这允许您在运行时执行任意c#语句。它基本上像脚本语言的Eval()方法一样工作。也许不是制作xml脚本操作,而是允许用户在使用此库运行游戏时动态编写脚本?或者您可以使用它编写自己的操作脚本,以查看每种情况下会发生什么。其中一个特殊的终端命令允许您获取包含c#代码的字符串并评估代码。因此,您可以设置一些预设操作,并让用户从中进行选择。 这些想法可能不适用于您的特定情况,但只是想我会给您(以及其他任何阅读此内容的人)更多选择。