LibGDX在一个表格单元格滚动窗格中绘制多个actor

时间:2016-03-21 17:16:43

标签: fonts libgdx textures scrollpane

我目前的滚动窗格功能如下:

Picture of Level Screen

只有中间的蓝色框用滚动窗格实现,因此只有屏幕的中间部分滚动。滚动窗格的实现方式如下:

    final Table scrollTable = new Table();
    for (int j = 0; j < 60; j+=3) {
        for (int i = j; i < j+3; i++) {
            scrollTable.add(items.getValueAt(i).getImage()).center().padRight(80).size(200, 300).padBottom(70);
        }
        scrollTable.row();
    }

    final ScrollPane scroller = new ScrollPane(scrollTable);
    scroller.setScrollingDisabled(true, false);
    final Table table = new Table();
    table.setBounds(0, 300, GameWorld.gameWidth, GameWorld.gameHeight - 600);

    table.add(scroller);

    GameScreen.stage.addActor(table);

我遇到的问题是每个框都是在一个单元格(我相信)中绘制的,我需要做的是使用字体(也可能是纹理)绘制框顶部的级别数量这样:

Level box with font draw on top

问题是我无法简单地在屏幕上绘图,因为当用户向下滚动表格时字体将是静态的,所以我需要将字体添加到表格中,以便随表格滚动,但每次我尝试添加它时,它只能作为一个单独的单元格添加,而不是在已绘制的单元格之上。

有没有办法在另一个单元格的顶部绘制一个单元格,这样我就可以在一个单元格中绘制我的字体并将其放在我的水平框纹理上?或者这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我想通了,你可以在纹理下方的新行上添加标签,然后使用table.add(texture).padTop(-200)将其添加到第一行。我绘制了3行,第一行是方框,第二行是级别编号,第三行是在该级别中获得的星数,并使用.padTop()将最后两行放在第一行上以使其成为看起来像是一排。

最终结果:

Completed level UI

代码(大致)如下:

for (int j = 0; j < LevelFiles.maxLvl; j += 3) {

        //Level Boxes
        for (int i = j; i < j + 3; i++) {
            if(i == j)scrollTable.add(levelBoxes.getValueAt(i).getImage()).center().size(200, 300).padBottom(70);
            if(i == j+1)scrollTable.add(levelBoxes.getValueAt(i).getImage()).center().size(200, 300).pad(0, 100, 0, 100).padBottom(70);
            if(i == j+2)scrollTable.add(levelBoxes.getValueAt(i).getImage()).center().size(200, 300).padBottom(70);
        }
        scrollTable.row();

        //Fonts
        for (int i = j; i < j + 3; i++) {
            scrollTable.add(new Label(i+1 + "", l)).padTop(-450);
        }
        scrollTable.row();

        //Stars
        for (int i = j; i < j + 3; i++) {
            if((i+1) <= LevelFiles.maxLvl){
                scrollTable.add(threeStars[i]).prefHeight(100).prefWidth(262).padRight(0).padTop(-200);
            }
        }
        scrollTable.row();

}