libgdx Screen - 如何通过字符串设置新的 Screen
libgdx Screen - How to set a new Screen by a String
我正在尝试通过字符串设置新屏幕。我可以使用 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());
但我显然有一些语法问题,因为它告诉我 "temp" 没有找到。
我哪里错了?
发生了什么:
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”。所以你在运行前就知道什么字符串映射到哪个级别。所以一个简单的语句就足以 link 你的 LevelScreens
到 Strings
.
如果你想要一个屏幕实例Class,你必须像这样在 Class 对象上调用 newInstance():
game.setScreen((Screen) temp.newInstance());
您需要 forName
方法的完全限定名称。你不能打电话给 new temp()
。该语法表示您想要 class temp
的一个不存在的实例。 temp
是一个变量。如果你的 class 有一个无参数的构造函数,你可以实例化它:
Screen screen = temp.newInstance();
如果您需要传递一些参数,请创建一个超级 class 所有级别都可以扩展:
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();
}
}
我正在尝试通过字符串设置新屏幕。我可以使用 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());
但我显然有一些语法问题,因为它告诉我 "temp" 没有找到。 我哪里错了?
发生了什么:
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”。所以你在运行前就知道什么字符串映射到哪个级别。所以一个简单的语句就足以 link 你的 LevelScreens
到 Strings
.
如果你想要一个屏幕实例Class,你必须像这样在 Class 对象上调用 newInstance():
game.setScreen((Screen) temp.newInstance());
您需要 forName
方法的完全限定名称。你不能打电话给 new temp()
。该语法表示您想要 class temp
的一个不存在的实例。 temp
是一个变量。如果你的 class 有一个无参数的构造函数,你可以实例化它:
Screen screen = temp.newInstance();
如果您需要传递一些参数,请创建一个超级 class 所有级别都可以扩展:
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();
}
}