繁体   English   中英

状态更改后,Android libGDX没有背景精灵

[英]Android libGDX no background Sprite after state changed

我想将游戏中的纹理调整为不同的屏幕尺寸,因此我尝试将ExtendViewport添加到viewport ,但是每当尝试更改状态时,都不会加载背景。 第一次一切正常,但是每当我尝试设置另一个状态时,我都会黑屏(我尝试使用相同的State实例来排除代码错误)

public abstract class State {

protected OrthographicCamera camera;
protected  GameStateManager gsm;
protected Viewport viewport;
public State(GameStateManager gsm) {
    this.gsm = gsm;
    camera = new OrthographicCamera();
    viewport = new ExtendViewport(GAME_SIZE_WIDTH * aspectRatio, GAME_SIZE_HEIGHT, camera);
    viewport.apply();

    camera.position.set(GAME_SIZE_WIDTH / 2, GAME_SIZE_HEIGHT / 2, 0);
     }
public  abstract void handleInput();
public abstract void update(float dt);
public abstract void render (SpriteBatch sb);
public abstract void dispose();
public abstract void resize(int width, int height) ;
}

菜单状态

public class MenuState extends State{


    private Sprite background;
    private Sprite playButton;

    public MenuState(GameStateManager gsm) {
        super(gsm);

        background =new Sprite(new Texture(Gdx.files.internal("back.jpg")));
        background.setSize(GAME_SIZE_WIDTH,GAME_SIZE_HEIGHT);
        background.setPosition(0,0);

        playButton=new Sprite(new Texture("play.png"));
        playButton.setSize(40,30);
        playButton.setPosition(GAME_SIZE_WIDTH/2-playButton.getWidth()/2,GAME_SIZE_HEIGHT/2-playButton.getHeight()/2);
    }



    @Override
    public void render(SpriteBatch sb) {
        sb.setProjectionMatrix(camera.combined);
        sb.begin();
        background.draw(sb);
        playButton.draw(sb);
        sb.end();
    }

    @Override
    public void dispose() {
        playButton.getTexture().dispose();
        background.getTexture().dispose();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width,height);
        camera.position.set(GAME_SIZE_WIDTH / 2, GAME_SIZE_HEIGHT / 2, 0);
    }
    @Override
    public void handleInput() {
    if(Gdx.input.justTouched()) {
        gsm.set(new MenuState(gsm));}
    }
    @Override
    public void update(float dt) {
        handleInput();
    }
}

GameStateManager

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().dispose();
}
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  void resize(int width, int height){
    states.peek().resize(width,height);
}}

问题很简单,您没有更新新状态的视口,因此请使用屏幕的宽度和高度进行更新。

第一次当Game Start以这种方式调整ApplicationListener类调用的State方法的大小时。

ApplicationListenerresize(,) -> GameStateManagerresize(,) -> Stateresize(,)

此后,State或GameStateManager的resize( , )不再调用。

因此只需更改GameStateManager set()方法。

public void set(State state){
    state.resize((int)states.peek().viewport.getScreenWidth(),(int)states.peek().viewport.getScreenHeight());
    states.pop().dispose();
    states.push(state);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM