Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libgdx/android:演员上台后变黑_Android_Libgdx_Stage - Fatal编程技术网

libgdx/android:演员上台后变黑

libgdx/android:演员上台后变黑,android,libgdx,stage,Android,Libgdx,Stage,在某些特定情况下,演员加入舞台后会变成黑色表面,而不是实际纹理。在其他情况下,我可以在开始时加载演员,然后将其设置为不可见,当我需要时,可以将其设置为可见。但我不想那样做 下面是render()的代码: 我试着在舞台上添加图像 cardImage.setPosition(x, y); cardImage.setWidth(ViewConstants.scalingWidthCard * ViewConstants.widthOneSpace); cardImage.setHeight(ViewC

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

下面是render()的代码:

我试着在舞台上添加图像

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);
按规定。但这并不能解决问题。

与渲染线程同步 因此,由于
render()
调用实际上与GL上下文同步,因此将其用作入口点

1) 在某处定义任务列表
private ArrayList 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()
过程中执行。请记住,您需要执行任何涉及该
run(){}
方法中创建的
ImageWrapper
对象的操作

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

更新:我发现,当前版本是1.9.5,对其进行了更改,但无论是更改还是使用我设置根的代码,都不会改变有关问题的任何内容。显示cardImage类的draw方法的代码?问题标题与您最后描述的问题不匹配(setRoot未知)。到底是什么问题?您是否遇到编译错误?运行时出错还是其他原因?@AbhishekAryan:cardImage是类图像,我没有碰绘图-method@munyul:读取根是为了修复它,但正如我所评论的,我成功地做到了这一点,但它没有修复问题(即我的纹理没有添加,而是完全黑色…)我将对问题进行编辑,使其更加清晰。谢谢您的详细解释。我在等待线程的结果时遇到了问题,但是现在找到了一种执行方法,我不需要等待结果(最外面的调用是void),现在它就像一个符咒一样工作。非常感谢你!
synchronized(synchronizedTasks){
    synchronizedTasks.add(new Runnable(){
        @Override
        public void run(){
            ... loadActorForCardAndSaveInMap(...)
        }
    });
}