1

我正在与一个使用 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 类的功能?

4

5 回答 5

6

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

为什么不直接使用 C#?听说很厉害 我已经对这件事发表了我的看法

您需要问自己:您的脚本真的需要数据驱动吗?是否有无法使用 C# 表达数据的原因?

他们真的需要在运行时解释吗?因为,如果他们真的这样做,那可以用 C# 来完成

这是我在 gamedev.stackexchange.com 上对一个几乎相同的问题的另一个答案。我什至在其中放了一个可能实现的小例子。

如果您想要执行超过一帧的操作(基本上是协同例程),例如:“走在这里,说话,等待,走过去”,您也可以在 C# 中很好地实现这一点yeild


编辑:如果你想混合你的 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();
    };
}
于 2010-08-22T05:46:23.667 回答
3

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

于 2010-08-22T05:22:31.567 回答
0

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

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

于 2010-08-22T05:17:30.630 回答
0

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

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

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

无论如何,让设计人员编译为 .XNB 与您在像 Source 这样的引擎中必须做的废话并没有什么不同。

此外,我发现以下对于思考脚本事件很有用:
Riverman Media - 面向对象编程,脚本事件系统
Brandon Furtwangler - 第一印象很重要

于 2010-08-24T06:44:15.490 回答
0

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

于 2010-09-11T21:26:42.043 回答