2012-02-29 12 views
4

私は色を別の色に変える必要があります。青の色合い、緑色、紫色のようですが、私はそれに対して何か良い行動を見つけることができず、私はアニメーションを使うべきでしょうか? ?またはこれに組み込まれたアクションがありますか?私はスプライトの画素の色の交換に関するいくつかの質問を見て、私は何か良い解決策を参照してくださいdid'nt以来色を変えるスプライトCocos2d

+0

CCTintToを試しましたか? –

+0

thxを試してみたことがありません – mattblessed

答えて

11

あなたはスプライト

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

の色を変更するにはCCTintToアクションを使用することができます(すべてのソリューションは、色合いそれらのどれも、あなたが望む最終的なイメージを構成する複数のイメージレイヤ、つまり、パン用、ショー用、シャツ用、ヘアカラー用の各レイヤーを作成することなく、色の配列を変更することはできません。正確な勾配を使う能力のような利点があることに注意してください。

私のsolutイオンは色の配列を変更することを可能にします。つまり、既知の色を持つ単一のイメージを持つことができます(このレイヤーにグラディエントを追加する必要はありません。色は変更する色にのみ適用されます。ピクセルに任意の色を設定できます) 変更する色にグラデーションが必要な場合は、シェーディングだけで追加のイメージを作成し、スプライトの子として配置します。

また、私はcocos2d/x(3日間)の新機能であり、このコードはcocos2dx向けに書かれていますが、簡単にcocos2dに移植できることに注意してください。

また、私はアンドロイドのみでiOS上でテストを行っていないことに注意してください。アンドロイドの公式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:この解決法は、場合によってはエッジに何らかのアーチファクトを発生させる可能性があるため、大きな画像を作成してそれを縮小することができるので、レンダリング時に高速化されるシェーダです。 GLはアーチファクトを最小にする。 また、アーティファクトを隠して上に置くために、黒い輪郭を持つ「修正」レイヤーを作成することもできます。 また、画像の残りの部分でこれらの「キー」カラーを使用しないようにしてください。かわった。 アルファチャンネルが変更されていないこと、純粋な赤/緑/青の色のみの基本画像を使用する場合は、この機能を最適化してエッジのすべてのアーティファクトを自動的に排除することもできます多くの場合は、単一のビットマップへの追加のシェード層の必要性)およびその他のクールなもの(多重いくつかの画像は - パレットのアニメーションを覚えている)

を楽しむ;)誰かがここにcocos2d-xのためにこれを望んでいた場合には

+0

テクスチャの読み込み時に色を置き換えるのは良い方法ですが、アプリケーションがフォアグラウンドに再び入るとアンドロイドにテクスチャが読み込まれます。一般化するためには、色配列を知るためにテクスチャキャッシュメカニズムを拡張する必要があります。 –

+0

色だけでなくアルファチャンネルも置き換える方法は? –

1

?コード:

somesprite->runAction(TintTo::create(float duration, Color3b &color)); 
関連する問題