在LibGDX中设置新屏幕

时间:2014-05-04 11:02:21

标签: libgdx rendering splash

我有两个clases,一个用于main方法,另一个用于splash。但是,在这两者之间切换不起作用。我想在Splash类中绘制一个图像,但它立即变黑了。当我将代码从初始化移动到主类时,图像就出现了。

主要课程:

public class Main extends Game {
public static int WIDTH, HEIGHT;

public void create () {
    WIDTH = Gdx.graphics.getWidth();
    HEIGHT = Gdx.graphics.getHeight();
    setScreen(new Splash());
}

public void render () { }
public void dispose() { super.dispose(); }
public void pause() { super.pause(); }
public void resize(int width, int height) { super.resize(width, height); }
public void resume() { }
}

Splash class:

public class Splash implements Screen {

private Sprite splash;
private SpriteBatch sb;

public void show() {
    sb = new SpriteBatch();
    Texture splashTexture = new Texture(Gdx.files.internal("res/img/splash.png"));
    splash = new Sprite(splashTexture);
    splash.setSize(Main.WIDTH, Main.HEIGHT);
    Gdx.gl.glClearColor(0, 0, 0, 1);
}

public void render(float delta) {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    sb.begin();
        splash.draw(sb);
    sb.end();
}

public void resize(int width, int height) { }
public void resume() { }
public void dispose() { }
public void hide() { }
public void pause() { }
}

任何想法,什么可能导致在Splash类中不呈现图像的问题?

更新1:我发现,Splash类中的render()方法甚至没有被调用(但是show()方法会这样做)

1 个答案:

答案 0 :(得分:1)

您应该从游戏类中调用render方法。如果你不打电话,没有人会为你做这件事。你不应该覆盖你所做的游戏类的渲染方法而你是空的,所以它不会为你调用任何东西。

让我们来看看Game类。它确实实现了ApplicationListener接口的所有方法(而不是create())。因此,您无需覆盖任何内容。只需删除您的:

public void render () { }
public void dispose() { super.dispose(); }
public void pause() { super.pause(); }
public void resize(int width, int height) { super.resize(width, height); }
public void resume() { }

它应该可以正常工作。尽管这些都是无用的方法。他们什么也没做,只是打电话给超级班,所以你为什么写这些。如果您还没有写过它会自动调用超级方法。

但是,如果您想要自己处理这些内容,例如在设置新屏幕之前调用屏幕上的dispose或调用init,则需要编写自己的“游戏”类来实现ApplicationListener接口。< / p>

为了让你知道如何做这个病,发布一个我用于某些测试的小例子:

public class MyGameClass implements ApplicationListener {

    private Screen curScreen; // the current screen

    @Override
    public void create(){
        Gdx.graphics.getWidth();
        Gdx.graphics.getHeight();

        Intro temp = new Intro(this);//just an example of the first screen to load up
        setScreen(temp);
    }

    public void setScreen(Screen s) {
        if (curScreen != null) {
            curScreen.hide();
            curScreen.dispose();
        }
        curScreen = s;
        curScreen.show();
        curScreen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        s.init();
    }

    @Override
    public void dispose() {
        curScreen.dispose();
    }

    @Override
    public void render() {
        curScreen.render(Gdx.graphics.getDeltaTime()); //call the rendermethod with the delta time as parameter
    }

    @Override
    public void resize(int width, int height) {
        curScreen.resize(width, height);
    }

    @Override
    public void pause() {
        curScreen.pause();
    }

    @Override
    public void resume() {
        curScreen.resume();
    }
}