当前位置: 首页 > 知识库问答 >
问题:

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

桓风史
2023-03-14

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

public class GameOverScreen implements Screen {
}

我的问题是我不知道如何在我的主课上设置屏幕。我看到的大多数示例都显示了一个扩展游戏的主类(com.badlogic.gdx.Game)。但我们的主类实现ApplicationListener,不扩展游戏:

public class Game implements ApplicationListener {
}

因此,我不能使用来自Game类的setScreen方法。所以我如何能改变屏幕在我的主要类游戏?

共有3个答案

田慈
2023-03-14

主要是你需要3节课

  • 屏幕管理器类

播放屏幕和主菜单屏幕将从抽象屏幕扩展。屏幕管理器根据屏幕代码切换屏幕

****屏幕枚举类****

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

屏幕管理器类

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);
孟花蜂
2023-03-14

com.badlogic.gdx.游戏除了实现应用程序监听器之外什么也不做。有一些简单的选择:

>

  • 所以你可以扩展com.badlogic.gdx.游戏,而不是实现应用程序监听器

    就像com.badlogic.gdx.游戏一样。例如:

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

    使用组合/适配器:在应用程序监听器实现类中创建一个com.badlogic.gdx.游戏字段,并委托您实现的方法。

  • 董翰池
    2023-03-14

    >

    com。糟糕的逻辑。gdx。游戏只不过是ApplicationListener,它只有Screen的一个参考,所以有setScreen()方法。

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

    SE的一些规则:

    >

    如果你已经用锤子砸过砖头,不要用手去砸砖头。

     类似资料:
    • 当我的游戏结束时,我试图改变屏幕到游戏结束屏幕,但它没有这样做,只是闪烁当前的游戏屏幕。 游戏结束画面

    • 在libGDX中切换屏幕似乎有问题。它会切换到游戏屏幕,但不会切换回主屏幕,也不会切换到屏幕上的游戏。我的游戏课: 我的GameScreen类(实现屏幕): 这就是我如何更改屏幕(不工作): 你可以在这里找到全部来源。

    • 问题内容: 大家好,我仍在从事这个libgdx项目的工作,我试图找出将屏幕切换到游戏屏幕的最佳方法。现在,当单击一个按钮时,我需要它来切换到游戏屏幕。我已经看到了一些扩展游戏类的实现方式,但是我不确定这里最好的方法是什么。如果您看到一些可以改进的代码,请告诉我。 这是主要的应用程序类: 问题答案: 这就是我始终执行屏幕切换的方式: 首先,主类需要扩展Game(From ),然后您需要具有一个新的t

    • 大家好,我仍然在做这个libgdx项目,我正在努力找出最好的方法来改变我的游戏屏幕现在,当一个按钮被点击时,我需要它转换到游戏屏幕。我见过一些扩展game类的实现,但我不确定从这里开始最好的方法是什么。如果你看到一些可以改进的代码,请让我知道。 以下是主要的应用程序类:

    • 嗨,我在libgdx切换屏幕时遇到了问题。我正在建造一个小行星游戏克隆。因此,首先呈现我的Main MenuScreen类(使用Fitviewport),然后我调用setScreen()到GameScreen(GameScreen不使用Fitviewport),除了第二个屏幕呈现为使用Fitviewport。如果我调整第二个屏幕的大小,那么整个窗口用于渲染。为什么会发生这种情况?这里有一些图片..

    • 我需要提高游戏屏幕加载时间的Android游戏,使用LibGdx游戏引擎。我已经实现了一些类(ImageProvider和SoundManager),它们负责预加载游戏的资产和音频部分。所以,问题是我如何加载这些游戏资源而不影响游戏屏幕之间的加载时间? 我在网上搜索了这个问题,在Stack上发现了一些类似的问题。 如何减少libgdx中所有资产的加载时间 LibGDX中的AssetManager