我在继承了层的类下的函数里创建精灵并添加到层上面,然后在别的地方调用了这个函数,精灵显示出来大小和形状都对,但是是个纯黑的方块。但如果直接在层上添加精灵就能正确的显示颜色。为什么会有这样的现象啊?
如果是通过Plist文件创建的,可能是Plist文件加载的时机太早了.
不是通过plish创建的,是直接代码创建的
这是C++吗?目测继承没继承好。
是C++, 有用public的方式继承cocos2d::Node,同时也继承了另一个cloud的类。但是异步callback的时候就会显示黑色的图片
单纯从你的描述上也不知道是什么原因·······
顺带说下,手机上的话,如果图片太大也有可能出现精灵是黑色方块的情况(例如iPhone4没法显示2048x2048以上的)
是小图片,我使用App42API来加载图片
class App42Backend : public App42CallBack, public cocos2d::Node{}
然后在App42Backend类下面:
void App42Backend::getTopNRankersFromFacebook(const char *gameName, const char *fbAccessToken, int max){
scoreBoardService->GetTopNRankersFromFacebook(gameName, fbAccessToken, max, this, app42callfuncND_selector(App42Backend::getTopNRankersFromFacebookRequestCompleted));
}
void App42Backend::getTopNRankersFromFacebookRequestCompleted(App42CallBack *sender, void *response){
App42GameResponse scoreResponse = (App42GameResponse)response;
printf("\n\nGet top n rankers by fb");
if (scoreResponse->isSuccess)
{
vector<App42Score> scores = scoreResponse->scores;
int i = 0;
for(std::vector<App42Score>::iterator it = scores.begin(); it != scores.end(); ++it, ++i)
{
printf("\n Facebook User Name = %s",it->facebookProfile.getName().c_str());
printf("\n ScoreValue=%f",it->getScoreValue());
printf("\n Facebook Id = %s\n",it->facebookProfile.getFbId().c_str());
// check whether loaded the avatar and add it to avatar frame
std::string avatar = it->facebookProfile.getFbId().c_str();
avatar += ".png";
if (cocos2d::FileUtils::getInstance()->isFileExist(cocos2d::FileUtils::getInstance()->getWritablePath().append(avatar.c_str()))){ // already download avatar
HttpImage::getInstance()->addAvatarToHighScore(avatar.c_str(), i, it->facebookProfile.getName().c_str(), it->getScoreValue());
}else{
HttpImage::getInstance()->downloadImageFromURL(it->facebookProfile.getPicture().c_str(), it->facebookProfile.getFbId().c_str(), i, it->facebookProfile.getName().c_str(), it->getScoreValue());
}
}
}
}
如果图片已经下载过了,也就是if (cocos2d::FileUtils::getInstance()->isFileExist(cocos2d::FileUtils::getInstance()->getWritablePath().append(avatar.c_str())))下面,HttpImage::getInstance()->addAvatarToHighScore 是直接使用已下载的图片创建精灵然后加到一个layer上面去,这时候图片是黑色的
但是如果没有找到图片,也就是 else 下面, HttpImage::getInstance()->downloadImageFromURL 是通过cocos2d::Network::HttpRequest 的方法直接下载图片然后在HttpRequest 的 ResponseCallBack里面创建精灵并且加到layer上面,这时候无论HttpImage类有没有继承cocos2dx Node,图片都能显示出来
我也遇到过这种情况,那次失因为不是在主线程加载的图片,图片显示的是黑色块
我这应该也是差不多的问题,App42Backend::getTopNRankersFromFacebookRequestCompleted 应该不是在主线程里面跑的,那怎样才让非主线程加载的图片显示出来呢?
参考下cocos2dx的异步加载资源的方法
什么异步加载资源的方法?可以给段演示代码看看嘛?
只有Renderer Thread才能进行egl调用,因为egl的context是在Renderer Thread创建的,Worker Thread并没有EGL的context,在进行egl操作时,无法找到context,因此操作都是失败的,纹理也就无法显示出来。