【问题标题】:Implementing a simple XML based Scripting Language for an XNA Game为 XNA 游戏实现简单的基于 XML 的脚本语言
【发布时间】:2010-08-22 04:56:22
【问题描述】:

我正在与一个使用 C# 和 XNA 开发 RPG 引擎的团队合作。我们计划以 Windows 和 Windows Phone 7 为目标,但在过场动画期间遇到了 AI 交互和控制玩家动作的问题。在大多数情况下,一切都是使用 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;
      }
}

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

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

【问题讨论】:

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


    【解决方案1】:

    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();
        };
    }
    

    【讨论】:

    • 我希望它们在运行时被解释,以使引擎更加动态。我们目前的设计是内容驱动的。我曾考虑使用 C# 作为脚本语言,但再一次,WP7 缺乏 CodeDom 和编译器支持,这是理想的情况。我什至看了 Boo 和 Lua。 Reflection.Emit 的问题。感谢您的链接。我会读
    • 你提出了一个有趣的观点。在 XNA/Xbox 360 上,游戏不能被修改或访问外部内容——所以你也可以在那里预编译(这就是我在你的情况下会做的)。但您似乎可以在 WP7 上从 Internet 中提取数据。我的问题是:“更有活力”背后是否有实际的商业案例?您打算通过 Internet 传递内容吗?这会违反微软的内容审批政策吗?您最好通过 MS 批准的更新机制吗? (从技术上讲:如果你继续这样做,是否可以分发预编译的 DLL?)
    • 我自己也一直在想。我们在 Imagine Cup 中,因此希望有一个灵活的引擎来进行比赛。我觉得如果我们能够快速发布内容,这将有助于我们获得优势。这就是我们早期放弃 Xbox 360 的原因。我们需要对动态代码和 Windows Azure 的全面支持,而 XNA 无法在 360 上提供。我想使用 System.Reflection 或 MEF 我可以使用预编译的 DLL,但我不知道 WP7 是否支持它
    • 我还没有完全理解快速发布的必要性。一场比赛通常只有一个“发布”。而且微软已经建立了一个更新机制——所以我不明白建立一个正交会如何让你在评判中获得更多分数。 (我同样感到困惑,为什么使用 Azure 对比赛来说是个好主意?)你真的是指快速开发吗?如果是这样:它只需要在 Windows 上“快速”。只需为 Phone(或 Xbox)直接构建即可。
    • 我想我过于关注最终用户改装和让团队的生活更轻松。比赛分为三轮,在某些轮次中,您有 24 小时的时间为游戏添加功能。我还没有看到任何关于 Microsoft Update 系统的信息,但我认为它会类似于 Xbox XNA 进程。我当然希望不是这样。 Azure 将用于存储游戏存档和其他数据。 (模组等)
    【解决方案2】:

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

    【讨论】:

    • 我完全同意。我能看到的最大问题是 WP7 上缺少 Reflection.Emit。有没有办法在没有 Reflection.Emit 或 Native Interop 的情况下在 .Net 中执行 LUA?
    • 嗯,有 LuaCE(虽然它不是托管的)。 github.com/ynezz/luace/downloads
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      而且我绝对不会选择 XML,XNA 可能会自动为它提供一个导入器,但尝试使用它会很丑陋。 XNUA 应该是 XNA 的 lua 库,应该可以很好地处理这类事情。

      让设计人员编译为 .XNB 与您在 Source 等引擎中所做的废话并没有什么不同。

      此外,我发现以下对于思考脚本事件很有用:
      Riverman Media - Object Oriented Programming, the Scripted Event System
      Brandon Furtwangler - First Impressions Matter

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我很想使用这个库,但我不打算将这个项目授权为 GPL。不过谢谢,这是一个很好的资源:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 2010-09-10
        • 1970-01-01
        • 2017-02-10
        • 2015-12-20
        • 1970-01-01
        相关资源
        最近更新 更多