在cocos2d-x中动态更新颜色数据

Bìn*_*yên 3 cocos2d-x cocos2d-x-3.0

我想通过更新sprite的原始颜色数据在cocos2d-x中创建一些效果,cocos2d-x能提供任何方法吗?

更新:我的缓冲区为每个像素4字节(ARGB),视口尺寸为640x480.因此,缓冲区长度为640*480*4 = 1228800字节,我经常更新其内容.

n-o*_*o-d 6

此解决方案每次更改时都会重新生成纹理.注意:此代码中的纹理使用RGBA格式 - 而不是ARGB.

数据(/ texel)数组m_TextureData和sprite仅分配一次,但每次都必须释放和重新创建Texture2D对象,这可能是性能问题.

注意:类名是来自Cocos2d-x 3.1.x的新名称.在主循环中,有2.2.x用户的替代部分.要使用那个,你还必须使用旧的类名(如ccColor4B,CCTexture2D,CCSprite).

在标题中:

Color4B    *m_TextureData;
Texture2D    *m_Texture;
Sprite       *m_Sprite;
Run Code Online (Sandbox Code Playgroud)

在实施中:

int w = 640; // width  of texture
int h = 480; // height of texture

m_TextureData = new Color4B[w * h];
Run Code Online (Sandbox Code Playgroud)

直接设置颜色 - 例如:

Color4B white;
white.r = 255;
white.g = 255;
white.b = 255;
white.a = 255;
m_TextureData[i] = white; // i is an index running from 0 to w*h-1
Run Code Online (Sandbox Code Playgroud)

使用数据初始化纹理:

CCSize contentSize;
contentSize.width  = w;
contentSize.height = h;

m_Texture = new Texture2D;
m_Texture->initWithData(m_TextureData, kCCTexture2DPixelFormat_RGBA8888, w, h, contentSize);
Run Code Online (Sandbox Code Playgroud)

用这个纹理创建一个Sprite:

m_Sprite = Sprite::createWithTexture(m_Texture);
m_Sprite->retain();
Run Code Online (Sandbox Code Playgroud)

将m_Sprite添加到场景中

在主循环中:
更改纹理的颜色/纹素动态修改m_TextureData:

m_TextureData[i] = ...;
Run Code Online (Sandbox Code Playgroud)

在Cocos2d-x 2.x中:
在2.2.x中你实际上必须释放旧纹理并创建一个新纹理:

m_Texture->release(); // make sure that ccGLDeleteTexture() is called internally to prevent memory leakage

m_Texture = new Texture2D;
m_Texture->initWithData(m_TextureData, kCCTexture2DPixelFormat_RGBA8888, w, h, contentSize);

m_Sprite->setTexture(m_Texture); // update sprite with new texture
Run Code Online (Sandbox Code Playgroud)

在Cocos2d-x 3.1.x中

m_Texture->updateWithData(m_TextureData, 0, 0, w, h);
Run Code Online (Sandbox Code Playgroud)

后来,别忘了清理.
在析构函数中:

m_Sprite->release();
m_Texture->release();
delete [] m_TextureData;
Run Code Online (Sandbox Code Playgroud)