使用libgdx添加菜单屏幕

时间:2019-02-04 22:51:06

标签: java libgdx

我是Java新手。我正在写一个像《飞扬的小鸟》这样的简单游戏。我喜欢开始游戏前的添加菜单屏幕,例如 -开始游戏-信用(可能)或类似的选择。

这是我的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 个答案:

答案 0 :(得分:0)

状态系统是一种很好的方法。也就是说,您根据自己所处的状态(菜单,播放等)来更新不同的代码。

因此,在您的render方法中,您将具有类似于以下内容的if语句:

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

在每个相应的函数中,您都有该状态的代码。 您可以绘制完全不同的事物,也可以更新/移动其他事物。

如果您对此概念感到满意,则可以创建一个具有Statecreate()方法的render()类,在主类中对其进行初始化,然后相应地运行每个状态。

答案 1 :(得分:0)

要拥有多个屏幕,必须在主类中扩展Game
使用“ gdx-setup.jar”创建libGdx项目时,默认为Main类扩展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)。此方法使用setScreen的{​​{1}}方法设置屏幕并另外处理旧屏幕。

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

Game

还有一个GameScreen,可以简单地显示逻辑图像:

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

现在,我们要做的最后一件事就是在游戏开始时设置一个屏幕。因此,在我们的主类的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(); } 方法(在本例中为MultipleScreen)中,我们添加了:

create()

现在,如果游戏结束了,我们将返回MenuScreen。但是我们不必每次都创建一个新的MenuScreen,而可以在Main类中添加一个@Override public void create () { changeScreen(new MenuScreen(this)); } 方法:

backToMenu()

现在,在我们的GameScreen中,我们可以简单地调用:private MenuScreen menuScreen; @Override public void create () { menuScreen = new MenuScreen(this); backToMenu(); } public void backToMenu(){ setScreen(menuScreen); } ,以返回到MenuScreen,而无需创建新菜单。

重要
如果我们调用game.backToMenu();,则将调用setScreen()方法,而不是该类的Constructor。
因此,您在类dispose()方法中处置的每个资产都必须在show()方法中创建,而不是在构造函数中创建,否则,如果第二次显示Screen,您将没有资产。

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

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