当前位置: 首页 > 知识库问答 >
问题:

如何使用LibGDX制作文本按钮?

巫马浩言
2023-03-14

我跟随youtube上的一些教程,为我的libgdx游戏制作了一些按钮,但遇到了一个问题:我的按钮在哪里。无法加载数据包。

     stage = new Stage();




     black = new BitmapFont(Gdx.files.internal("font/black.fnt"));
     white = new BitmapFont(Gdx.files.internal("font/white.fnt"));

     atlas = new TextureAtlas(Gdx.files.internal("buttons/button.pack"));
     skin = new Skin(atlas);
     table = new Table(skin);
     table.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

     TextButtonStyle textButtonStyle = new TextButtonStyle();
     textButtonStyle.up = skin.getDrawable("buttons/buttonup.png");
     textButtonStyle.over = skin.getDrawable("buttons/buttonpressed.png");
     textButtonStyle.down = skin.getDrawable("buttons/buttonpressed.png");
     textButtonStyle.pressedOffsetX = 1;
     textButtonStyle.pressedOffsetY = -1;
     textButtonStyle.font = black;


     buttonPlay = new TextButton("PLAY", textButtonStyle);
     buttonPlay.pad(20);
     table.add(buttonPlay);

     buttonHelp = new TextButton("HELP", textButtonStyle);
     buttonHelp.pad(20);
     table.add(buttonHelp);

     buttonExit = new TextButton("EXIT", textButtonStyle);
     buttonExit.pad(20);
     table.add(buttonExit);

     table.debug();
     stage.addActor(table);

所有按钮文件(buttonup.png、button.pack等)都位于“buttons”文件夹中,该文件夹位于我的游戏gdx核心下的“资产”文件夹中(请参见链接)。我无法编译并获取错误“无法加载文件:buttons/button”。收拾png'我不知道为什么它在寻找一个png扩展,而我显然只是把按钮。打包,如果这是个问题的话。请帮忙!

以下是错误的链接:https://gyazo.com/1ef8cce0b1935ad450d9f5229b0d698e

我不认为文件的位置会有问题,因为可以加载资产中的所有其他png。

共有2个答案

白彦
2023-03-14

你的. pack文件的第一行是指连接到图集的位图。我很确定那里有什么

    button.pack.png

而不是

    button.png

只要编辑一下,这个就可以了。

但我发现还有一个问题——你使用的scene2d非常好,而skin instance也非常好——但是为什么要用skin来创建TextButtonStyle呢?

在我看来,你应该使用皮肤机制创建你的TextButton样式。你可以在这里阅读并看到一些示例(即使使用TextButton):

http://www.gamefromscratch.com/post/2013/12/18/LibGDX-Tutorial-9-Scene2D-Part-3-UI-Skins.aspx

颜镜
2023-03-14

你最有可能把你的图像在android/资产文件夹。创建按钮的方式看起来很好,但是LibGDX提供了一种更方便的创建按钮的方式,提前做了一点工作。这是我如何创建我的按钮:

然后,我将所有的UI图像打包在一起使用纹理打包器。这将生成一个图像表和一个txt文件,看起来像这样,但没有分裂参数:

uiskin.png
format: RGBA8888
filter: Linear,Linear
repeat: none
container_blue
  rotate: false
  xy: 17, 2
  size: 41, 45
  split: 20, 20, 22, 22
  orig: 41, 45
  offset: 0, 0
  index: -1
container_gold
  rotate: false
  xy: 60, 2
  size: 41, 45
  split: 20, 20, 22, 22
  orig: 41, 45
  offset: 0, 0
  index: -1

分割参数旨在使这些图像正确拉伸。我曾经问过一个关于英雄的问题,他们是如何工作的。所以,你要做的就是在绘图应用程序中查找图像,看看哪些部分需要拉伸并填充分割参数。

sprite表单和txt文件一起被称为TextureAtlas,一旦创建了这样的图集TextureAtlas atlas=new TextureAtlas(“uiskin.png”) 你可以通过做atlas来获取纹理。findRegion(“container_blue”)但是这是一个相当昂贵的调用,所以不要每次更新都这样做。

现在真正神奇的是,LibGDX提供了一个可以存储样式的皮肤。一个皮肤文件是. json格式的,看起来像这样:

{
    com.badlogic.gdx.graphics.g2d.BitmapFont: {
        default: { file: fonts/myDefaultFont.fnt }
        large: { file: fonts/myLargeFont.fnt }
    },
    com.badlogic.gdx.graphics.Color: {
        white: { a: 1, r: 1, g: 1, b: 1 }
        green: { a: 1, r: 0, g: 1, b: 0 }
        gray:  { a: 1, r: 0.5, g: 0.5, b: 0.5 }
        black: { a: 1, r: 0, g:0, b:0 }
    },
    com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: {
        default: { font: default, fontColor: white }
        container_gold: { background: container_gold, font: default, fontColor: green }    
    },
    com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: {
        default: { font: large, fontColor: white }
        container_gold: { down: container_gold, up: container_blue, disabled: container_grey, font: large, fontColor: green }
        container_gold_small: { down: container_gold, up: container_blue, disabled: container_grey, font: default, fontColor: green }
    },
}

