我正在處理遊戲對話文件(玩家與非玩遊戲角色之間的對話),對話選擇及其結果取決於某些條件並導致某些操作。現在,我可以編寫一個簡單的解析器來處理指定前置條件和後置條件的某種語言,但我的一位朋友建議使用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