2012-04-15 45 views
0

我正在製作一款遊戲,而且我是一名遊戲內編輯,能夠即時創建實體(而不是硬編碼它們)。我正在使用組件聚合模型,所以我的實體只是一個組件列表。實體編輯器 - 如何動態生成組件列表?

什麼是獲取或生成組件列表的最佳方式?我真的不想在一些巨大的registerAllComponents()方法中手動添加所有可能組件的條目。

我想也許以某種方式反射通過知識,即所有組件繼承自基礎組件類,或可能通過自定義元標籤,但我一直無法找到方法來獲取所有類的派生列表一個或所有具有自定義元標記的類。

我還有什麼樣的選擇?

謝謝。

回答

0

對於我曾經做過的項目,我們使用ruby腳本生成一個AS文件,其中包含對某個包中所有類的引用(確保它們包含在編譯中)。考慮到flash只允許與它所在的文件具有相同名稱的類,因此很容易,所以不需要解析實際的代碼。

爲了讓以後使用的工廠類能夠爲詞典(或類似的東西)添加一個條目也是微不足道的。

我相信可以在編譯之前執行一個程序(至少在flashdevelop中),所以它不會添加任何手動工作。

編輯:我添加了一個基本的FlashDevelop項目來演示。它需要你安裝ruby。 http://dl.dropbox.com/u/340238/share/AutoGen.zip

+0

這看起來像是Torious想法的自動化版本,非常完美。謝謝!我將不得不考慮如何讓FlashDevelop在編譯之前運行它。 – Bruce 2012-04-15 17:59:00

+0

您可以在項目屬性 - >編譯 - >預生成命令行下找到它。它在我的示例項目中也是如此:) – 2012-04-15 18:16:53

0

不幸的是,現在沒有適當的方式來獲取所有加載的類或類似的Flash API。因此,找到Component的所有子類都已排除,檢查所有類的特定元標記也已排除。

前一段時間,我遇到了一個類/函數,它在加載時檢查SWF自己的字節碼以檢索所有包含的類。這是這種事情的唯一選擇。見this link和我的帖子的底部。

所以,你必須指定一個組件類的列表來選擇。

想到的一個過於複雜/不可行的選項是創建一個外部工具來搜索源文件夾,解析AS3代碼並確定所有子類Component,最後在某個XML文件中生成一個列表。但是,這不是爲膽小一個任務...

你或許可以想到有一堆手動解決自己的,但一個方法是保持可訪問ArrayVector.<Class>的地方,例如:

public static const COMPONENT_LIST:Vector.<Class> = Vector.<Class>([ 
    CollisionComponent, 
    VisualComponent, 
    StatsComponent, 
    ... 
    ... 
]); 

例如,保留String名稱列表的一個優點是組件類將保證被編譯到SWF中。

如果這些類未在代碼中的其他任何地方顯式引用,則它們不會被編譯。這可能發生在一個簡單的組件上,每個框架只有update()一次,並且只能由某個XML文件中的字符串指定。

澄清:你可以使用代碼在上面的鏈接來獲取所有加載的類的名稱列表,然後使用getDefinitionByName(className)爲他們每個人,然後到describeType(classObj)調用獲得的XML描述每種類型。然後,解析這個類型的超類型,你可以確定它是否擴展爲Component我個人只會硬編碼一個列表,我覺得在啓動時檢查所有已加載的類都太麻煩了,但這取決於你。

+0

感謝您的幫助。我只是因爲它是你的建議的自動化版本而與Jonatan的答案一起去的。不過謝謝。 – Bruce 2012-04-15 17:59:24