【问题标题】:LibGDX ScrollPane Showing Black ScreenLibGDX ScrollPane 显示黑屏
【发布时间】:2015-02-16 19:11:19
【问题描述】:

情况:
首先,我是 LibGDX 的新手。

我正在制作一款游戏,玩家可以在屏幕上看到所有成就,因此我为此使用了 ScrollPane

成就以弹出的形式显示(见下图)。成就列表将在这些红线内。

截图:

问题:
问题是:当我将小部件添加到 ScrollPane 时,屏幕仅显示 黑屏

奇怪的是:
- 当我拖动 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();
}

此外,我在调试时发现了一些可能是线索:
- 在第一帧,一切都被正确渲染。
- 从第二帧开始,屏幕变黑。

这是一个错误吗?
还是我误解了什么?
任何帮助将不胜感激...

【问题讨论】:

  • 您确定要将ScrollPaneachievementContainer 添加到您的舞台吗?
  • 我将achievementContainer 设置为scrollPane 的小部件。接下来我将scrollPane 添加到achievementTable 作为一个新单元格。所以是的,我确定。
  • 猜猜……如果你把一些可绘制的东西放到你的滚动窗格中会怎样?没有任何东西可以绘制或给它一个内部尺寸可能会触发一些错误,因为这是一个不寻常的用例。
  • 是的,我以前试过。结果是滚动窗格内的任何内容都正确呈现,但其他所有内容都是黑色的:(
  • 你的意思是整个屏幕都是黑色的,还是只有滚动窗格所在的区域?

标签: java android libgdx scrollpane


【解决方案1】:

编辑托盘此代码

示例:

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());
}

}

【讨论】:

  • 嗯...如果你看一下我的游戏截图,滚动窗格是在屏幕中间弹出的形式。这就是为什么我需要一个将所有内容绘制为背景(房间)并将其与滚动窗格分开的演员。您的示例只是在滚动窗格(成就)内绘制所有内容,而不是在它之外。
  • @Jay Kazama 让我明白你想做什么,如果你想把 actorTest 放在 outerTable 后面试试这个:
  • 你的最后两行给了我错误。 setFillParent方法不适用于testActoraddActorBefore方法也不适用于stage
  • 结果还是和之前一样(黑屏)。
  • @Jay Kazama 是我与舞台演员混淆的错误,我刚刚更正了
【解决方案2】:

对于仍然遇到此错误的人,这是一种解决方法:尝试 scrollpane.setFadeScrollBars(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2013-07-07
    • 2015-01-23
    • 2018-08-12
    • 2014-08-05
    • 2011-01-11
    • 2012-01-15
    • 2020-09-18
    相关资源
    最近更新 更多