其实很简单。首先我找到我的字体并命名它们,然后为我的字体添加一些颜色。从那里我为我的标签添加了两种样式,为我的文本按钮添加了三种样式。如果我把它加载到一个皮肤中像这样的皮肤=新皮肤(“Gdx.files.internal”(“uiskin.json”),atlas);我可以用我用一行创建的样式创建许多按钮。

//This would create a "larger button using the default font.
TextButton textButton = new TextButton("Click Me!", skin, "container_gold");
//This would create a smaller button
TextButton textButton = new TextButton("Click Me!", skin, "container_gold_small");

//This would create a label looking exactly like the first button
Label label = new Label("Label", skin, "container_gold");
//This would draw smaller white text without a background using the default style
Label label = new Label("Default text", skin);

这需要提前做更多的工作,但效果很好。还有一件事,如果你有很多屏幕,你不应该每次都加载一个新的皮肤。您应该使用AssetManager。这更容易设置,你只需要一个小班。我使用资产描述符加载资产,这样当我需要查找我的皮肤或地图集时,就可以节省键入更多字符的时间。

public class Assets {
    //The asset manager
    public static AssetManager manager = new AssetManager();
    //The atlas, I renamed .txt to pack (just a habit).
    public static final AssetDescriptor<TextureAtlas> uiAtlas =
            new AssetDescriptor<TextureAtlas>("ui/uiskin.pack", TextureAtlas.class);
    //The skin
    public static final AssetDescriptor<Skin> uiSkin =
            new AssetDescriptor<Skin>("ui/uiskin.json", Skin.class,
                    new SkinLoader.SkinParameter("ui/uiskin.pack"));

    //Method for loading the assets into the manager
    public static void load()
    {
        manager.load(uiAtlas);
        manager.load(uiSkin);
    }

    //Easy asset disposing, whenever you are done with it just dispose the manager instead of many files.
    public void dispose()
    {
        manager.dispose();
    }
}

您可以使用一个启动屏幕和一个fency加载条来使用它,但基本上您需要做的就是将以下代码作为要运行的第一行代码。

//This is on top of my first `create()` method.
//Tell the manager to start loading
Assets.load();
//Tell the program to "loop" the loading until finished. Essentially stopping the game from continuing.
Assets.manager.finishLoading();

如果你正在发布你的游戏,并且加载需要几秒钟以上的时间,那么你最好使用某种启动/加载屏幕。

 类似资料:
  • 问题内容: 我正在学习如何使用LibGDX制作游戏,并且正在尝试制作一个小型平台游戏(使用Eclipse)。我在主角跑动时制作了4张图像,以便在他移动时制作动画。但是,我在网上找不到任何东西可以向我展示如何在不使用SpriteSheet的情况下制作动画。如何使用4张不同的图像制作动画? 问题答案: 首先:您不应使用其他图像。也许对您的播放器来说并不重要(因为只有一个),但是通常您应该始终使用Spr

  • 我刚刚开始使用LibGDX进行编码和应用程序开发,我有一些关于它的一般问题和一些更具体的问题。 在我开始之前:我知道我的一些问题可能已经在互联网上的某个地方被问到了,但我发现很难得到一个直接的答案。 所以,最基本的问题第一: 是否有可能在合理的时间内在LibGDX中创建一个普通的应用程序(如愤怒的小鸟或涂鸦跳跃)?在浏览互联网时,我遇到许多人说Unity这样的引擎“使用起来非常简单”,你可以用Li

  • 问题内容: 目前,我有以下代码: 它闪烁,但仅在“一个方向”闪烁。我的意思是,它只会淡出,然后以出现,然后再次淡出,再次出现,依此类推… 我希望它逐渐消失,然后从此渐隐“提升”到。那可能吗? 问题答案: 首先设置,然后在上结束,所以它从始于,在结束,因此只需将opacity设置为at ,其余的将自己处理。 在这里,我将动画持续时间设置为,然后将设置为。这意味着它将始终保持不变。最后,我正在使用。这

  • 我创造了一个长方形 它具有敌人的坐标和尺寸。在渲染方法中,我希望当按下此矩形时,打印字符串“完成”。我尝试了: 但它在地图上的任何地方都有效,而不仅仅是矩形

  • 我正在更新一个站点,目前有四个框,作为按钮在一个行;只不过他们用的是图像图。我想把它转换成一个CSS解决方案,这样它就不会有那么多的排泄,而且更容易访问,更友好。这样的事情怎么能做?我知道可以垂直做,但可以水平做.... 这是一个艺术家表演的它现在的样子。尺寸不是很准确,但你可以得到对角线的想法...

  • 有谁知道用zlib是否可以创建zip格式?怎么做?