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);
}}
如何改變你的狀態(從一個狀態轉換到另一個狀態)? – Aryan
使用GameStateManager實例。我將每個狀態都保存在堆棧中,每當我想設置新狀態時,我都會從堆棧中彈出它,然後創建新狀態並將其推入堆棧。當我沒有使用視口並使用Texture代替Sprite時,這種方法很好,但我想升級我的應用程序來處理不同的屏幕尺寸,所以我決定使用視口。如果你喜歡看這個問題,我會把自己的邏輯放在這個問題上。 – Expiredmind
**你的背景是什麼意思**沒有加載**每次你需要創建新的狀態對象並推入堆棧狀態。 – Aryan