Панель прокрутки LibGDX показывает черный экран

Ситуация:
Во-первых, я новичок в LibGDX.

Я делаю игру, в которой игроки могут видеть все достижения на экране, поэтому я использую для этого ScrollPane.

Достижения отображаются во всплывающем окне (см. изображение ниже). Список достижений будет внутри этих красных линий.

Снимок экрана: введите здесь описание изображения

Проблема.
Проблема в следующем: экран показывает только черный экран, когда я добавляю виджет в панель прокрутки.

Странная вещь:
- когда я перетаскивал панель прокрутки, все отображается правильно.
- Но когда я отпускаю, экран снова чернеет.

Что я сделал:
– я выяснил, что любые актеры (не только таблицы) помещаются в ScrollPane Параметр приведет к черному экрану.
- Если я установлю для него значение null, он работает нормально.

Код:

public void show() {
    stage = new Stage();

    roomScreenUI = new RoomScreenUI();
    roomScreenUI.setName("RoomScreenUI");
    stage.addActor(roomScreenUI);

    roomScreenButton = new RoomScreenButton[5];
    for(int i=0; i<roomScreenButton.length; i++){
        roomScreenButton[i] = new RoomScreenButton(i+1, roomScreenUI.getScaleFactor());
        roomScreenButton[i].setName("RoomScreenButton");
        stage.addActor(roomScreenButton[i]);
    }

    roomScreenAchievementUI = new RoomScreenAchievementUI(roomScreenUI.getScaleFactor());
    roomScreenAchievementUI.setName("RoomScreenAchievementUI");
    stage.addActor(roomScreenAchievementUI);


    //----------------THE PROBLEM LIES HERE----------------//

    achievementContainer = new Table();

    scrollPane = new ScrollPane(achievementContainer);
    // scrollPane = new ScrollPane(null); <-- If I replace it with this line, it works fine

    //----------------THE PROBLEM LIES HERE----------------//

    achievementTable = new Table();
    achievementTable.setSize(roomScreenAchievementUI.getWidth() * 0.9f, roomScreenAchievementUI.getHeight() * 0.8f);
    achievementTable.setPosition(roomScreenAchievementUI.getX() + roomScreenAchievementUI.getWidth() / 2 - achievementTable.getWidth() / 2, roomScreenAchievementUI.getY() + roomScreenAchievementUI.getHeight() * 0.48f - achievementTable.getHeight() / 2);
    achievementTable.debug();
    achievementTable.add(scrollPane).expand().fill();
    achievementTable.setName("AchievementTable");
    stage.addActor(achievementTable);

    Gdx.input.setInputProcessor(stage);
}

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

    // ... code omitted ... //

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

Вопрос.
У кого-нибудь есть идеи о том, что происходит?
И как это исправить?
Заранее спасибо...

============================================== =================================== ОБНОВЛЕНИЕ ================================================== ================================
После нескольких часов экспериментов я создал гораздо более простой проект только экран и актер с нуля:

TestActor.java (это актер)

Texture texture;
Sprite sprite;

public TestActor(){
    // I used the default generated image badlogic.jpg
    texture = new Texture(Gdx.files.internal("badlogic.jpg"));
    sprite = new Sprite(texture);
}

