[cocos2dx android]使用位图中的原始数据渲染精灵

[cocos2dx android]使用位图中的原始数据渲染精灵,android,c++,bitmap,cocos2d-x,Android,C++,Bitmap,Cocos2d X,我正在尝试从URL获取一个图像到位图,然后使用位图中的原始数据创建一个CCSprite。这里的问题是精灵显示边界宽度和高度为零 我从URL获取图像的代码是: String urlString ="https://graph.facebook.com/1536842063253312/picture?type=square"; //"http://www.mathewingram.com/work/wp-content/themes/thesis/rotator/335f69c5de_small.

我正在尝试从URL获取一个图像到位图,然后使用位图中的原始数据创建一个CCSprite。这里的问题是精灵显示边界宽度和高度为零

我从URL获取图像的代码是:

String urlString ="https://graph.facebook.com/1536842063253312/picture?type=square"; //"http://www.mathewingram.com/work/wp-content/themes/thesis/rotator/335f69c5de_small.jpg";//http://graph.facebook.com/"+user.getId()+"/picture?type=large";
        Bitmap pic = null;
        try {
            pic = BitmapFactory.decodeStream((InputStream) new URL(urlString).getContent());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            System.out.println("start fetchImageOfFacebook"+e);
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("start fetchImageOfFacebook"+e);  
            e.printStackTrace();
        }

        int[] pixels = new int[pic.getWidth() * pic.getHeight()];
        pic.getPixels(pixels, 0, pic.getWidth(), 0, 0, pic.getWidth(), pic.getHeight());

        int[] finalArray = new int[pic.getWidth() * pic.getHeight()];

        int len = pic.getWidth() * pic.getHeight();
        for(int i = 0; i < len; i++) {

        int red = Color.red(pixels[i]);
        int green = Color.green(pixels[i]);
        int blue = Color.blue(pixels[i]);
        finalArray[i] = Color.rgb(blue, green, red);//invert sequence here.
        }

        onFacebookImageNative(pixels,len,pic.getWidth(), pic.getHeight());


Main cpp...

JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_onFacebookImageNative(JNIEnv* env, jobject,
    jintArray pixels, jint dataLen, jint width, jint height, jint bitsPerComponent)
{
jint *jArr = env->GetIntArrayElements(pixels, NULL);
int pixelsInt[dataLen];
for (int i=0; i<dataLen; i++){
    pixelsInt[i] = (int)jArr[i];
}

GameManager::sharedGameManager()->onFacebookImage(pixelsInt, (int) dataLen, (int) width, (int) height);
}



GameManager.cpp Class

void GameManager:: onFacebookImage(int pixelsInt[], int picLen, int picWidth, int picHeight)
{
    CCTexture2D *tex = new CCTexture2D();
    bool val = tex->initWithData(pixelsInt,picLen,(Texture2D::PixelFormat)0,picWidth,picHeight, Size(picWidth,picHeight));
    CCSprite *spriteToAdd = CCSprite::createWithTexture(tex);

    CCLog("spriteToAdd %f %f",spriteToAdd->getBoundingBox().size.width,spriteToAdd->getBoundingBox().size.height);

}
String url字符串=”https://graph.facebook.com/1536842063253312/picture?type=square"; //"http://www.mathewingram.com/work/wp-content/themes/thesis/rotator/335f69c5de_small.jpg";//http://graph.facebook.com/“+user.getId()+”/picture?type=large”;
位图pic=null;
试一试{
pic=BitmapFactory.decodeStream((InputStream)新URL(urlString.getContent());
}捕获(格式错误){
//TODO自动生成的捕捉块
System.out.println(“启动fetchImageOfFacebook”+e);
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
System.out.println(“启动fetchImageOfFacebook”+e);
e、 printStackTrace();
}
int[]像素=新的int[pic.getWidth()*pic.getHeight()];
pic.getPixels(像素,0,pic.getWidth(),0,0,pic.getWidth(),pic.getHeight());
int[]finalArray=newint[pic.getWidth()*pic.getHeight()];
int len=pic.getWidth()*pic.getHeight();
对于(int i=0;iGetIntArrayElements(像素,空);
int pixelsInt[dataLen];
对于(int i=0;ionFacebookImage(像素点,(int)数据长度,(int)宽度,(int)高度);
}
GameManager.cpp类
void GameManager::onFacebookImage(int pixelsInt[],int picLen,int picWidth,int picHeight)
{
CCTexture2D*tex=新的CCTexture2D();
bool val=tex->initWithData(pixelsInt,picLen,(Texture2D::PixelFormat)0,picWidth,picHeight,Size(picWidth,picHeight));
CCSprite*spriteToAdd=CCSprite::createWithTexture(tex);
CCLog(“SpriteLoadd%f%f”,SpriteLoadd->getBoundingBox().size.width,SpriteLoadd->getBoundingBox().size.height);
}

我将使用CoCoCoS2D::network::HttpRequest获取Facebook个人资料图像。您不必重写不同平台的图像获取代码

void MyLayer::getFacebookPicture()
{       
    _url = "https://graph.facebook.com/1536842063253312/picture?type=square"; // std::string _url
    cocos2d::network::HttpRequest *_httpRequest = new cocos2d::network::HttpRequest();
    _httpRequest->setUrl(url.c_str());
    _httpRequest->setRequestType(cocos2d::network::HttpRequest::Type::GET);
    _httpRequest->setResponseCallback( CC_CALLBACK_2(MyLayer::imageDownloadedCallback, this) );

    cocos2d::network::HttpClient::getInstance()->send(_httpRequest);
}

void MyLayer::imageDownloadedCallback(cocos2d::network::HttpClient *client, cocos2d::network::HttpResponse *response)
{

    if(!response->isSucceed()){
        return;
    }

    std::vector<char> *buffer = response->getResponseData();

    // Use the response data to create an image.
    cocos2d::Image *img = new cocos2d::Image;
    if(img->initWithImageData((unsigned char*)&(buffer->front()), buffer->size()) == false){
        return;
    }

    auto textureCache = cocos2d::Director::getInstance()->getTextureCache();

    // Add into the texture cache
    cocos2d::Texture2D* texture = textureCache->addImage(img, _url);

    img->release();

    _spriteFBProfile->setTexture(texture); // Sprite *_spriteFBProfile
}
void MyLayer::getFacebookPicture()
{       
_url=”https://graph.facebook.com/1536842063253312/picture?type=square“;//std::string\u url
cocos2d::network::HttpRequest*_HttpRequest=新的cocos2d::network::HttpRequest();
_httpRequest->setUrl(url.c_str());
_httpRequest->setRequestType(cocos2d::network::httpRequest::Type::GET);
_httpRequest->setResponseCallback(CC_CALLBACK_2(MyLayer::imageDownloadedCallback,this));
cocos2d::network::HttpClient::getInstance()->send(_httpRequest);
}
void MyLayer::imageDownloadedCallback(cocos2d::network::HttpClient*客户端,cocos2d::network::HttpResponse*响应)
{
如果(!响应->isSucceed()){
返回;
}
std::vector*buffer=response->getResponseData();
//使用响应数据创建图像。
cocos2d::Image*img=新的cocos2d::Image;
如果(img->initWithImageData((unsigned char*)&(buffer->front()),buffer->size())==false){
返回;
}
auto-textureCache=cocos2d::Director::getInstance()->getTextureCache();
//添加到纹理缓存中
cocos2d::Texture2D*texture=textureCache->addImage(img,_url);
img->release();
_SpriteBprofile->setTexture(纹理);//Sprite*\u SpriteBprofile
}