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

3
我想通过更新精灵的原始颜色数据在cocos2d-x中创建一些效果,cocos2d-x提供了任何方法来做到这一点吗?
更新:我的缓冲区每个像素是4字节(A-R-G-B),视口尺寸为640x480。因此,缓冲区长度为640 * 480 * 4 = 1228800字节,并且我经常更新其内容。

原始颜色数据?你是指纹理中的像素吗?没错:着色器。 - CodeSmile
@LearnCocos2D:有没有不使用着色器的方法?简单来说,我有一个颜色数据数组(也称像素、图像数据等),如何将其显示到屏幕上? - Bình Nguyên
CCTexture(2D)应该有一个“textureWithData”或“textureWithBytes”的初始化程序,但是您的纹理数据必须采用CCTexture支持的原始格式。以前还有一个CCMutableTexture,您可以直接更改纹理内容,不确定这是否适用于cocos2d-x v3。 - CodeSmile
cocos2d::RenderTexture有一个选项:initWithWidthAndHeight(int w, int h, Texture2D::PixelFormat format) - GameDeveloper
@GameDeveloper:我已经更新了我的问题,非常感谢你! - Bình Nguyên
显示剩余2条评论
1个回答

6

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

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_Sprite添加到场景中。

在主循环中:
要动态修改纹理的颜色/像素,请修改m_TextureData:

m_TextureData[i] = ...;

在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

在Cocos2d-x 3.1.x中
m_Texture->updateWithData(m_TextureData, 0, 0, w, h);

稍后不要忘记进行清理。
在析构函数中:

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

m_Texture->updateWithData(/*...*/) 在循环中比 initWithData 更快吗? - Bình Nguyên
1
我不知道这个新方法。我仍在使用Cocos2D-x 2.2.x。是的,基本上,updateWithData()只调用glTexSubImage2D()。看起来更快:) - n-o-d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接