2017-04-04 52 views
0

我想調整遊戲中的紋理以區別不同的屏幕尺寸,所以我嘗試將ExtendViewport添加到我的viewport中,但每當我嘗試更改狀態時,背景未加載。第一次一切工作正常,但每當我嘗試設置另一個狀態Ive得到了黑屏(我用同一個國家的實例嘗試排除代碼中的錯誤)Android libGDX無背景狀態發生變化後的雪碧

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實例。我將每個狀態都保存在堆棧中,每當我想設置新狀態時,我都會從堆棧中彈出它,然後創建新狀態並將其推入堆棧。當我沒有使用視口並使用Texture代替Sprite時,這種方法很好,但我想升級我的應用程序來處理不同的屏幕尺寸,所以我決定使用視口。如果你喜歡看這個問題,我會把自己的邏輯放在這個問題上。 – Expiredmind

+0

**你的背景是什麼意思**沒有加載**每次你需要創建新的狀態對象並推入堆棧狀態。 – Aryan

回答

1

問題很簡單,您不更新新狀態的視口,以便更新您的屏幕寬度和高度。

第一次以此方式調用ApplicationListener類的Game Start調整方法State

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

國家或GameStateManager的是resize(,)從來沒有所謂的後。

所以只需更改set()方法GameStateManager

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