2017-04-04 5 views
0

ゲームのテクスチャを異なる画面サイズに調整したいので、viewportExtendViewportを追加しようとしましたが、状態を変更しようとするたびに背景が読み込まれます。初めてすべてが正常に動作しますが、私は別の状態を設定しようとするたびアイブ氏は、空白の画面を得た(私は、コードのエラーを排除するために同じ状態のインスタンスを試してください)Android libGDX背景なし状態が変更された後のスプライト

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

どのように状態を変更するか(ある状態から別の状態への移行) – Aryan

+0

GameStateManagerインスタンスを使用しています。新しい状態を設定したいときはいつでもスタックからポップしてそれを破棄し、新しい状態を作成してスタックにプッシュします。このアプローチは、ビューポートを使用せずスプライトの代わりにテクスチャを使用したときにうまく動作しますが、ビューポートを使用することに決めたので、異なるサイズのアプリケーションを扱うようにアプリケーションをアップグレードしたいと考えています。私はあなたがそれを見たいと思うなら、私の論理を質問に入れます。 – Expiredmind

+0

**バックグラウンドがロードされていないことを意味します**新しいStateオブジェクトを作成し、あなたの州のスタックにプッシュする必要があるたびに**。 – Aryan

答えて

1

問題は簡単ですが、新しい状態のビューポートを更新していないので、画面の幅と高さで更新してください。

このようにしてApplicationListenerクラスによって呼び出されたStateのゲーム開始サイズ変更メソッドが初めて初めて。

ApplicationListenerさんresize(,) - >GameStateManagerresize(,) - 呼び出されることはありません国家やGameStateManagerのresize(,)後>Stateさんresize(,)

GameStateManagerset()メソッドを変更するだけです。

public void set(State state){ 
    state.resize((int)states.peek().viewport.getScreenWidth(),(int)states.peek().viewport.getScreenHeight()); 
    states.pop().dispose(); 
    states.push(state); 
} 
関連する問題