代码之家  ›  专栏  ›  技术社区  ›  Firas Assaad

XML文件中的游戏逻辑

xml
  •  22
  • Firas Assaad  · 技术社区  · 17 年前

    我正在处理游戏对话文件(玩家和不可玩角色之间的对话),其中对话选择及其结果取决于某些条件并导致某些动作。现在,我可以编写一个简单的解析器来处理某种语言来指定前置和后置条件,但我的一个朋友建议使用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
    

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

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

    5 回复  |  直到 17 年前
        1
  •  8
  •   Joe Ludwig    17 年前

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

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

        2
  •  5
  •   Bill K    17 年前

    如果你还没有听说过YAML,那就看看它。它就像XML,但XML并不是真正为手工编写的——它是一个机器-机器界面,恰好是人类可读的(所以你真的应该为它创建一个编辑器)。YAML是一个人机界面,可写性更高。

    我不会费心使用DSL,YAML映射非常完美。

        3
  •  1
  •   Andrew Cowenhoven    17 年前

    DSL将是梅赛德斯-奔驰的实现,用Ruby编写会很有趣。你说得对,这需要付出很多努力,但如果这样做,可能会得到回报 写得很好,这款游戏真的很受欢迎。

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

        4
  •  1
  •   Jelani Harris    17 年前

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

    只要你把XML文件组织得很好(纸上的流程图会有所帮助),你就不会遇到任何问题,甚至可能会感谢自己经历了解析它的痛苦:)

        5
  •  1
  •   Guge    17 年前

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

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

    <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希望在“真实”游戏世界中发生一些事情。比如“***给球员20只水牛翅膀”。