【发布时间】: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