2010-08-22 46 views
1

我正在與C#和XNA的RPG引擎上的團隊合作。我們正在計劃針對Windows和Windows Phone 7,但在過場動畫中遇到人工智能交互和控制玩家操作的問題。大多數情況下,使用MVC設計模式提取所有內容,但是將所有邏輯和運動抽象爲控制器可能會導致問題。所以這個想法是有一個接口(IScriptEngine),它接受一個I​​ScriptObject並相應地更新地圖模型中的數據。 我還想着把腳本的XML語法排序的:爲XNA遊戲實現簡單的基於XML的腳本語言

<Script Name="MoveNPC_1"> 
    <Action Command="MoveToTile" Target="NPC_1" Value="10,2"/> 
</Script> 

,並有相應IScriptEngine解析它。我非常懷疑在一個巨大的switch語句中解析會是一個好主意,但這正是我一直在努力的。

switch(Action.Command) 
{ 
    case "MoveToTile": 
     { 
     doMovement(Action.Value, Action.Target); 
     break; 
     } 
} 

即使我的高中編程經驗告訴我,這是一個壞主意,但我想不出任何其他方式。

編輯: 我想以某種方式將此全部內容嵌入到地圖文件中。在地圖XML文件中,我們有指定的區域,其中包含多個標記。然後會有一個部分,指定NPC在地圖上的位置,以及它將使用的資源和腳本。然後會有一個部分,所有的戰鬥都將被定義(再次,定義資源和不是什麼),然後可能是一個部分,這些腳本將被定義。我只是希望有一種方法可以使用WP7即時編譯C#。如果我能得到雙方的支持,這不會是一個問題。我想知道是否有任何Mono庫可以移植到WP7中,以共享CodeDom和所有Compiler類的功能?

回答

0

您可以使用現有的XML解析器,有很多不同的方式來執行它(SAX,StAX)和可用於多種語言的解析器。

然後,您可以使用XPath引用文檔中的節點。

3

您可能希望考慮嵌入真實語言,如Lua而不是使用XML語法。有一個原因讓你沒有看到許多基於實際XML語法構建的編程語言!對於實際的編程任務來說真的很尷尬。

+0

我完全同意。我能看到的最大問題是缺少WP7上的Reflection.Emit。在沒有Reflection.Emit或Native Interop的情況下,有沒有辦法在.Net中執行LUA? – 2010-08-22 05:32:47

+0

那裏有LuaCE(儘管它沒有管理)。 http://github.com/ynezz/luace/downloads – ctacke 2010-09-12 12:31:30

6

XML腳本!? 喘氣!現在是「可能導致問題」的東西!

爲什麼不直接使用C#?我聽說它非常棒。我已經給了我的opinion on this matter

你需要問自己:你的腳本真的需要數據驅動嗎?數據無法用C#表達的原因是什麼?

他們真的需要在運行時解釋嗎?因爲,如果他們真的這樣做,那can be done with C#

這是另一個answer of mine to an almost identical question,在gamedev.stackexchange.com上。我甚至在那裏舉了一個可能實現的例子。

如果你想要執行的動作多於一個框架來執行(基本上是協同例程),例如:「走過這裏,說話,等待,在那邊走」,你也可以合理地做到這一點。


編輯:如果你想混用你的XML水平,和C#腳本,這裏是我的意思的例子:

<Level> 
    <Door position="4,4" name="spookyDoor" /> 
    <Region position="4,2" name="spookyOpener" /> 
</Level> 

而在C#:

public void LevelStart() 
{ 
    this.Regions["spookyOpener"].OnPlayerEnter +=() => 
    { 
     (this.Items["spookyDoor"] as Door).Open(); 
    }; 
} 
+0

我希望他們能夠在運行時進行解釋,以使引擎更具動態性。我們目前的設計是內容驅動。我着眼於使用C#作爲腳本語言,但再一次,WP7缺少CodeDom和編譯器支持,這是理想的選擇。我甚至看着Boo和Lua。問題與思考。在那裏放棄。感謝您的鏈接。我會讀起來 – 2010-08-22 05:51:44

+0

你提出一個有趣的觀點。在XNA/Xbox 360遊戲中,無法修改或訪問外部內容 - 因此無論如何您都可以進行預編譯(這是我在您的情況下會執行的操作)。但你似乎可以從WP7的互聯網上獲取數據。我的問題是:是否有一個「更有活力」的實際商業案例?您是否打算通過互聯網提供內容?這會違反微軟的內容審批政策嗎?你最好通過MS批准的更新機制嗎? (從技術上講:如果你繼續這樣做,是否有可能分發預編譯的DLL?) – 2010-08-22 07:19:45

+0

我一直在想我自己。我們參加了Imagine Cup,因此我們希望有一個靈活的引擎來參加比賽。如果我們能夠快速發佈內容,我覺得它會給我們帶來優勢。這就是我們早期放棄XBox 360的原因。我們需要完全支持動態代碼和Windows Azure,並且XNA無法在360上提供這個功能。我想用System.Reflection或MEF我可以使用預編譯的DLL,但是我不知道WP7是否支持這種DLL – 2010-08-22 07:29:15

0

您是否需要在運行時解釋腳本?你說你的開發是內容驅動的,這是一件好事。但是,爲了利用XML或腳本語言提高速度和效率,您不一定需要解釋腳本。

我遵循Shawn Hargreaves創建XML數據並允許Content Pipeline將其編譯到.XNB的示例。如果您實施腳本系統或集成現有的併爲其構建ContentPipeline項目,則可以僅編譯已添加或修改的腳本,與重新編譯整個遊戲期間相比,運行期間的停機時間非常短。

而且我肯定不會去尋找XML,XNA可能會自動爲它提供一個導入器,但它會像試圖使用它一樣醜陋。 XNUA應該是XNA的lua庫,它應該可以適用於這類事情。

讓設計師編譯成.XNB並不像你在Source這樣的引擎中要做的那些不同。

而且,我發現下面的有用的思考腳本事件:
Riverman Media - Object Oriented Programming, the Scripted Event System
Brandon Furtwangler - First Impressions Matter

0

您也可以考慮一個名爲XNA調試終端在http://www.protohacks.net/xna_debug_terminal庫。 這允許您在運行時執行任意的c#語句。它基本上像腳本語言的Eval()方法一樣工作。也許不用製作xml腳本動作,你可以允許用戶在遊戲運行時使用這個庫來動態編寫動作腳本?或者你可以用它來編寫你自己的動作,看看每種情況下會發生什麼。其中一個特殊的終端命令允許您接收包含c#代碼並評估代碼的字符串。因此,您可以設置一些預設操作並讓用戶從中選擇。 這些想法可能不適合你的特定情況,但只是想我會給你(和其他人閱讀這個)一些更多的選擇來思考。

+0

我很樂意使用這個庫,但我不打算將此項目授權爲GPL。謝謝,這是一個很好的資源:) – 2010-09-14 16:41:40