Libgdx scene2dui 列大小问题

Libgdx scene2dui column sizing issue

我正在使用滚动窗格在 libgdx 中创建关卡 table。这里在特定滚动窗格上有不同的 table 具有特定级别。有什么方法可以将特定的 table 预设为我看到的第一个,因为如果我的等级超过 50 级,那将是愚蠢的,我必须滚动所有的等级才能到达最后的特定等级.

关于我的 table 和滚动窗格的简要说明。

我有一个 table 的数组列表,称为列 table,用于在不同的列中存储不同级别的详细信息。然后将此列 table 添加到另一个 table 中,称为 levleTable。

级别 table 已添加到滚动窗格,滚动窗格已添加到主 table。

public void setScrollPane() {
    scrollPane = new ScrollPane(levelTable, getScrollPaneStyle());
    // scrollPane = new ScrollPane(levelTable, skin);
    //scrollPane.setFlickScroll(true);
    scrollPane.setFadeScrollBars(false);
    scrollPane.setScrollingDisabled(false, true);
    scrollPane.setScrollX(300);
    scrollPane.updateVisualScroll();
    //scrollPane.setSmoothScrolling(true);
    mainTable.add(scrollPane).expand();
}

在构造函数中`

    mainTable = new Table();
    mainTable.setFillParent(true);
    levelTable = new Table();
    setScrollPane();
    columnTable = new ArrayList<Table>();
    levelSelectionButton = new ArrayList<TextButton>();
    makeLevelMenu();

    //adding main table to stage
    stage.addActor(mainTable);`

为了更好的想法(当使用这样的机制时)我将 scrollPane 自动滚动到当前对象(例如可以是 table 与你的下一个级别)。

您可以使用以下方式轻松实现它:

    scrollPane.setScrollY(y);

y 的位置

y = (total height of scroll Pane content) - ( (desired element Y position inside scrollPane) - (element height) )

我的意思是,如果您的 scrollPane 内容的高度为 100px,并且有 5 个元素,每个元素的高度为 20px,那么滚动到第三个是:

y = 100 - (3 * 20px - 20px) = 100 - 40px = 60px

如果您的 scrollPane 是水平排列的,同样会起作用 - 您只需要使用 scrollPane.setScrollX(x) 并计算所有宽度而不是高度

更新:在使用 setScrollX / setScrollY 之前,您必须在 scrollPane

上调用 .layout() 方法

例子:

    @Override
    public void show() 
    {
        //creating stage and viewport
        viewport = new FillViewport(1280, 800);
        stage = new Stage(viewport);

        Gdx.input.setInputProcessor(stage);

        //creating levelTable
        Table levelTable = new Table();
        levelTable.setSize(2000, 500);

        //filling levelTable with fake actors (it can be labels of your levels numbers)
        for(int i = 0; i < 100; i++)
        {
            Actor a = new Actor();
            a.setSize(80, 200);

            //set debug to see the outline
            a.debug();

            levelTable.add(a).pad(150, 10, 150, 10);
        }

        //set debug to see the outline
        levelTable.debug();

        //defining scroll
        ScrollPane scrollPane = new ScrollPane(levelTable, skin);

        scrollPane.setSize(800, 600); //your custom size
        scrollPane.setPosition(50, 50); //your custom position

        scrollPane.setFadeScrollBars(false);
        scrollPane.setScrollingDisabled(false, true);

        //important!! you have to call it before setScrollX
        scrollPane.layout(); //that's the thing!

        //the number of column you want to go to
        int numberOfColumn = 10;

        //now move to column no numberOfColumn
        scrollPane.setScrollX( levelTable.getWidth() - ( levelTable.getColumns() - numberOfColumn - 1 ) * 100 ); //100, because column width is 100 - actor = 80 + 2 * 10 pad

        //set debug to see the outline
        scrollPane.debug();

        this.stage.addActor(scrollPane);
    }