[英]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
方法的大小時。
ApplicationListener
的resize(,)
-> GameStateManager
的resize(,)
-> State
的resize(,)
此后,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.