首页 文章

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

提问于
浏览
0

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

public class GameOverScreen implements Screen {
}

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

public class Game implements ApplicationListener {
}

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

3 回答

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

    • com.badlogic.gdx.Game 只不过 ApplicationListener ,它只有 Screen 的引用,所以有 setScreen() 方法 .

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

    SE的一些规则:

    • Never Write the Same Code Twice.

    • Don't use hand to break a brick if already you've hammer.

  • 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());
        }
    }
    
    • 使用组合/适配器:在ApplicationListener实现类中创建com.badlogic.gdx.Game的字段,并委派您实现的方法 .
  • 0

    主要你需要3个 class

    • 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 Class

    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 Class (Optional class)

    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() {}
    }
    

    Screen Switch

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

相关问题