wyfyte
wyfyte

Reputation: 31

libgdx - When I call setScreen() to set a new screen, screen flickers between new screen and old screen

I have a screen called MenuScreen that sets a new screen, GameScreen, when a new game button is pressed. When this happens, the screen flickers between MenuScreen and GameScreen, like MenuScreen is being hidden. Here is the code for the MenuScreen, GameScreen and Input Processor.

Note: right now, GameScreen is just written to show a purple background.

MenuScreen

public class MenuScreen implements Screen {

    private TextureRegion title;
    private TextureRegion newgameup;
    private TextureRegion loadgameup;
    private NewGameButton newgame;
    private SpriteBatch batcher;
    float screenWidth = Gdx.graphics.getWidth();
    float screenHeight = Gdx.graphics.getHeight();
    private float height;
    private float width;
    private MyGame game;
    private OrthographicCamera cam;
    private InputHandler inputHandler;
    private float timer;

    public MenuScreen(MyGame game) {
        this.game = game;
    }

    @Override
    public void show() {
        Gdx.app.log("MenuScreen", "show method");
        title = AssetLoader.title;
        newgameup = AssetLoader.newgameup;
        loadgameup = AssetLoader.loadgamedwn;
        width = 800; // Gdx.graphics.getWidth();
        height = 480; // Gdx.graphics.getHeight();
        cam = new OrthographicCamera();
        cam.setToOrtho(false, 800, 480);
        batcher = new SpriteBatch();
        batcher.setProjectionMatrix(cam.combined);
        inputHandler = new InputHandler(game, width, height);
        Gdx.input.setInputProcessor(inputHandler);

    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batcher.begin();
        batcher.draw(title, (width / 2 - title.getRegionWidth() / 2),
                (height / 2 + 25), 288, 52);
        inputHandler.getNewgame().draw(batcher);
        inputHandler.getLoadgame().draw(batcher);
        batcher.end();

        if (game.isGameScreen()) {
            timer += delta;
            if (timer > 1) {
                game.setScreen(new GameScreen(game));
            }
        }
    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub
    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub
    }

    @Override
    public void pause() {
        // TODO Auto-generated method stub
    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub
    }

    @Override
    public void dispose() {
        // TODO Auto-generated method stub
    }
}

GameScreen

public class GameScreen implements Screen {
    private MyGame game;
    private SpriteBatch batcher;

    public GameScreen(MyGame game) {
        this.game = game;
    }

    @Override
    public void show() {
        Gdx.app.log("GameScreen", "show method");
        Gdx.gl.glClearColor(255/255.0f, 50/255.0f, 255/255.0f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batcher = new SpriteBatch();
    }

    @Override
    public void render(float delta) {
        batcher.begin();
        batcher.end();
    }
}

InputHandler

public class InputHandler implements InputProcessor{
    private NewGameButton newgame;
    private SimpleButton loadgame;
    private float width, height;
    private MyGame game;


    public InputHandler(MyGame game, float width, float height) {
        Gdx.app.log("InputHandler", "constructor");
        this.game = game;
        this.width = width;
        this.height = height;

        newgame = new NewGameButton((width / 2 - AssetLoader.newgameup.getRegionWidth() / 2), 
                (height / 2 - 40), (float) 200, (float) + 35, AssetLoader.newgameup, AssetLoader.newgamedwn);

        loadgame = new SimpleButton((width / 2 - AssetLoader.loadgameup.getRegionWidth() / 2), 
                (height / 2 - 100), (float) 186, (float) + 37, AssetLoader.loadgameup, AssetLoader.loadgamedwn);
    }

    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        Gdx.app.log("InputHandler", "touch down"+screenX + "," +screenY);
        Gdx.app.log("InputHandler", "activescreen: "+game.activescreen);
        if (game.isMenuScreen()) {

            newgame.isTouchDown(screenX, screenY);
        }

        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        if (game.isMenuScreen()) {
            if (newgame.isTouchUp(screenX, screenY)) {
                game.gamescreen();
                return true;
            }
        }
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        // TODO Auto-generated method stub
        return false;
    }

    public NewGameButton getNewgame() {
        return newgame;
    }

    public SimpleButton getLoadgame() {
        return loadgame;
    }

    public void setNewgame(NewGameButton newgame) {
        this.newgame = newgame;
    }

    public void setLoadgame(SimpleButton loadgame) {
        this.loadgame = loadgame;
    }
}

Upvotes: 1

Views: 512

Answers (1)

wyfyte
wyfyte

Reputation: 31

So after great frustration, I realized the simple mistake I'd made shortly after posting my question: I was calling my Gdx.gl.glClear() and Gdx.gl.Clear() methods in show() rather than render().

Upvotes: 2

Related Questions