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

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

我正在与一个团队合作使用 C# 和 XNA 开发 RPG 引擎。我们计划以 Windows 和 Windows Phone 7 为目标,但在过场动画期间遇到了 AI 交互和控制玩家 Action 的问题。大多数情况下,一切都是使用 MVC 设计模式提取的,但是将所有逻辑和移动抽象到 Controller 中可能会导致问题。因此,我们的想法是拥有一个接口(interface) (IScriptEngine),该接口(interface)采用 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 和所有编译器类的功能?

最佳答案

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

为什么不直接使用 C#?我听说这非常棒。我已经给了我的 opinion on this matter

您需要问问自己:您的脚本真的需要数据驱动吗?有什么理由不能用C#表达数据吗?

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

这是 gamedev.stackexchange.com 上的另一个 answer of mine to an almost identical question。我什至在其中放了一个可能的实现示例。

如果你想要执行的 Action 超过一帧(基本上是协同例程),例如:“走到这里,说话,等待,走到那边”,你也可以相当好地 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();
    };
}

关于windows - 为 XNA 游戏实现基于 XML 的简单脚本语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540231/

相关文章:

windows - 如何从角色中找出语言?

jquery - 我如何在 JQuery 中解析这个 JSON 对象?

c - Windows Makefile c mkdir -p $@

parsing - 尝试使用 Golang 在命令行上解析标准输出

python - 类型错误 : string indices must be integers while parsing JSON using Python?

xna - 在 XNA for Windows Phone 7 中绘制贝塞尔曲线路径

xna - 圆和线段之间的碰撞处理

c# - PCM波形数据可视化

c++ - 清理代码的正确方法是什么?

python - 在 python 中从标准输入读取时管道文件描述符错误