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