libgdx - 当我调用setScreen()设置一个新屏幕时,屏幕在新屏幕和旧屏幕之间闪烁
问题描述:
我有一个名为MenuScreen的屏幕,当新按钮被按下时,屏幕会设置一个新屏幕GameScreen。发生这种情况时,屏幕会在MenuScreen和GameScreen之间闪烁,如MenuScreen正在隐藏。这里是MenuScreen,GameScreen和输入处理器的代码。libgdx - 当我调用setScreen()设置一个新屏幕时,屏幕在新屏幕和旧屏幕之间闪烁
注意:现在,GameScreen只会显示紫色背景。
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;
}
}
答
所以经过很大的FR在我发布我的问题后不久我发现了一个简单的错误:我在show()而不是render()中调用了我的Gdx.gl.glClear()和Gdx.gl.Clear()方法。
它看起来像你离开了SO,但万一你看到这一点,你可能想标记为答案。 – 2015-07-21 15:42:23