我试图通过字符串设置新的屏幕。我可以使用Class.forName(ScreenString),这很酷,但它似乎与函数game.setScreen()有一些问题。
我在这里做的是:
Class<?> temp = null;
if(something) try {
temp = Class.forName("string1"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(something else) try {
temp = Class.forName("string2"));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
game.setScreen(new temp());
但我明显有一些语法问题,因为它告诉我&#34; temp&#34;找不到。 我哪里错了?
答案 0 :(得分:0)
发生了什么:
if (something)
{
game.setScreen(somethingScreen);
}
else if (somethingElse)
{
game.setScreen(somethingElseScreen);
}
无法想办法为什么以你的方式去做。如果您有像“mainScreen”和“optionsScreen”这样的字符串,只需比较语句中的字符串。
如果你以某种方式想要你的方式,你可以试试HashMap<String, Screen>
。
HashMap<String, Screen> map = new HashMap<>();
map.put("string1", new MainScreen);
map.put("String2", new OptionScreen);
if (something)
{
game.setScreen(map.get("string1"));
}
else if (somethingElse)
{
game.setScreen(map.get("string2"));
}
对我来说感觉更自然。
据我所知,如果您有"lvl06"
,则需要加载级别“06”而不是“16”或“01”。所以你在运行前知道什么字符串映射到哪个级别。因此,简单的声明就足以将您的LevelScreens
与Strings
相关联。
答案 1 :(得分:0)
如果你想要一个ScreenClass的实例,你必须在类对象上调用newInstance(),如下所示:
game.setScreen((Screen) temp.newInstance());
答案 2 :(得分:0)
您需要forName
方法的完全限定名称。您无法致电new temp()
。该语法表示您希望类temp
的实例不存在。 temp
是一个变量。如果您的类具有无参数构造函数,则可以使用以下函数对其进行实例化:
Screen screen = temp.newInstance();
如果您需要传递一些参数,请创建一个所有级别都扩展的超类:
public class MyScreen extends Screen {
Game game;
public void init (Game game){
this.game = game;
}
}
现在按名称加载一个级别。请注意,forName
需要完全限定的名称,因此您必须使用软件包名称。
public void loadLevelScreen (String name) {
String packageName = getPackage().getName();
Class<? extends MyScreen> screenClass = null;
try {
screenClass = Class.forName(packageName + "." + name).asSubclass(MyScreen.class);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
MyScreen screen = screenClass.newInstance();
screen.init(this.game);
setScreen(screen);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}