如何在libgdx中将纹理添加到textbuttons

zxlwwiss  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(366)

我是libgdx的新手,我一直在努力学习如何创建按钮和添加纹理的教程,但是我真的很努力。如何向“继续”和“后退”按钮添加纹理?我只有png图像和纹理的.pack文件
另外,如果有人能建议一些方法,我可以改变字体的标签,我为我的按钮,如lbl\u ip
任何帮助都将不胜感激。

public class MenuScreen implements Screen {
    private Viewport viewport;
    private Stage stage;

    @SuppressWarnings("unused")
    private MainGame game;

    private Label lbl_ip;
    private Label lbl_name;
    private Label lbl_back;

    private LabelStyle lbl_style;

    private Skin txt_skin;

    private TextButtonStyle btn_style;

    private TextField txt_ip;
    private TextField txt_name;
    //private TextField txt_back;

    private Button btn_confirm;
    private Button btn_back;

    public static String ip = "localhost"; // change with user input
    public static String name = "Player 1";
    public static String back = "<---";

    public MenuScreen(MainGame game) {
        this.game = game;
        viewport = new FitViewport(MainGame.V_WIDTH/6, MainGame.V_HEIGHT/6, new OrthographicCamera());
        stage = new Stage(viewport, ((MainGame) game).batch);

        lbl_style = new Label.LabelStyle();
        lbl_style.font = new BitmapFont();

        txt_skin = new Skin(Gdx.files.internal("uiskin.json"));

        btn_style = new TextButton.TextButtonStyle();
        btn_style.font = new BitmapFont();

        Table table = new Table();
        table.top();
        table.setFillParent(true);

        lbl_ip = new Label("please enter an IP address:" , lbl_style);
        lbl_name = new Label("enter your name: " , lbl_style);
        lbl_back = new Label("Return to Main Menue", lbl_style);

        txt_ip = new TextField(ip, txt_skin);
        txt_name = new TextField(name, txt_skin);
        //txt_back = new TextField(back, txt_skin);

        btn_confirm = new TextButton("confirm", btn_style);
        btn_back = new TextButton("<--", btn_style);

        table.add(lbl_ip).expandX();
        table.add(txt_ip).width(200);
        table.row();
        table.add(lbl_name).expandX();
        table.add(txt_name).width(200);
        table.row();
        //table.add(lbl_back).expandX();
        table.add(btn_back);
        //table.add(txt_back).width(200);
        table.row();
        table.add(btn_confirm);
        table.row();

        stage.addActor(table);

        Gdx.input.setInputProcessor(stage);

    }

    private void buttonHandler() {
        if(Gdx.input.isKeyPressed(Input.Keys.ENTER)) {
            /*
            game.setScreen(new PlayScreen(game));
            */
            txt_ip.setTextFieldListener(new TextField.TextFieldListener() {

                @Override
                public void keyTyped(TextField textField, char c) {
                    ip = textField.getText();
                }
            });
            txt_name.setTextFieldListener(new TextField.TextFieldListener() {

                @Override
                public void keyTyped(TextField textField, char c) {
                    name = textField.getText();
                }
            });

            new MPClient(txt_ip.getText(), txt_name.getText(), game);
            dispose();

        }
    }

    @Override
    public void show() {
        // TODO Auto-generated method stub

    }

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

        stage.draw();
        stage.act(delta);

        buttonHandler();
    }

    @Override
    public void dispose() {
        stage.dispose();
    }

}
suzh9iv8

suzh9iv81#

你需要使用 ImageTextButton 为了这个。你需要提供 ImageTextButtonStyle ,这很容易创建(您需要指定 imageUp 属性,其他属性可以为空)。
至于标签字体,您需要创建一个新的 LabelStyle 给它分配一个新的 BitmapFont . 举个例子:

Label lab = new Label("This is the text", new LabelStyle(myFont, Color.RED));

“myfont”是一个 BitmapFont . 下面是一个如何创建 BitmapFont :

FreeTypeFontGenerator generator;
FreeTypeFontParameter parameter;

generator = new FreeTypeFontGenerator(Gdx.files.internal("fonts/nidsans-webfont.ttf"));
parameter = new FreeTypeFontParameter();
parameter.size = 12;
parameter.minFilter = TextureFilter.Linear;
parameter.magFilter = TextureFilter.Linear;
myfont = generator.generateFont(parameter);
s4n0splo

s4n0splo2#

您需要更改与小部件关联的样式。您可能希望为每个小部件创建一个新样式,而不是在所有小部件之间共享一个样式(因为这样会用新的背景更新所有小部件)

LabelStyle newLabelStyle = new LabelStyle(originalLabel.getStyle());
tobeChangedLabel.setStyle(newLabelStyle);
newLabelStyle.background = new Image( //however you like to make the image

改变字体有点棘手。。。字体作为位图烘焙到样式中(用于渲染速度)。你可能会发现,如果你不喜欢你的风格背景,甚至字体,你可能想使用不同的皮肤。你可以自己做,也可以在这里用。https://github.com/czyzby/gdx-skins
如果必须动态选择字体,可以使用gdxfreetype字体管理器动态构建呈现字体的位图https://jitpack.io/p/1nt3g3r/gdx-freetype-font-manager

相关问题