简体   繁体   English

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

[英]Android libGDX no background Sprite after state changed

I want to adjust the texture in my game to diffrent screens sizes, so I try to add ExtendViewport into my viewport , but Whenever I try change the states the background is not loaded. 我想将游戏中的纹理调整为不同的屏幕尺寸,因此我尝试将ExtendViewport添加到viewport ,但是每当尝试更改状态时,都不会加载背景。 For the first time everything works fine, but whenever I try to set another state Ive got blank screen (I try with the same State instance to exclude the code errors) 第一次一切正常,但是每当我尝试设置另一个状态时,我都会黑屏(我尝试使用相同的State实例来排除代码错误)

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) ;
}

Menu State 菜单状态

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 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);
}}

Problem is simple, you're not updating viewport of new State so update that with your screen width and height. 问题很简单,您没有更新新状态的视口,因此请使用屏幕的宽度和高度进行更新。

First time when Game Start resize method of State called by ApplicationListener class in this way. 第一次当Game Start以这种方式调整ApplicationListener类调用的State方法的大小时。

ApplicationListener 's resize(,) -> GameStateManager 's resize(,) -> State 's resize(,) ApplicationListenerresize(,) -> GameStateManagerresize(,) -> Stateresize(,)

After that resize( , ) of State or GameStateManager never called. 此后,State或GameStateManager的resize( , )不再调用。

so simply change set() method of your GameStateManager . 因此只需更改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