我正在处理游戏对话文件(玩家和不可玩角色之间的对话),其中对话选择及其结果取决于某些条件并导致某些动作.现在,我可以编写一个简单的解析器来处理某种语言来指定前置条件和后置条件,但是我的一个朋友建议使用XML.条件可以存储为对话元素的属性,选择和动作是内部元素.然后我使用eval函数来解析这些条件和语句(我使用Ruby来制作这个游戏).为了使这种方法更简单,我可以编写一个简单的GUI来操作这些文件而不必担心丑陋的XML.
但它让我觉得在XML文件中处理逻辑是一个奇怪的选择.我的理解是XML文件用于存储和交换数据,我总是阅读关于人们如何过度使用XML以获取其不适合的各种事物的咆哮.我的朋友们回应说明XML是如何用于所有事情的,包括XHTML和这种子弹描述语言(这也说明了一些逻辑).
说实话,使用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>
Run Code Online (Sandbox Code Playgroud)
如果用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
Run Code Online (Sandbox Code Playgroud)
像likesHero和carFixingSkills这样的东西是知识块播放器和NPC可以拥有的,它们可能存储在实际实现中的散列中.我发现对话文件方法更灵活,因为我可以使编辑器轻松编辑对话和条件/操作,并且因为游戏对话树的复杂性.像Ruby或Lua这样的脚本语言有所帮助,但它需要复杂的结构来处理这些树的逻辑.
回到最初的问题,XML是适合工作的正确工具还是我错过了什么?
除非您的游戏只有不到六个独特的对话框,否则您应该将此信息放在某种数据文件中.XML是该格式的有力竞争者.我不会说Ruby,所以在这种情况下它可能不起作用,但另一种选择是直接在Ruby代码中将对话框定义为数据.(我知道这在Lua,Python和Javascript中会很好用......我假设在Ruby中定义嵌套数据结构也很容易.)
我们使用XML文件来定义"燃烧海盗"中的所有静态数据,这是一个很好的方法.拥有这样的数据格式可以让非程序员控制数据并释放程序员来处理功能而不是数据输入.将这些数据文件设置为文本意味着您可以将它们保持在源代码控制之下,以便了解它们何时发生更改.
如果您还没有听说过YAML,请看一下.它就像XML,但XML实际上并不是手工编写的 - 它是一个机器人界面,恰好是人类可读的(所以你真的应该为它创建一个编辑器).YAML是一个人机界面,更加可写.
我不打算使用DSL,YAML地图完美无缺.
| 归档时间: |
|
| 查看次数: |
13491 次 |
| 最近记录: |