有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用libgdx添加菜单屏幕

我是Java新手。我正在写一个简单的游戏,比如Flappy Bird。我喜欢在游戏开始前添加菜单屏幕,比如 -开始游戏-积分可能是选项(可能),诸如此类

以下是我的oncreate的基本代码:

@Override
public void create () {

    batch = new SpriteBatch();
    background = new Texture("background.png");
    smurf = new Texture("smurf.png");
    gargamel1 = new Texture("gargamel.png");
    gargamel2 = new Texture("gargamel.png");
    gargamel3 = new Texture("gargamel.png");
    distance = Gdx.graphics.getWidth() / 2;
    random = new Random();

    smurfX = Gdx.graphics.getWidth() / 2 - smurf.getHeight() / 2;
    smurfY = Gdx.graphics.getHeight() / 3;

    shapeRenderer = new ShapeRenderer();

    smurfCircle = new Circle();
    enemyCircles = new Circle[numberOfEnemies];
    enemyCircles2 = new Circle[numberOfEnemies];
    enemyCircles3 = new Circle[numberOfEnemies];

    font = new BitmapFont();
    font.setColor(Color.WHITE);
    font.getData().setScale(5);

    font2 = new BitmapFont();
    font2.setColor(Color.WHITE);
    font2.getData().setScale(8);

    for (int i = 0; i<numberOfEnemies; i++){

        enemyOffSet[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);
        enemyOffSet2[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);
        enemyOffSet3[i] = (random.nextFloat() - 0.5f) * (Gdx.graphics.getHeight() - 200);

        enemyX[i] = Gdx.graphics.getWidth() - gargamel1.getWidth() / 2 + i * distance;

        enemyCircles[i] = new Circle();
        enemyCircles2[i] = new Circle();
        enemyCircles3[i] = new Circle();
        sound = Gdx.audio.newSound(Gdx.files.internal("lose.ogg"));

    }
}

共 (2) 个答案

  1. # 1 楼答案

    要拥有多个屏幕,必须在主类中扩展Game
    默认情况下,使用“gdx setup.jar”创建libGdx项目时,主类会扩展ApplicationAdapter

    public class MultipleScreen extends Game {
    

    现在有了一个方法:setScreen(Screen)。使用此方法,您可以更改屏幕

    这是我在项目中经常使用的模板。它还会处理旧屏幕:

    public class MultipleScreen extends Game {
    
        @Override
        public void create () {
    
        }
    
        public void changeScreen(Screen newScreen){
            Screen oldScreen = getScreen();
            setScreen(newScreen);
            //Dispose the old screen to release resources
            if(oldScreen != null)
                oldScreen.dispose();
        }
    
        @Override
        public void render () {
            //Clear the Screen
            Gdx.gl.glClearColor(1, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            //Render the current Screen
            super.render();
        }
    
        @Override
        public void dispose () {
            //Dispose Assets which you used in the whole Game
        }
    }
    

    在这里,我创建了一个新方法:changeScreen(Screen)。此方法使用GamesetScreen方法设置屏幕,并对旧屏幕进行额外处理

    现在举个例子,我们需要两个屏幕:

    public class MenuScreen implements Screen {
    
        //We need MultipleScreen class to change the screen
        private MultipleScreen game;
    
        public MenuScreen(MultipleScreen game) {
           this.game = game; 
        }
    
        @Override
        public void show() {
    
        }
        private float f = 0;
        @Override
        public void render(float delta) {
            //A simple Timer which changes the screen after 10 seconds
            f += delta;
            if(f > 10000){
                //Here you can add for example also the Level to the GameScreen which level the player choose
                //game.changeScreen(new GameScreen(game, levelNumber));
                game.changeScreen(new GameScreen(game));
            }
        }
        ...
    }
    

    还有一个游戏屏幕,可以简单地显示badlogic图像:

    public class GameScreen implements Screen {
    
        private MultipleScreen game;
        private SpriteBatch batch;
        private Texture img;
    
        public GameScreen(MultipleScreen game) {
            this.game = game;
        }
    
        @Override
        public void show() {
            batch = new SpriteBatch();
            img = new Texture("badlogic.jpg");
        }
    
        @Override
        public void render(float delta) {
            //Here we don't need to add Gdx.gl.glClear...
            //because we already have this in our MultipleScreen which does this for every subScreen
    
            batch.begin();
            batch.draw(img, 0, 0);
            batch.end();
        }
    
        ...
    
        @Override
        public void dispose() {
            //This things will be disposed if we change to another Screen to save resources
            batch.dispose();
            img.dispose();
        }
    

    现在我们必须做的最后一件事是在游戏开始时设置屏幕。因此,在我们的主类的create()方法(在本例中为MultipleScreen)中,我们添加了:

    @Override
    public void create () {
        changeScreen(new MenuScreen(this));
    }
    

    现在,如果游戏结束,我们将回到MenuScreen。但不是每次都创建一个新的MenuScreen,我们可以在我们的主类中添加一个backToMenu()方法:

    private MenuScreen menuScreen;
    
    @Override
    public void create () {
        menuScreen = new MenuScreen(this);
        backToMenu();
    }
    
    public void backToMenu(){
        setScreen(menuScreen);
    }
    

    在我们的游戏屏幕中,我们现在可以简单地调用:game.backToMenu();以更改回菜单屏幕,而无需创建新的菜单屏幕

    重要
    如果我们调用setScreen(),将调用show()方法,而不是类的构造函数
    因此,在classes dispose()方法中处理的每个资产必须在show()方法中创建,而不是在构造函数中创建,否则,如果第二次显示屏幕,您将没有资产

    希望这本小指南能对你有所帮助。 如果您需要更多帮助,可以在Internet上找到一些教程,它们可以在其中更改屏幕:

    https://www.gamedevelopment.blog/full-libgdx-game-tutorial-project-setup/

  2. # 2 楼答案

    实现这一点的一个好方法是建立国家体系。i、 e.根据你所处的状态(菜单、播放等)更新不同的代码

    因此,在渲染方法中,会有一个类似于以下内容的if语句:

    if (state == 0) {
        menu();
    else if (state == 1) {
        game();
    }
    

    在每个相应的函数中,都有该状态的代码。 你可以画完全不同的东西,也可以更新/移动其他东西

    如果您熟悉这个概念,可以创建一个State类,该类有create()render()方法,在主类中初始化它,并相应地运行每个状态