2013-05-11 62 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