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 你的 LevelScreensStrings.

如果你想要一个屏幕实例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();
    }
}