我希望创建一个SceneManager类来提供对单个活动场景的有限控制,方法包括setActiveScene(Scenes newScene) (其中Scenes是一个枚举)、updateScene(double time) (包装活动Scene的更新方法)和getActiveScene() (检索活动场景的某些组件)。希望只有SceneManager可以创建新的场景,并且添加新的可能场景就像向Scenes枚举中添加要实例化的类一样简单。我得到的是这样的东西:
public class SceneManager {
private static Scene activeScene = null;
private static void setActiveScene(Scenes newScene) {
activeScene = newScene.load();
}
public enum Scenes {
START(new StartScene()), MENU(new MenuScene());
private final Scene scene;
Scenes(Scene scene) {
this.scene = scene;
}
protected Scene load() { return scene; }
}
}它在某种程度上起作用了,除了我需要Scene只在它被设置的时候初始化。此设置会立即初始化所有场景,但这将不起作用。我希望找到一个比switch语句更干净的解决方案,但我不确定现在还能如何让它工作。我试着在Constructor上乱搞,但那比开关更乱,而且效率可能也低得多。
发布于 2021-07-14 07:00:42
有两个选项:
不要在它们的构造函数中初始化场景,而是使用init方法:
interface Scene {
void init();
...
}
...
private static void setActiveScene(Scenes newScene) {
activeScene = newScene.load();
activeScene.init();
}不要在初始化enum时创建场景,只有在加载时才会创建:
public enum Scenes {
START(StartScene.class), MENU(MenuScene.class);
private final Class<Scene> sceneClass;
...
protected Scene load() {
try {
return sceneClass.getDeclaredConstructor().newInstance();
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}https://stackoverflow.com/questions/68369749
复制相似问题