簡體   English   中英

切換屏幕(libgdx)-實現ApplicationListener的游戲類

[英]Switch screens (libgdx) - Game class implementing ApplicationListener

我們正在使用libgdx進行游戲,我們希望能夠切換屏幕。 我制作了一個GameOverScreen,它實現了Screen:

public class GameOverScreen implements Screen {
}

我的問題是我不知道如何在主班級設置屏幕。 我看過的大多數示例都顯示了擴展Game(com.badlogic.gdx.Game)的主類。 但是我們的主類實現了ApplicationListener,並且沒有擴展Game:

public class Game implements ApplicationListener {
}

因此,我不能使用Game類中的setScreen方法。 那么,如何在主班游戲中更改屏幕?

com.badlogic.gdx.Game除了執行ApplicationListener以外,什么也不做。 有一些簡單的選項:

  • 因此,您可以擴展com.badlogic.gdx.Game而不是實現ApplicationListener

  • 與com.badlogic.gdx.Game相同。 例如:

     public void setScreen (Screen screen) { if (this.screen != null) this.screen.hide(); this.screen = screen; if (this.screen != null) { this.screen.show(); this.screen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); } } 
  • 使用組合/適配器:在ApplicationListener實現類中創建com.badlogic.gdx.Game的字段,並委派您實現的方法。

  • 首先, Game是預定義的類,因此對於您自己的實現,請使用其他類名代替Game

  • com.badlogic.gdx.GameApplicationListener ,它僅具有Screen的引用,因此具有setScreen()方法。

  • Game擴展Main(origin)類,而不是編寫自己的實現,因為您需要在游戲中進行Screen過渡。

SE的一些規則:

  • 永遠不要兩次寫相同的代碼。

  • 如果您已經錘擊過,請不要用手折斷磚塊。

主要你需要3節課

  • ScreenManager類別
  • 抽象屏幕類(可選)
  • ScreenEnum(枚舉)

播放屏幕和主菜單屏幕將從抽象屏幕擴展。 Screenmanager根據screenenum中的屏幕代碼切換屏幕

****屏幕枚舉類別****

public enum ScreenEnum {
    MAIN_MENU {

        public AbstractScreen getScreen(Object... params) {
            return new MainMenuScreen();
        }
    },
    PLAY {

        public AbstractScreen getScreen(Object... params) {
            return new PlayScreen();
        }
    };
    public abstract AbstractScreen getScreen(Object... params);
}

ScreenManager類別

public class ScreenManager {

    private static ScreenManager instance;

    private Game game;

    private ScreenManager() {
        super();
    }

    public static ScreenManager getInstance() {
        if (instance == null) {
            instance = new ScreenManager();
        }
        return instance;
    }
    public void initialize(Game game) {
        this.game = game;
    }
    public void showScreen(ScreenEnum screenEnum, Object... params) {
        Screen currentScreen = game.getScreen();

        AbstractScreen newScreen = screenEnum.getScreen(params);

        newScreen.buildStage();
        game.setScreen(newScreen);

        // Dispose previous screen
        if (currentScreen != null) {
            currentScreen.dispose();
        }
    }
}

AbstarctScreen類(可選類)

public abstract class AbstractScreen implements Screen {

    protected AbstractScreen() {
        super( );
    }
    public abstract void buildStage();

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    }

    @Override
    public void show() {

    }
    @Override
    public void resize(int width, int height){
    }

    @Override public void hide() {}
    @Override public void pause() {}
    @Override public void resume() {}
}

屏幕開關

ScreenManager.getInstance().showScreen(ScreenEnum.PLAY, 0);

ScreenManager.getInstance().showScreen(ScreenEnum.MAIN_MENU, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM