libgdx / android:演员在加入舞台后变黑

时间:2017-02-16 18:00:38

标签: android libgdx stage

在某些特定情况下,添加到舞台后的演员变为黑色表面,而不是实际纹理。在其他情况下,我可以在开头加载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。但这并不能解决问题。

1 个答案:

答案 0 :(得分:1)

与渲染线程

同步

因此,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添加到列表中,它将在GL线程的下一个render()传递中执行。请记住,您需要在ImageWrapper方法中执行涉及已创建的run(){}对象的任何操作。

修改

或者实际上,您只需通过Runnable提交Gdx.app.postRunnable(new Runnable()...);,而无需自定义同步器。 Gdx调用完全相同。