【发布时间】:2015-04-14 20:59:32
【问题描述】:
请原谅我糟糕的术语!
我一直在为一个问题苦苦挣扎。
我正在用 java 制作一个游戏引擎,但我经常遇到同样的问题。我有这个类层次结构:
父母 -> 孩子 -> 孙子
PARENT 拥有和构造 CHILD 等等。
现在,父级可以执行 CHILD 和 GRANDCHILD 在执行期间需要执行的操作。假设 GRANDCHILD 是 GUI 中的一个按钮,而 PARENT 是游戏的核心。如果按下按钮,我想暂停游戏。 button/GRANDCHILD 本身没有办法做到这一点,但需要通过 PARENT/CORE 做到这一点。
父母 --> 孩子 --> 孙子 +暂停游戏()+做某事()
这个问题我有三个解决方案,没有一个让我满意。
- 返回值。 PARENT/GAME-CORE感觉鼠标被按下了,叫CHILD,它叫GRANDCHILD。 GRANDCHILD 承认它已被按下并将一个 int 或枚举返回给 PARENT/CORE。 PARENT/CORE 使用 case/if-else 来确定需要做什么。
PARENT int:click()--> CHILD int:click() --> GRANCHILD int:click()
父母的功能
switch(CHILD.click(){
case 1 do this;
case 2: do that;
etc.
}
这是我最讨厌的解决方案。我不仅需要跟踪整数/枚举,而且当我可以使用多态来获得更清晰的代码时,我还需要使用 switch/if-else。
-
我认为这种方法称为回调。在构造时,PARENT 会发送一个内部类/一组函数,这些函数会传递给 GRANDCHILD 的构造函数。 GRANDCHILD 保存这个内部类实例并在需要时调用它的方法。
类家长{
儿童;
父母(){ 孩子=新孩子(新控制器); }
类控制器{
公共无效点击(){ 做东西... }
}
}
这没问题,但感觉不对。 gamecore 可能有数百个 CHILDREN,这意味着数百个内部类,这些函数可能或多或少地做同样的事情。随着游戏的发展,课程将变得庞大。这也会在层次结构中产生循环,我有一种不好的感觉。
- 我认为这称为“服务”。 PARENT/GAMECORE 是公开的。任何类都可以调用它的方法。好吧,在这种情况下:PARENT->CHILD->GRANDCHILD,PARENT 和 CHILD 都需要公开,因为 GRANDCHILD 需要 CHILD 的方法和 PARENTS。这感觉不太好。
如果只有少数几个需要可访问的类,我可以忍受这一点。问题是我几乎一直需要所有人的相互交流!
那我该怎么办?我是否遗漏了什么?如果没有,以上哪项是最佳做法,并且可以让我免于未来的头痛?
【问题讨论】:
标签: java game-engine