2012-01-23 10 views
1

私はCCSpriteの上に何らかの「カラーオーバーレイ」を適用したいと思います。基本的に、それは完全に白です。CCSpriteの白色オーバーレイ

私は

mySprite.color = ccc3(0,0,0); 

を使用することができますし、私のスプライトは、黒のカラーオーバーレイを取得します。しかし、

mySprite.color = ccc3(255,255,255); 

自然にスプライトに影響しません。代わりに、私のスプライトは元の色を維持します。

これを達成する別の方法がありますか?ます。http://私は本当にすべての私のアニメーション/スプライトなどの白バージョンあなたが白または任意の色を行うために、このグレースケールコードを変換することができ

+1

を参照してください。これを行うために余裕がありませんwww.cocos2d-iphone.org/forum/topic/13597#post-79944 – eazimmerman

答えて

1

http://www.cocos2d-iphone.org/forum/topic/10227#post-58662

UIImage *convertToColor(UIImage *source, ccColor3B color) 
{ 
    CGSize size = [source size]; 
    int width = size.width; 
    int height = size.height; 

    // the pixels will be painted to this array 
    uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t)); 

    // clear the pixels so any transparency is preserved 
    memset(pixels, 0, width * height * sizeof(uint32_t)); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    // create a context with RGBA pixels 
    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast); 

    // paint the bitmap to our context which will fill in the pixels array 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), source.CGImage); 

    for(int y = 0; y < height; y++) { 
     for(int x = 0; x < width; x++) { 
      uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x]; 

      // convert to grayscale using recommended method: http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale 
      uint32_t gray = 0.3 * rgbaPixel[rgbaRED] + 0.59 * rgbaPixel[rgbaGREEN] + 0.11 * rgbaPixel[rgbaBLUE]; 

      // set the pixels to white 
      if (gray > 0) 
      { 
       rgbaPixel[rgbaRED] = color.r; 
       rgbaPixel[rgbaGREEN] = color.g; 
       rgbaPixel[rgbaBLUE] = color.b; 
      } 
     } 
    } 

    // create a new CGImageRef from our context with the modified pixels 
    CGImageRef image = CGBitmapContextCreateImage(context); 

    // we're done with the context, color space, and pixels 
    CGContextRelease(context); 
    CGColorSpaceRelease(colorSpace); 
    free(pixels); 

    // make a new UIImage to return 
    UIImage *resultUIImage = [UIImage imageWithCGImage:image]; 

    // we're done with image now too 
    CGImageRelease(image); 

    return resultUIImage; 
} 
CCSprite *colorSprite(CCSprite *sprite, ccColor3B color) 
{ 
    UIImage *image = convertSpriteToImage(sprite); 
    UIImage *white = convertToColor(image, color); 
    CCTexture2D *texture = [[CCTexture2D alloc] initWithImage:white]; 
    CCSprite *newSprite = [CCSprite spriteWithTexture:texture]; 
    return newSprite; 
} 
UIImage *convertSpriteToImage(CCSprite *sprite) 
{ 
    sprite.scale = 1.0f; 
    sprite.position = ccp(sprite.contentSize.width/2, sprite.contentSize.height/2); 

    CCRenderTexture *renderer = [CCRenderTexture renderTextureWithWidth:sprite.contentSize.width height:sprite.contentSize.height]; 
    [renderer begin]; 
    [sprite visit]; 
    [renderer end]; 

    return [UIImage imageWithData:[renderer getUIImageAsDataFromBuffer:kCCImageFormatPNG]]; 
} 
関連する問題