XML文件中的游戏逻辑

前端之家收集整理的这篇文章主要介绍了XML文件中的游戏逻辑前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在处理游戏对话文件(玩家和不可玩角色之间的对话),其中对话选择及其结果取决于某些条件并导致某些操作。现在,我可以编写一个简单的解析器来处理某种语言来指定前后条件,但我的一个朋友建议使用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是工作的正确工具还是我缺少的东西?

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

我们使用XML文件来定义渤海海盗中的所有静态数据,这是一个很好的方法。使用这样的数据格式,非程序员可以控制数据,并释放程序员处理功能而不是数据输入。将这些数据文件作为文本意味着您可以将它们保留在源代码控制下,以便您可以在何时更改它们。

猜你在找的XML相关文章