我正在处理游戏对话文件(玩家与非玩游戏角色之间的对话),对话选择及其结果取决于某些条件并导致某些操作。现在,我可以编写一个简单的解析器来处理指定前置条件和后置条件的某种语言,但我的一位朋友建议使用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是适合工作的正确工具,还是我错过了什么?
关于源代码控制的好处,我没有想到。 – 2008-12-20 23:10:14