创建按钮时LibGDX崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建按钮时LibGDX崩溃相关的知识,希望对你有一定的参考价值。

我是LibGdx的新手。我已经编程java一年了,但是今天我在LibGdx中遇到了一个Button错误。

是什么造成的,我该如何解决?

@Override
        public void render(float delta) {
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            batch.begin();
            background.draw(batch);
            batch.end();
            }
        @Override
        public void show() {
            batch = new SpriteBatch();

 //   THE ERROR IS HERE|
    //                 V
            // BUTTON
            Skin skinLibgdx = new Skin();
            TextureAtlas ta =  new TextureAtlas(Gdx.files.internal("Button.pack"));
            skinLibgdx.addRegions(ta);

            Button button = new Button(skinLibgdx);
            button.addListener(new ClickListener() {
                @Override
                public void clicked(InputEvent event, float x, float y) {
                    // TODO Auto-generated method stub
                    System.out.println("ABC");
                }
            });

        }

        ...

    }

错误:

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: No com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle registered with name: default
    at com.badlogic.gdx.scenes.scene2d.ui.Skin.get(Skin.java:145)
    at com.badlogic.gdx.scenes.scene2d.ui.Skin.get(Skin.java:132)
    at com.badlogic.gdx.scenes.scene2d.ui.Button.<init>(Button.java:50)
    at com.me.game.screen.MainMenu.show(MainMenu.java:53)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.me.game.screen.Splash$1.onEvent(Splash.java:64)
    at aurelienribon.tweenengine.BaseTween.callCallback(BaseTween.java:380)
    at aurelienribon.tweenengine.BaseTween.updateStep(BaseTween.java:521)
    at aurelienribon.tweenengine.BaseTween.update(BaseTween.java:424)
    at aurelienribon.tweenengine.TweenManager.update(TweenManager.java:166)
    at com.me.game.screen.Splash.render(Splash.java:35)
    at com.badlogic.gdx.Game.render(Game.java:46)
    at com.me.game.MainGame.render(MainGame.java:16)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)
答案

仅靠地图册对按钮来说是不够的。您必须为按钮提供default样式。这可以直接在皮肤上完成,也可以通过可以加载的JSON文件完成。查看https://github.com/libgdx/libgdx/wiki/Skin了解详情。

检查libgdx的测试,其中包含一个相当完整的示例(https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests-android/assets/data/uiskin.json)。

EG

...
com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: {
  default: { down: default-round-down, up: default-round },
  toggle: { down: default-round-down, checked: default-round-down, up: default-round }
},
...

然后加载它,例如

Skin skinLibgdx = new Skin(Gdx.files.internal("data/uiskin.json"))

看一个完整的例子:https://github.com/libgdx/libgdx/blob/396126f3af63eb9d0d263afc59653e00e8083778/tests/gdx-tests/src/com/badlogic/gdx/tests/UITest.java

以上是关于创建按钮时LibGDX崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Android - 应用程序启动时片段 onCreate 崩溃

LibGDX - 调用 TiledMapRenderer.render() 时应用程序崩溃

LibGDX HelloWorld 项目在 Android 模拟器上运行时崩溃

Android 应用程序片段不断崩溃

如何在 Libgdx 中创建一个按钮?

LibGDX 按钮在触摸时没有响应