簡體   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