android - libgdx/安卓 : actor becomes black after added to stage

标签 android libgdx stage

在某些特定情况下, Actor 被添加到舞台后变成黑色表面,而不是实际纹理。在其他情况下,我可以在开始时加载 Actor ,然后将其设置为不可见,当我需要它时,我可以将其设置为可见。但我不想那样做。

所以这是 render() 的代码:

public void render() {
    Gdx.gl.glClearColor(backgroundColour.r, backgroundColour.g, backgroundColour.b,
        backgroundColour.a);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

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

以及我尝试将图像添加到舞台的位置

cardImage.setPosition(x, y);
cardImage.setWidth(ViewConstants.scalingWidthCard * ViewConstants.widthOneSpace);
cardImage.setHeight(ViewConstants.scalingHeightCard * ViewConstants.heightOneSpace);
stage.addActor(cardImage);

其中 cardImage 属于 ImageWrapper 类(ImageWrapper 扩展 Image 并仅包含更多字段,方法未以任何方式被覆盖/更改)。这是我如何加载纹理的代码:

private ImageWrapper loadActorForCardAndSaveInMap(Card card) {
    String textureString = loader.getCardTextureName(card);
    ImageWrapper textureForCard = loader.getImageForPath("cards/" + textureString + ".png");

    // irrelevant for libgdx, but I'll post it, so you see what happens
    faceUpCards.put(textureString, textureForCard);

    return textureForCard;
}
[...]
private ImageWrapper getImageForPath(String path) {
        try {
            return new ImageWrapper(new Texture(Gdx.files.internal(path)));
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

大多数情况下一切正常,但并非全部。

我还尝试重新加载舞台

Group root = stage.getRoot();
stage.clear();
stage.setRoot(root);

如指定here .但这并不能解决问题。

最佳答案

与渲染线程同步

因此 render()调用实际上与 GL 上下文同步,将其用作入口点。

1) 在某处定义任务列表 private ArrayList<Runnable> synchronizedTasks = new ArrayList<>();

2) 将渲染循环中的同步调用添加到您的任务中

public void render() {
    runSyncTasks();
    // other draw code
}

private void runSyncTasks(){
    synchronized(synchronizedTasks){
        for(Runnable r : synchronizedTasks){
            r.run();
        }
        synchronizedTasks.clear();
    }
}

3) 当你想加载你的图像时(例如在用户输入时),提交这样的任务:

synchronized(synchronizedTasks){
    synchronizedTasks.add(new Runnable(){
        @Override
        public void run(){
            ... loadActorForCardAndSaveInMap(...)
        }
    });
}

这将添加 Runnable到列表中,它将在接下来的render()中执行GL线程的传递。请记住,您需要执行涉及创建的 ImageWrapper 的任何操作。里面的物体 run(){}方法。

编辑

或者实际上,您可以只提交您的 Runnable通过Gdx.app.postRunnable(new Runnable()...);没有自定义同步器的东西。 Gdx 调用做完全相同的事情。

关于android - libgdx/安卓 : actor becomes black after added to stage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281446/

相关文章:

java - Libgdx 正交相机初始位置

java - 调用 JavaFX 应用程序两次

java - 在 Eclipse 设置中运行现有项目

android - 如何以编程方式卸载应用程序?

fonts - 使用着色器勾勒字体轮廓并使用距离场

java - 如何创建 libgdx 主菜单屏幕

jenkins-pipeline - 如何修复 - stageResult 设置为 FAILURE 但仍然在 jenkins 中获得成功

java - 使用 Scanner 和 JavaFX Stage 从键盘获取输入

android - 多个dex文件用Gradle定义Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

java - 获取变量值android