@Override
public void draw(Batch batch, float alpha){
    batch.draw(sprite, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}

TestClass.java (это экран)

Stage stage;
ScrollPane scrollPane;
Table outerTable, innerTable;
TestActor testActor;

@Override
public void show() {
    stage = new Stage();

    testActor = new TestActor();
    stage.addActor(testActor);

    //---------THE PROBLEM IS STILL HERE---------//

    innerTable = new Table();
    scrollPane = new ScrollPane(innerTable); // change it to null, it works

    //---------THE PROBLEM IS STILL HERE---------//

    outerTable = new Table();
    outerTable.setPosition(0, 0);
    outerTable.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    outerTable.debug();
    outerTable.add(scrollPane).fill().expand();
    stage.addActor(outerTable);
}

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

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

Также я выяснил кое-что, что может быть подсказкой во время отладки:
- На первом кадре все отображается правильно.
- Начиная со второго кадра экран становится черным.

Это ошибка?
Или я что-то не так понял?
Мы будем очень признательны за любую помощь...


person Jay Kazama    schedule 18.12.2014    source источник
comment
Вы уверены, что добавляете ScrollPane и achievementContainer на сцену?   -  person Basim Khajwal    schedule 18.12.2014
comment
Я установил achievementContainer в качестве виджета scrollPane. Затем я добавил scrollPane к achievementTable в качестве новой ячейки. Так что да, я уверен.   -  person Jay Kazama    schedule 18.12.2014
comment
Дикое предположение ... что, если вы поместите что-то рисуемое в панель прокрутки? Отсутствие в нем чего-либо для рисования или придания ему внутреннего размера может вызвать некоторую ошибку, поскольку это необычный вариант использования.   -  person Tenfour04    schedule 18.12.2014
comment
Да, я пробовал это раньше. И в результате все внутри области прокрутки отображалось правильно, но все остальное было черным :(   -  person Jay Kazama    schedule 18.12.2014
comment
Вы имеете в виду, что весь экран черный или только область, где находится панель прокрутки?   -  person Tenfour04    schedule 18.12.2014
comment
Область, в которой область прокрутки в порядке, но область за ее пределами черная   -  person Jay Kazama    schedule 19.12.2014
comment
@JayKazama, здесь то же самое... Вам удалось исправить/выяснить, что происходит?   -  person fegemo    schedule 13.11.2016
comment
@fegemo Мне помог ангелангел, попробуйте его решение в его ответе ниже.   -  person Jay Kazama    schedule 02.12.2016


Ответы (2)


Изменить этот код

пример:

public class TestActor extends Widget {
Texture texture;
Sprite sprite;

public TestActor(){
    // I used the default generated image badlogic.jpg
    texture = new Texture(Gdx.files.internal("badlogic.jpg"));
    sprite = new Sprite(texture);
}

@Override
public void draw(Batch batch, float parentAlpha){

    Color color = getColor();
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);

    batch.draw(sprite, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}

}

person Angel Angel    schedule 18.12.2014
comment
Гм... Если вы посмотрите на скриншот моей игры, то увидите, что панель прокрутки находится в виде всплывающего окна в середине экрана. Вот почему мне нужен актер, который рисует все как фон (комнату) и отделяет его от области прокрутки. Ваш пример просто рисует все внутри области прокрутки (достижения), а не за ее пределами. - person Jay Kazama; 19.12.2014
comment
@Jay Kazama стоит мне понять, что вы хотите сделать, если вы хотите поставить, acterTest за внешней таблицей, попробуйте это: - person Angel Angel; 19.12.2014
comment
Ваши последние 2 строки дали мне ошибки. Метод setFillParent недоступен для testActor, метод addActorBefore также недоступен для stage. - person Jay Kazama; 19.12.2014
comment
Результат тот же, что и раньше (черный экран). - person Jay Kazama; 19.12.2014
comment
@Jay Kazama была моей ошибкой, которую я перепутал с театральным актером, я только что исправил - person Angel Angel; 19.12.2014
comment
Я понял вашу мысль, но, похоже, вы меня неправильно поняли. Я собираюсь использовать outerTable в качестве границы области прокрутки, а innerTable необходимо, так как область прокрутки может иметь только 1 дочерний элемент. Если вы посмотрите на мой скриншот, мне все еще нужен актер за пределами outerTable для фона. Сам outerTable будет содержать список достижений. - person Jay Kazama; 19.12.2014
comment
@Jay Kazama, вы можете сделать скриншот того, как выглядит ваш GDX. - person Angel Angel; 19.12.2014
comment
Сейчас даже ничего не рисует, даже в первом кадре. Также я не думаю, что смогу использовать таблицу для фона, так как есть кнопки в фиксированных положениях, мне будет сложно установить положение с помощью ячеек. - person Jay Kazama; 19.12.2014
comment
Вы должны попробовать протестировать проект самостоятельно, его создание занимает всего несколько минут. Посмотрите, понимаете ли вы, что я имею в виду под черным экраном. - person Jay Kazama; 19.12.2014

Вот обходной путь для тех, кто все еще сталкивается с этой ошибкой: попробуйте scrollpane.setFadeScrollBars(false);

person Nathan    schedule 21.01.2016