切换屏幕(libgdx) - 实现ApplicationListener的游戏类

时间:2017-05-14 15:38:52

标签: java android libgdx

我们正在开发一个使用libgdx的游戏,我们希望能够切换屏幕。 我制作了一个GameOverScreen,它实现了Screen:

public class GameOverScreen implements Screen {
}

我的问题是我不知道如何在我的主班设置屏幕。我看过的大多数例子都显示了一个扩展Game的主要类(com.badlogic.gdx.Game)。但是我们的主类实现了ApplicationListener并且没有扩展Game:

public class Game implements ApplicationListener {
}

因此我无法使用Game类中的setScreen方法。那么如何在我的主类游戏中更改屏幕?

3 个答案:

答案 0 :(得分:1)

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());
        }
    }
    
  • 使用Composition / Adapter:在ApplicationListener实现类中创建com.badlogic.gdx.Game字段并委派您实现的方法。

答案 1 :(得分:1)

  • 首先Game是预定义类,因此请为您自己的实现使用不同的类名而不是Game

  • com.badlogic.gdx.Game只是ApplicationListener,它只有Screen的引用,因此setScreen()方法。

  • 使用Main(origin)扩展您的Game课程,而不是编写自己的实施,因为您需要在游戏中进行Screen转换。

SE的一些规则:

  • 永远不要写相同的代码两次。

  • 如果已经锤击,请不要用手打破砖块。

答案 2 :(得分:0)

主要是你需要3个班级

  • ScreenManager类
  • 抽象屏幕类(可选)
  • ScreenEnum(枚举)

播放屏幕和主菜单屏幕将从摘要屏幕扩展。 Screenmanager根据screenenum的屏幕代码切换屏幕

**** Screen Enum Class ****

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);