如何使用堆栈更改LibGdx中的游戏状态

时间:2017-03-27 17:27:06

标签: android libgdx

我正在制作一款类似flappy bird的游戏,我可以从菜单状态进入playState,但是当游戏结束时,当我尝试将菜单状态恢复时,它只是给了我背景或有时候一个白色的屏幕。

public class FlappyDemo extends ApplicationAdapter {//ApplicatoonListener

public static final int width=480;
public static final int height=800;
public static final String title="Flappy Bird";
public GameStateManager gsm;
/*private*/public SpriteBatch spriteBatch;
public void create () {
    spriteBatch=new SpriteBatch();
    gsm=new GameStateManager();
    gsm.push(new MenuState(gsm));

    Gdx.gl.glClearColor(1,1,1,1);



}

@Override
public void render () {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    gsm.update(Gdx.graphics.getDeltaTime());
    gsm.render(spriteBatch);


}

}

public abstract class State {
OrthographicCamera cam;
Vector3 mouse;
GameStateManager gsm;
public State(GameStateManager gsm){
    this.gsm=gsm;
    mouse=new Vector3();

    cam = new OrthographicCamera();
}
public abstract void handleInput();
public abstract void update(float dt);
public abstract void render(SpriteBatch sb);
public abstract void dispose();

}

public class GameStateManager {

private Stack<State> states;

public GameStateManager(){
    states=new Stack<State>();
}
public void push(State state){
    states.push(state);

    }
public void pop(){
    states.pop();
}

public void set(State state){
    states.pop().dispose();
    states.push(state);


}


public void update(float dt){
    states.peek().update(dt);

}
public void render(SpriteBatch sb){
    states.peek().render(sb);
}

}

public class MenuState extends State {

Texture background;
Texture playBtn;
public MenuState(GameStateManager gsm) {
    super(gsm);
    background=new Texture("bg.png");
    playBtn=new Texture("buttonflappy.jpg");
}

@Override
public void handleInput() {
    if(Gdx.input.isTouched()) {
        gsm.push(new PlayState(gsm));
    }

}

@Override
public void update(float dt) {
    handleInput();
}

@Override
public void render(SpriteBatch sb) {
    sb.begin();
    sb.draw(background,0,0, 1100,1800);
    sb.draw(playBtn,1100/2, 1800/2);
    sb.end();
}

@Override
public void dispose() {
    playBtn.dispose();
    background.dispose();

}

}

所以首先我调用push方法并将其传递给MENUSTATE,而不是在menustate中我调用push方法并将PlayState传递给游戏开始游戏,而在PLayState中我有游戏玩法,摄像机,视口。现在,当我说如果鸟撞到管子或地面时,应该再次调用menustate,我得到的是一个绿色屏幕,这是播放状态的背景。

  if (tube.collide(bird.getBirdBound())) {

                gsm.set(new MenuState(gsm));

            }
            if (bird.getPosition().y <= ground.getHeight() + offset) {

                gsm.set(new MenuState(gsm));

            }

当游戏结束并且应该调用menustate时,这是游戏状态管理器的调用方法。 所以任何人都可以告诉我如何才能获得menustate而不是获得背景颜色,即绿色。 真的很感激,如果有人可以提供帮助。

2 个答案:

答案 0 :(得分:0)

您不会将以前渲染的颜色清除到帧缓冲区。我看到你只在创建时调用glClearColor。试试这个渲染方法:

@Override
public void render () {
    Gdx.gl.glClearColor(1,1,1,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    gsm.update(Gdx.graphics.getDeltaTime());
    gsm.render(spriteBatch);
}

答案 1 :(得分:0)

我终于明白了问题是我没有改变相机的位置。所以我所做的就是在menustate中我使用了相机并设置了它的位置cam.setToOrtho(假,1100,1800)我绘制背景的位置并更新了相机,所以现在当我在游戏状态时,我选择当前的状态然后又回到了我的相机指向那种绿色的冥冥之物的怀孕。