2013-05-11 26 views
1

我使用Akka框架和jMonkeyEngine(jME3)一起用於我的小型Scala/java遊戲。通過調整一些Akka dispatcher magic我設法在jME3的主循環線程所在的同一線程中運行一個專用的actor。爲了讓演員能夠訪問SimpleApplication類的受保護變量,我們應該擴展這個變量以創建一個帶有jME3的遊戲,我認爲創建一個繼承類SimpleApplication並混合性能演員的類將會很整潔。事情是這樣的:與Akka混合演員特質與基類碰撞

JmeActor extends SimpleApplication with Actor 

的問題是,無論SimpleApplication和演員有背景變量,衝突起來。目前,我已將SimpleApplication的上下文變量重命名爲jmeContext並重新編譯了jME3。結果工作得很好,但設計似乎打破了我,因爲任何進一步發佈的jME3(或Akka甚至)將需要我再次手動重新進行此重構。甚至有可能,儘管可能不太可能,開發團隊進一步修改了SimpleApplication,使得這種衝突避免技術變得更加困難。

任何人都可以看到一個簡單的解決方案呢?

+1

爲什麼組成不工作? – 2013-05-11 13:13:08

+0

你的意思是創建一個演員作爲JmeActor的一個字段,而不是與Actor混合?你將如何設置這個actor的接收函數來訪問JmeActor的私有字段?這對你來說可能是微不足道的,但現在我不清楚這一點。 – gsimard 2013-05-11 13:40:33

+0

不,我的意思是讓JMEActor擴展Actor,但是在其中有一個SimpleApplication字段。然後這個actor接收消息並調用SimpleApplication上的方法。 – 2013-05-11 16:01:42

回答

1

我的直覺表明,將一個Actor實例與這樣一個豐富的類作爲一個遊戲引擎的「主」類交織在一起可能不是一個好的設計選擇。我建議繼承SimpleApplication,這樣您需要的所有功能都通過公共方法公開,然後在演員中保留對此的引用;我的猜測是你希望能夠通過向演員發送消息來影響遊戲引擎,因此啓用了演員。

+0

事實上,與Actor混合的一點是避免通過公共方法暴露受保護的字段,這不僅因爲它是如此繁瑣,而且因爲封裝將會中斷,除非非常小心。 – gsimard 2013-05-11 14:30:31

+1

無論訪問修飾符如何表示,封裝在actor中都是完美的,因爲沒有其他代碼可以通過發送消息來調用方法或訪問actor的字段。另一方面,繼承讓你無法選擇。演員/應用程序的生命週期,並且必須非常小心,SimpleApplication不會暴露給其他線程,這會破壞actor模型。我認爲我的答案歸結爲「jME設計得很差,因爲它強制繼承」。 – 2013-05-11 17:53:27