libgdx屏幕 - 如何通过字符串设置新屏幕

时间:2015-09-23 19:07:19

标签: java string class libgdx screen

我试图通过字符串设置新的屏幕。我可以使用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;找不到。 我哪里错了?

3 个答案:

答案 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”。所以你在运行前知道什么字符串映射到哪个级别。因此,简单的声明就足以将您的LevelScreensStrings相关联。

答案 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();
    }
}