2012-02-29 113 views
4

我需要我的精靈過渡到一種顏色到另一種顏色,然後......藍色色調然後是綠色然後紫色,但我找不到任何好的動作,我想知道,我應該使用動畫?或者有沒有爲此採取的行動?顏色變化的小精靈Cocos2d

+0

您是否試過CCTintTo? – 2012-02-29 02:12:58

+0

還沒有嘗試thx – mattblessed 2012-02-29 02:21:40

回答

11

可以使用CCTintTo行動改變精靈

[sprite runAction:[CCTintTo actionWithDuration:2 red:255 green:0 blue:0]]; 
4

,因爲我看到了有關在精靈置換像素顏色的幾個問題的顏色,我did'nt看到什麼好的解決辦法(所有解決方案僅在着色顏色,並且它們中的任何一個都不能改變顏色數組而不強制你創建構成最終圖像的多個圖像層,即:一層用於平底鍋,另一層用於展示,其他用於襯衫,另一層用於頭髮顏色。 ..並繼續 - 注意他們確實有他們的優勢,如使用精確梯度的能力)

my solut ion允許您更改顏色數組,這意味着您可以使用已知顏色的單個圖像(您不希望此圖層中有任何漸變色,只有您知道其值的顏色 - PS僅適用於您想要更改的顏色,其他顏色像素可以有任何你想要的顏色) 如果你需要在你改變的顏色上添加漸變色,創建一個只有陰影的附加圖像,並把它作爲精靈的子項。

同時也意識到我對cocos2d/x(3天)是超新的,並且此代碼是爲cocos2dx編寫的,但可以輕鬆移植到cocos2d。

還注意到我沒有在iOS上對它進行android測試,我不確定android官方gcc的性能如何,以及如何處理我分配_srcC和_dstC的方式,但是這又很容易移植。

所以這裏有雲:

cocos2d::CCSprite * spriteWithReplacedColors(const char * imgfilename, cocos2d::ccColor3B * srcColors, cocos2d::ccColor3B * dstColors, int numColors) 
{ 
    CCSprite *theSprite = NULL; 

    CCImage *theImage = new CCImage; 
    if(theImage->initWithImageFile(imgfilename)) 
    { 
     //make a color array which is easier to work with 
     unsigned long _srcC [ numColors ]; 
     unsigned long _dstC [ numColors ]; 
     for(int c=0; c<numColors; c++) 
     { 
      _srcC[c] = (srcColors[c].r << 0) | (srcColors[c].g << 8) | (srcColors[0].b << 16); 
      _dstC[c] = (dstColors[c].r << 0) | (dstColors[c].g << 8) | (dstColors[0].b << 16); 
     } 

     unsigned char * rawData = theImage->getData(); 
     int width = theImage->getWidth(); 
     int height = theImage->getHeight(); 

     //replace the colors need replacing 
     unsigned int * b = (unsigned int *) rawData; 
     for(int pixel=0; pixel<width*height; pixel++) 
     { 
      register unsigned int p = *b; 
      for(int c=0; c<numColors; c++) 
      { 
       if((p&0x00FFFFFF) == _srcC[c]) 
       { 
        *b = (p&0xFF000000) | _dstC[c]; 
        break; 
       } 
      } 
      b++; 
     } 

     CCTexture2D *theTexture = new CCTexture2D(); 
     if(theTexture->initWithData(rawData, kCCTexture2DPixelFormat_RGBA8888, width, height, CCSizeMake(width, height))) 
     { 
      theSprite = CCSprite::spriteWithTexture(theTexture); 
     } 
     theTexture->release(); 
    } 
    theImage->release(); 

    return theSprite; 
} 

使用它只是做到以下幾點:

ccColor3B src[] = { ccc3(255,255,255), ccc3(0, 0, 255) }; 
ccColor3B dst[] = { ccc3(77,255,77), ccc3(255, 0 0) }; 
//will change all whites to greens, and all blues to reds. 
CCSprite * pSprite = spriteWithReplacedColors("character_template.png", src, dst, sizeof(src)/sizeof(src[0])); 

當然,如果你需要的速度,你會創造,創造一個像素一個精靈的延伸着色器,它會在渲染時加速;)

btw:這種解決方案可能會在某些情況下在邊緣產生一些假象,因此您可以創建一個大圖像並縮小它,lettin GL最小化人造物。 您還可以創建帶黑色輪廓的「修復」圖層,以隱藏文物並將其放置在頂部等。 還確保您不希望像素的圖像的其餘部分使用這些「關鍵」顏色改變。 也記住alpha通道沒有改變的事實,並且如果您僅使用純紅/綠/藍顏色的基本圖像,您還可以優化此功能以自動消除邊緣上的所有假象(並避免很多情況下,額外遮陽層的需求)和其他有趣的東西(複用多個圖像到一個單一的位圖 - 記調色板動畫)

享受;)

+0

在紋理加載時替換顏色是一種很好的方法,但在android上,當應用程序重新進入前景時,紋理將被重新加載。爲了使其一般化,需要擴展紋理緩存機制以知道顏色數組。 – 2015-02-02 12:13:29

+0

如何更換不僅顏色,而且alpha通道? – 2017-10-29 15:01:21

1

如果有人想這個對了cocos2d-x在這裏?是代碼:

somesprite->runAction(TintTo::create(float duration, Color3b &color));