[英]Android libGDX no background Sprite after state changed
I want to adjust the texture in my game to diffrent screens sizes, so I try to add ExtendViewport
into my viewport
, but Whenever I try change the states the background is not loaded. 我想将游戏中的纹理调整为不同的屏幕尺寸,因此我尝试将
ExtendViewport
添加到viewport
,但是每当尝试更改状态时,都不会加载背景。 For the first time everything works fine, but whenever I try to set another state Ive got blank screen (I try with the same State instance to exclude the code errors) 第一次一切正常,但是每当我尝试设置另一个状态时,我都会黑屏(我尝试使用相同的State实例来排除代码错误)
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) ;
}
Menu State 菜单状态
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 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);
}}
Problem is simple, you're not updating viewport of new State so update that with your screen width and height. 问题很简单,您没有更新新状态的视口,因此请使用屏幕的宽度和高度进行更新。
First time when Game Start resize method of State
called by ApplicationListener
class in this way. 第一次当Game Start以这种方式调整
ApplicationListener
类调用的State
方法的大小时。
ApplicationListener
's resize(,)
-> GameStateManager
's resize(,)
-> State
's resize(,)
ApplicationListener
的resize(,)
-> GameStateManager
的resize(,)
-> State
的resize(,)
After that resize( , )
of State or GameStateManager never called. 此后,State或GameStateManager的
resize( , )
不再调用。
so simply change set()
method of your GameStateManager
. 因此只需更改
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.