2013-02-28 177 views
1

我一直試圖在上週解決這個問題,並且似乎無法找到一個既不需要單例也不需要緊耦合的解決方案。 我正在開發一個3D空間遊戲,其中的早期演示是在這裏...
www.sugarspook.com/darkmatters/demo.html
...我正在開始添加任務玩家將能夠從擡頭顯示器(Hud class)中進行選擇。如何避免緊耦合?

遊戲的結構是:
Game類包含Hud和ObjectsList類。
ObjectsList類包含各種遊戲對象,包括玩家,各種船舶,行星和軌道(空間站)。
當玩家進入軌道的某個距離內時,任務被實例化。
任務被添加到一個MissionsList類中,它本身在ObjectsList中。
任務可能變得不可用,並且在沒有警告的情況下過期(就像他們被另一個飛行員選中一樣),因此Hud上顯示的列表是動態的並且會定期更新。
此前我有任務派遣事件直到遊戲,這反過來告訴Hud的變化。這對我來說似乎有點笨拙,因爲Hud有各種更深層次的信息需要傳遞給它。我最終在整個連鎖過程中擁有許多相同的功能。

我正在考慮的解決方案是將對MissionsList類的引用注入Hud,使其能夠偵聽Missonslist的更新。我聽說把事情的狀態和它的顯示混合起來是不好的做法,但是我不知道如何讓「活」的任務清單到達Hud。相比之下,如果Hud僅包含顯示細節而不參考生成這些細節的任務對象,則當玩家從Hud選擇任務時,如何確定選擇了哪個任務? 在這種情況下緊耦合是否正常?或者我應該使用單身人士與Hud溝通? 如果我所建議的任何事情都有根本性的錯誤,歡迎告訴我什麼是什麼,什麼是最好的解決方案。 謝謝。

回答

0

那麼簡單的答案是爲什麼不通過中間接口連接?

interface IMissionList 
{ 
    ObservableCollection<IMission> Missions{get;} 
} 

然後在你的依賴注入綁定,要的東西,可以解析爲實例,單身或恆定或等..

然後把它注射到你的鐵漢的構造

Hud(IMissionList missionList){} 

現在你鬆散地與合同相關聯,執行 - 只要執行遵守合同,就可以隨時更改。而且,由於注入,你的Hud只需要使用IMissionList來關注它自己而不是發現它。

[編輯]抱歉,這是C#,但希望這個想法是有用的。 See for actionscript interfacesDependency Injection for Actionscript

+0

感謝您的回覆。這聽起來很有用,但我不太喜歡'在你的DI ...'部分,對不起。這對一些人來說可能是顯而易見的,但'DI'是什麼?謝謝。 – moosefetcher 2013-02-28 15:12:52

+0

依賴注入。一旦你獲得了燈泡的時刻,它真的很棒。 Google:控制反轉。 Actionscript DI:http://www.adobe.com/devnet/flex/articles/dependency_injection.html – 2013-02-28 15:17:10

+0

再次感謝。我記得前一段時間讀到的。看起來我有更多的閱讀要做。 – moosefetcher 2013-02-28 15:37:30