添加菜单屏幕libgdx

问题描述 投票:-2回答:2

我是新的Java处。我正在写一个简单的游戏,像笨鸟先飞。我喜欢添加菜单屏幕开始游戏之前,像 - 启动游戏-Credits也许选项(也许),类似的东西。

这里是我的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"));

    }
}
java libgdx
2个回答
0
投票

有几个屏幕时,您必须在您的主类扩展Game。 默认情况下,当你创建一个“GDX-setup.jar”主类扩展ApplicationAdapter一个libGdx项目。

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)。此方法使用setScreen设置屏幕和附加处置旧的Game方法。

我们做出了榜样,我们需要两个屏幕:

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

和GameScreen其简单的显示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);
}

在我们GameScreen现在我们可以简单的调用:game.backToMenu();改回MenuScreen而无需创建一个新的。

重要 如果我们调用setScreen()show()方法将被调用和类的不是构造函数。 所以每次资产你必须在show()方法在构造函数创建不否则你不会有任何资产,如果你表现出屏幕的第二次类Dispose()方法处理。

作为一个希望这个小指南将帮助您。如果您需要更多的帮助,您可以在网上找到一些教程,他们改变屏幕:

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


0
投票

做到这一点最好方法是一种国家制度。即你根据你在(菜单,播放等)什么状态更新的代码不同的一点。

因此,在渲染方法你有一个,如果类似下面的语句东西:

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

在每一个相应的功能,你必须为国家代码。您可以得出完全不同的事情和更新/移动其他事情也是如此。

如果你习惯使用这个概念,您可以创建具有Statecreate()方法render()类,在主类初始化并运行每个状态相应来代替。

© www.soinside.com 2019 - 2024. All rights reserved.