【问题标题】:How to create libgdx main menu screen [closed]如何创建 libgdx 主菜单屏幕 [关闭]
【发布时间】:2015-12-03 19:00:05
【问题描述】:

我是 java 和 libgdx 的新手,我想创建一个主菜单屏幕,有人能给我一个简单的例子吗?

【问题讨论】:

  • 由于 libgdx 更常用于游戏编程,您可以将此问题移至“游戏编程”堆栈交换中获得更多答案。
  • 阅读 Scene2dScene2d skins 并带着问题回来 - 尽管我相信您将能够在讲座后创建菜单

标签: java menu libgdx


【解决方案1】:

您的要求非常广泛,它涉及许多元素,例如创建按钮、皮肤、设置表格等。无论如何,您应该为此使用 Screens,添加舞台并将演员添加到舞台。最终,您需要将侦听器添加到您的按钮演员以切换屏幕。这是我为您制作的:

public class TestScreen implements Screen{

    private SpriteBatch batch;
    protected Stage stage;
    private Viewport viewport;
    private OrthographicCamera camera;
    private TextureAtlas atlas;
    protected Skin skin;

    public TestScreen()
    {
        atlas = new TextureAtlas("skin.atlas");
        skin = new Skin(Gdx.files.internal("skin.json"), atlas);

        batch = new SpriteBatch();
        camera = new OrthographicCamera();
        viewport = new FitViewport(Constants.WorldWidth, Constants.WorldHeight, camera);
        viewport.apply();

        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();

        stage = new Stage(viewport, batch);    
    }


    @Override
    public void show() {
        //Stage should controll input:
        Gdx.input.setInputProcessor(stage);

        //Create Table
        Table mainTable = new Table();
        //Set table to fill stage
        mainTable.setFillParent(true);
        //Set alignment of contents in the table.
        mainTable.top();

        //Create buttons
        TextButton playButton = new TextButton("Play", skin);
        TextButton optionsButton = new TextButton("Options", skin);
        TextButton exitButton = new TextButton("Exit", skin);

        //Add listeners to buttons
        playButton.addListener(new ClickListener(){
            @Override
            public void clicked(InputEvent event, float x, float y) {
                ((Game)Gdx.app.getApplicationListener()).setScreen(new PlayScreen());
            }
        });
        exitButton.addListener(new ClickListener(){
            @Override
            public void clicked(InputEvent event, float x, float y) {
                Gdx.app.exit();
            }
        });

        //Add buttons to table
        mainTable.add(playButton);
        mainTable.row();
        mainTable.add(optionsButton);
        mainTable.row();
        mainTable.add(exitButton);

        //Add table to stage
        stage.addActor(mainTable);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(.1f, .12f, .16f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.act();
        stage.draw();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
        camera.update();
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        skin.dispose();
        atlas.dispose();
    }
}

我称之为的方式是稍微改变初始类。

//Let the class extend from game
public class MyGame extends Game()
{
    //Delete everything in it and leave a create() with a single line
    @Override
    public void create() {
    setScreen(new MenuScreen());
    }
}

当然,要使上述代码正常工作,您需要设置SkinAtlas 来绘制按钮。但是,您可以只添加图像和字体并手动创建按钮。无论如何,我只是在 answered a question 那里深入创建 SkinAtlas

编辑 尽管已经询问了菜单类的示例,但用户询问者实际上只需要知道如何在屏幕之间切换。有点尴尬,但幸运的是,编写上面的代码只花了几分钟;)。

您始终可以使用Gdx.app.getApplicationListener 从任何地方访问ApplicationListener。您可以将此投射到Game 以访问setScreen

((Game)Gdx.app.getApplicationListener()).setScreen(new GameScreen());

或者您可以手动传递初始 Game 对象或 applicationListener。确保新屏幕接受游戏对象。

public class MenuScreen
{
    private Game gameObject;
    public MenuScreen(Game gameObject)
    {
        this.gameObject = gameObject;
    }
    private void someMethod()
    {
         //Switches to a new MenuScreen... 
         //useless in most cases but you get the idea
         gameObject.setScreen(new MenuScreen(gameObject);
    }
}

【讨论】:

  • 谢谢 抱歉,如果您必须编写所有代码,但我的意思是如何使用多个屏幕和切换屏幕,根据我的理解,当您单击 setScreen(myOtherScreen());但是什么是新的 Playscreen() ?你不能直接调用另一个屏幕的类吗?
  • @StormAsdg 然后下一次更具体;)。 setScreen 属于 Game 对象,因此您必须从存储的 applicationListener 调用它,或者传递初始的 Game 对象。你做((Game)Gdx.app.getApplicationListener()).setScreen(nextScreen); 或者你可以传递初始的游戏对象然后做gameObject.setScreen
  • 请记住,我们使用setScreen(new GameScreen()); 每次都会创建一个新屏幕,如果您不加载当前状态,它将被重置为默认值。如果您在屏幕本身中加载状态,这不是问题。就像选项屏幕中音乐和声音的滑块值一样。但是你需要为你的资产使用 AssetManager 否则事情会很快变慢。
  • @StormAsdg setScreen 只需要提供一个实现Screen 的对象。你怎么做是你的选择。如果您对此或屏幕管理有更多疑问,让我们将其带到我在上面发布的聊天中。
  • 哦,现在我明白了它基本上是为该类初始化一个对象,然后调用它。谢谢
猜你喜欢
  • 2013-05-07
  • 2018-10-30
  • 2014-10-21
  • 1970-01-01
  • 2011-07-10
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多