[英]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.