2008-12-16 105 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