Animation 变色精灵Cocos2d

Animation 变色精灵Cocos2d,animation,colors,cocos2d-iphone,Animation,Colors,Cocos2d Iphone,我需要我的雪碧转换到一种颜色到另一种颜色,然后继续。。。就像蓝色,然后绿色,然后紫色,但我找不到任何好的行动,我想知道,我应该使用动画?或者有一个合并的操作吗?您可以使用CCTintTo操作来更改精灵的颜色 [sprite runAction:[CCTintTo actionWithDuration:2 red:255 green:0 blue:0]]; 因为我看到了一些关于在精灵中替换像素颜色的问题,我没有看到任何好的解决办法(所有解决方案都只对颜色进行着色,没有一个能够在不强迫您创建多个图

我需要我的雪碧转换到一种颜色到另一种颜色,然后继续。。。就像蓝色,然后绿色,然后紫色,但我找不到任何好的行动,我想知道,我应该使用动画?或者有一个合并的操作吗?

您可以使用CCTintTo操作来更改精灵的颜色

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

因为我看到了一些关于在精灵中替换像素颜色的问题,我没有看到任何好的解决办法(所有解决方案都只对颜色进行着色,没有一个能够在不强迫您创建多个图像层的情况下改变颜色阵列,从而构建您想要的最终图像,即:一层用于平底锅,另一层用于展示,另一层用于衬衫,另一层用于头发颜色…值得注意的是,它们确实有自己的优势,比如使用精确的渐变)

我的解决方案允许您更改颜色数组,这意味着您可以拥有一幅具有已知颜色的图像(您不需要此层中的任何渐变,只需要您知道其值的颜色-PS这只适用于您想要更改的颜色,其他像素可以具有您想要的任何颜色) 如果您需要在更改的颜色上添加渐变,请创建一个仅带有着色的附加图像,并将其作为精灵的子对象放置

还要注意的是,我是cocos2d/x的新手(3天),并且这段代码是为cocos2dx编写的,但是可以很容易地移植到cocos2d

还要注意的是,我没有在android上只在iOS上测试它,我不确定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;
}
当然,如果需要速度,可以为精灵创建一个扩展,该扩展创建一个像素着色器,该着色器在渲染时进行加速;)

顺便说一句:在某些情况下,此解决方案可能会导致边缘出现一些伪影,因此您可以创建一个大图像并将其缩小,让GL最小化伪影。 您还可以创建带有黑色轮廓的“修复”层,以隐藏人工制品并将其放置在顶部等。 另外,请确保不要在图像的其余部分使用这些“关键”颜色,因为您不想更改像素。 还请记住,alpha通道没有改变,如果您只使用纯红色/绿色/蓝色的基本图像,您还可以优化此功能以自动消除边缘上的所有伪影(在许多情况下,避免需要额外的着色层)和其他酷的东西(将多个图像多路复用为一个位图-还记得调色板动画吗?)


享受;)

如果有人想为cocos2d-x提供此功能,请参阅以下代码:

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

你试过CCTintTo吗?在纹理加载时替换颜色是一个很好的方法,但在android上,当应用程序重新进入前景时,纹理会被重新加载。为了使其通用化,需要扩展纹理缓存机制以了解颜色数组。如何不仅替换颜色,还替换alpha通道?
somesprite->runAction(TintTo::create(float duration, Color3b &color));