【问题标题】:Game Logic in XML FilesXML 文件中的游戏逻辑
【发布时间】:2008-12-17 13:57:23
【问题描述】:

我正在处理游戏对话文件(玩家和不可玩角色之间的对话),其中对话选择及其结果取决于某些条件并导致某些操作。现在,我可以编写一个简单的解析器来处理某种语言来指定前置条件和后置条件,但我的一个朋友建议使用 XML。条件可以存储为对话元素的属性,而选择和动作是内部元素。然后我会使用 eval 函数来解析这些条件和语句(我使用 Ruby 来制作这个游戏)。为了使这种方法更简单,我可以编写一个简单的 GUI 来操作这些文件,而不用担心丑陋的 XML。

但在我看来,处理 XML 文件中的逻辑是一个奇怪的选择。我的理解是 XML 文件是用于存储和交换数据的,而且我总是读到关于人们如何过度使用 XML 来完成各种非设计用途的咆哮。我的朋友们回应说,XML 是如何用于一切的,包括 XHTML 和this bullet description language(这也说明了一些逻辑)。

说实话,使用 XML 对我来说会简化很多事情。编写解析器可能会很痛苦而且很耗时,而且我的要求通常很简单。但是真的可以吗,还是我以后会后悔这样的选择?

对于对细节感兴趣的人,以下是 XML 文件中基本对话交换的样子:

<dialogue id="101" condition="!npc.carsFixed">
  <message>Man, fix my car!</message>
  <choices>
    <choice condition="hero.carFixingSkill > 5" priority="7" id="Sure!">
      <command>hero.carFixingSkills += 1</command>
      <command>npc.carFixed = true</command>
      <command>hero.playSmokeAnimation()</command>
      <command>nextDialogue = 104</command>
    </choice>
    <choice condition="hero.carFixingSkill <= 5" id="I can't...">
      <command>nextDialogue = 105</command>
    </choice>
    <choice id="Fix it yourself">
      <command>npc.likesHero -= 1</command>
    </choice>
  </choices>
</dialogue>

如果用 Ruby 编写,相应的代码将是:

def dialogue101
  if !npc.carsFixed
    showMessage("Man, fix my car!")
    choices = []
    if hero.carFixingSkill > 5
      choices.push(Choice.new("Sure!", 7)) 
    else
      choices.push(Choice.new("I can't"))
    end
    choices.push(Choice.new("Fix it yourself"))
    choices = selectTopPriority(choices) if choices.size > 4
    result = showChoices(choices)
    case result
    when "Sure"
      hero.carFixingSkills += 1
      npc.carFixed = true
      hero.playSmokeAnimation
      dialogue104
    when "I can't"
      dialogue105
    when "Fix it yourself"
      npc.likesHero -= 1
    end
  end
end

likesHero 和 carFixingSkills 是玩家和 NPC 可以拥有的知识片段,在实际实现中可能会存储在哈希中。我发现对话文件方法更灵活,因为我可以制作一个编辑器来轻松编辑对话和条件/动作,并且因为游戏对话树的复杂性。像 Ruby 或 Lua 这样的脚本语言会有所帮助,但它需要复杂的结构来处理这些树的逻辑。

回到最初的问题,XML 是适合这项工作的工具还是我遗漏了什么?

【问题讨论】:

    标签: xml


    【解决方案1】:

    除非您的游戏只有不到六个独特的对话框,否则您绝对应该将这些信息放在某种数据文件中。 XML 是该格式的有力竞争者。我不会说 Ruby,所以在这种情况下它可能不起作用,但另一种选择是直接在 Ruby 代码中将对话框定义为数据。 (我知道这在 Lua、Python 和 Javascript 中会很好地工作......我假设在 Ruby 中定义嵌套数据结构也很容易。)

    我们使用 XML 文件来定义火海海盗中的所有静态数据,这是一个很好的方法。拥有这样的数据格式可以让非程序员控制数据,并让程序员腾出时间来处理功能而不是数据输入。将这些数据文件设为文本意味着您可以将它们置于源代码控制之下,这样您就可以知道它们何时发生变化。

    【讨论】:

      【解决方案2】:

      如果您还没有听说过 YAML,请查看它。它类似于 XML,但 XML 并不是真正要手工编写的——它是一个碰巧是人类可读的机器-机器接口(所以你真的应该为它创建一个编辑器)。 YAML 是人机界面,可写性更高。

      我不会为 DSL 烦恼,YAML 映射完美。

      【讨论】:

      • 我用过 YAML,我同意你关于可读性的观点。我已经将 XML 用于其他数据文件,并且我计划制作一个简单的对话编辑器来读取和编辑 xml 对话,所以我认为这不是问题。
      【解决方案3】:

      DSL 将是梅赛德斯-奔驰对此的实现,并且用 Ruby 编写会很有趣。你是对的,这将需要很多工作,但如果它可能会得到回报 写得很好,这个游戏真的很火。

      如果采用 XML 路由,需要考虑的一件事是您将用于呈现它的解析器/引擎。最后我检查了,REXML 是 Rubyists 在城里唯一的表演。如果您喜欢 REXML,那么 XML 听起来是个不错的选择,但如果您还没有尝试过,我建议您这样做 在做出这个决定之前。我不是在选择 REXML,只是建议你小心一点,因为无论你使用什么,你都将完全依赖这个库。

      【讨论】:

      • 我在这个项目中使用了 REXML,它足以满足我的需求。 libxml (libxml.rubyforge.org) 是我可能考虑的更有效的替代方案。
      【解决方案4】:

      因为您是用 Ruby 编写的,所以我认为用 XML 编写就足够了。这样您就可以制作一个 Web 应用程序,让您可以在任何地方处理对话和游戏逻辑。其他人可以与您合作,或者可能创建用户模组——这总是一个加分项。

      只要您将 XML 文件组织得井井有条(纸上的流程图​​会有所帮助),您就不应该遇到任何问题,甚至可以感谢您自己经历了解析它的痛苦:)

      【讨论】:

        【解决方案5】:

        要获得灵感,甚至可能被采用,请查看 AIML 和 BuddyScript。 AIML 是用于聊天机器人的 XML,BuddyScript 是另一种变体 - 现在归微软所有。

        以下是来自http://www.alicebot.org/aiml.html的AIML示例

        <category>
        <pattern>WHAT ARE YOU</pattern>
        <template>
            <think><set name="topic">Me</set></think> 
            I am the latest result in artificial intelligence,
            which can reproduce the capabilities of the human brain
            with greater speed and accuracy.
        </template>
        

        如果您将 AIML 技术(我认为它是免费的)集成到您的游戏中,您的 NPC 将拥有您的玩家可以与之交谈的 AI。那不是很有趣吗?

        AIML 是模块化的,因此您的所有 NPC 都可以有一个通用文件来描述有关其世界的所有标准知识。然后,您可以为每个种族、班级、地点、个人或任务的典型内容添加特定文件。有很多有趣的示例 AIML 文件,例如 Eliza。

        情境信息,可以在对话开始时添加,并且您可能有一些 AIML 引擎之外的软件监听 NPC 的“魔法”词,表明 NPC 希望在“真实”游戏世界中发生某些事情.比如“***GIVE PLAYER 20 BUFFALO WINGS”。

        【讨论】:

        • 在研究了 AIML 之后,我认为这是一个非常酷的想法,尽管对我的游戏来说可能有点矫枉过正。我不喜欢共享知识 (Oblivion),而且定制是针对每个人的,因此使用这样的系统需要做太多工作。
        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 2017-08-15
        相关资源
        最近更新 更多