2008-12-16 84 views
21

我正在处理游戏对话文件(玩家与非玩游戏角色之间的对话),对话选择及其结果取决于某些条件并导致某些操作。现在,我可以编写一个简单的解析器来处理指定前置条件和后置条件的某种语言,但我的一位朋友建议使用XML。条件可以存储为对话元素的属性,选项和动作是内部元素。然后,我会使用一个eval函数来解析这些条件和语句(我使用Ruby来制作这个游戏)。为了简化这种方法,我可以编写一个简单的GUI来操作这些文件,而不用担心丑陋的XML。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是适合工作的正确工具,还是我错过了什么?

回答

8

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

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

+0

关于源代码控制的好处,我没有想到。 – 2008-12-20 23:10:14

1

一个DSL将是一个梅赛德斯 - 奔驰的实现,这将是有趣的写在Ruby中。你是对的,这将需要很多工作,但它可能会回报,如果它 写得很好,这场比赛真正起飞。

如果要走XML路线,需要考虑的一件事是您将用于呈现它的解析器/引擎。最后我检查了一下,REXML是 这是鲁宾逊镇唯一的展览。如果你喜欢REXML,那么XML听起来像是一个很好的选择,但如果你还没有尝试过,我会建议在做出这个决定之前先做 。我不是选择REXML,只是建议一点小心,因为无论你使用什么,你都完全依赖这个库。

+0

我在这个项目中使用REXML,它足够满足我的需求。 libxml(http://libxml.rubyforge.org/)是我可能考虑的更有效的替代方案。 – 2008-12-20 23:13:45

1

因为你在用Ruby写这篇文章,我认为用XML做它应该就足够了。这样你就可以创建一个Web应用程序,让你可以在任何地方处理对话和游戏逻辑。其他人可以与您协作,或者可能创建用户修改 - 这总是一个优点。

只要你保持你的XML文件良好的组织(在纸上流程图将帮助),你不应该遇到任何问题,甚至可能会感谢自己通过分析它:)

1

要的疼痛会获得灵感,或者甚至可以采用,看看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希望在“真实”游戏中发生某些事情世界。例如“*** GIVE PLAYER 20 BUFFALO WINGS”。

+0

看着AIML后,我认为这是一个非常酷的想法,虽然可能是我的游戏矫枉过正。我不是一个共享知识(遗忘)的粉丝,定制是每个人的,所以它会花费太多的工作与这样一个系统。 – 2008-12-20 23:17:43

5

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

我不打扰DSL,YAML地图完美。

+1

我已经使用了YAML,我同意你的可读性。我已经将XML用于其他数据文件,并且我计划使用简单的对话编辑器来阅读和编辑xml对话框,所以我不认为这会是一个问题。 – 2008-12-20 23:20:04