首页 文章

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

提问于
浏览
1

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

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

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

5 回答

  • 6

    XML脚本!? Gasp! 现在这是"could cause issues down the line"!

    为什么不使用C#?我听说's pretty terrific. I'已经给了我opinion on this matter .

    你需要问自己:你的脚本真的需要数据驱动吗?有没有理由不能用C#表示数据?

    他们真的需要在运行时解释吗?因为,如果他们真的那么做,那就是can be done with C# .

    这是gamedev.stackexchange.com上的另一个answer of mine to an almost identical question . 我甚至在那里举了一个可能实现的例子 .

    如果你想要执行多于一帧执行的操作(基本上是协同例程),例如:"Walk over here, Talk, Wait, Walk over there",你也可以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

    您可能希望考虑嵌入诸如Lua之类的真实语言,而不是使用XML语法 . 有很多编程语言都是基于实际的XML语法构建的!实际的编程任务真的很尴尬 .

  • 0

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

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

  • 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

  • 3

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

相关问题