智能和自动按钮放置

时间:2015-12-14 14:42:38

标签: java android libgdx

我使用LibGDX按钮进行触摸输入(以前使用的桌面模式和键盘按键。到目前为止,按钮监听器按预期工作,但我无法按照我想要的方式放置这些按钮。我尝试过查看文档和一些示例,无法在这里找出问题,但从我所读到的几个关键事项中我已经注意到了:

  • 按钮应放在表格中
  • 表可以(并且应该)嵌套
  • 只有主表应填写父表。

我想要完成的是将标签(tableLabs)打包在顶部(根据原始Mario)和按钮与底角对齐(因此左侧的按钮位于左下角,按钮位于右侧右下角)跳转按钮直接位于方向按钮上方,不考虑屏幕尺寸,类似于Java Swing边框布局。

最后,我使用简单的" - >" ,"< - "和" ^"作为未来按钮图形的占位符。

到目前为止结果如下: mario labels and buttons

public class Hud implements Disposable{

    public Stage stage;
    public Viewport viewport;

    private Integer worldTimer;
    private float timeCount;
    private static Integer score;

    Label countDownLabel;
    static Label scoreLabel;
    Label timeLabel;
    Label levelLabel;
    Label worldLabel;
    Label marioLabel;

    TextButton butL, butR, butJ;

    public Hud(SpriteBatch spriteBatch){
        worldTimer = 300;
        timeCount = 0;
        score = 0;

        viewport = new FitViewport(SuperMario.WORLDWIDTH, SuperMario.WORLDHEIGHT, new OrthographicCamera());
        stage = new Stage(viewport, spriteBatch);

        Table mainTable = new Table();
//        mainTable.top().center();
        mainTable.setFillParent(true);


        Table tableLabs = new Table();
        tableLabs.top();//align to top
//        table.setFillParent(true);//fill

        countDownLabel  = new Label(String.format("%03d", worldTimer), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
        scoreLabel = new Label(String.format("%06d", score), new Label.LabelStyle(new BitmapFont(), Color.WHITE));
        timeLabel =  new Label("TIME", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
        levelLabel = new Label("1-1", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
        worldLabel = new Label("WORLD", new Label.LabelStyle(new BitmapFont(), Color.WHITE));
        marioLabel = new Label("MARIO", new Label.LabelStyle(new BitmapFont(), Color.WHITE));

        tableLabs.add(marioLabel).expandX().padTop(10);
        tableLabs.add(worldLabel).expandX().padTop(10);
        tableLabs.add(timeLabel).expandX().padTop(10);
        tableLabs.row();
        tableLabs.add(scoreLabel).expandX().padTop(10);
        tableLabs.add(levelLabel).expandX().padTop(10);
        tableLabs.add(countDownLabel).expandX().padTop(10);

//        stage.addActor(table);

        //button setup

        Table butTable = new Table();
        butTable.bottom();
//        table.setFillParent(true);

        TextButton.TextButtonStyle tbs = new TextButton.TextButtonStyle();
        tbs.font = new BitmapFont();
        butR = new TextButton("b1", tbs);
        butR.setText("->");
        butR.setColor(Color.FIREBRICK);
        butR.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                Gdx.app.log("B-right", "pressed");
            }
        });

        butL = new TextButton("b2", tbs);
        butL.setText("<-");
        butL.setColor(Color.FIREBRICK);
        butL.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                Gdx.app.log("B-left", "pressed");
            }
        });

        butJ = new TextButton("b3", tbs);
        butJ.setText("^");
        butJ.setColor(Color.FIREBRICK);
        butJ.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                Gdx.app.log("B-jump", "pressed");
            }
        });


        butTable.setDebug(true);
        butTable.add(butJ).expandX().padBottom(10).left().expand().padRight(10);
        butTable.add(butJ).expandX().padBottom(10).right().expand().padLeft(10);
        butTable.row();
        butTable.add(butL).expandX().padBottom(10).left().expand().padRight(10);
        butTable.add(butR).expandX().padBottom(10).right().expand().padLeft(10);


        mainTable.add(tableLabs).expand();
        mainTable.row();
        mainTable.add(butTable).expand();
        mainTable.setDebug(true);
//        stage.addActor(butTable);
        stage.addActor(mainTable);

        Gdx.input.setInputProcessor(stage);
    }

    public void update(float dt){
        timeCount+= dt;
        if(timeCount >=1){
            worldTimer--;
            countDownLabel.setText(String.format("%03d", worldTimer));
            timeCount--;
        }
    }

    public static void addScore(int value){
        score += value;
        scoreLabel.setText(String.format("%06d", score));
    }

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

1 个答案:

答案 0 :(得分:1)

设置表格单元格时缺少的是 fill 参数。在像您正在进行的单元格上调用expand会使单元格拉伸以适应,但除非您还在单元格上调用fill,否则单元格内的窗口小部件不会变大。

因此,将两个内部表添加到主表的底部附近的部分应如下所示:

mainTable.add(tableLabs).expand().fill(); //stretch the inner table to the size of the cell
mainTable.row();
mainTable.add(butTable).expand().fill(); //as above
mainTable.setDebug(true);
stage.addActor(mainTable);