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

在cocos2d-x中动态更新颜色数据,cocos2d-x,cocos2d-x-3.0,Cocos2d X,Cocos2d X 3.0,我想通过更新sprite的原始颜色数据在cocos2d-x中创建一些效果,cocos2d-x提供了任何方法吗 更新:我的缓冲区为每个像素4字节(A-R-G-B),视口尺寸为640x480。因此,缓冲区的长度为640*480*4=1228800字节,我经常更新它的内容。此解决方案会在每次更改纹理时重新生成纹理。 注意:此代码中的纹理使用格式RGBA-而不是ARGB 数据(/texel)数组m_TextureData和精灵只分配一次,但每次都必须释放并重新创建Texture2D对象,这可能会导致性能

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


更新:我的缓冲区为每个像素4字节(A-R-G-B),视口尺寸为640x480。因此,缓冲区的长度为640*480*4=1228800字节,我经常更新它的内容。

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

数据(/texel)数组m_TextureData和精灵只分配一次,但每次都必须释放并重新创建Texture2D对象,这可能会导致性能问题

注意:类名是Cocos2d-x 3.1.x中的新名称。在主循环中有一个供2.2.x用户选择的部分。要使用该名称,还必须使用旧的类名(如ccColor4B、CCTexture2D、CCSprite)

在标题中:

Color4B    *m_TextureData;
Texture2D    *m_Texture;
Sprite       *m_Sprite;
在执行中:

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

m_TextureData = new Color4B[w * h];
直接设置颜色-例如:

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
使用数据初始化纹理:

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

m_Texture = new Texture2D;
m_Texture->initWithData(m_TextureData, kCCTexture2DPixelFormat_RGBA8888, w, h, contentSize);
使用此纹理创建精灵:

m_Sprite = Sprite::createWithTexture(m_Texture);
m_Sprite->retain();
将m_精灵添加到场景中

在主循环中:
要动态修改m_TextureData更改纹理的颜色/纹理,请执行以下操作:

m_TextureData[i] = ...;
在Cocos2d-x2.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
在Cocos2d-x 3.1.x中

m_Texture->updateWithData(m_TextureData, 0, 0, w, h);
以后,别忘了清理。
在析构函数中:

m_Sprite->release();
m_Texture->release();
delete [] m_TextureData;

原始颜色数据?你是说纹理中的像素?当然:着色器。@learncos2D:有没有不使用着色器的方法?简而言之,我有一个颜色数据数组(又名像素、图像数据等),如何将其显示到屏幕上?CCTexture(2D)应该有一个“textureWithData”或“textureWithBytes”初始值设定项,但您的纹理数据必须是CCTexture支持的原始格式。以前也有一个CCMutableTexture,您可以直接更改纹理内容,但不确定这是否适用于cocos2d-xv3。
cocos2d::RenderTexture
有一个选项:
initWithWidthAndHeight(int-w,int-h,Texture2D::PixelFormat格式)
谢谢,但是它支持直接实时更新像素数据吗?
m_Texture->updateWithData(/*…*/)
比循环中的
initWithData
快吗?我不知道这个新方法。我仍然在使用Cocos2D-x2.2.x。是的,基本上,updateWithData()只调用glTexSubImage2D()。看起来更快:)