CCRenderTexture,它允许你来动态创建纹理,并且可以在游戏中重用这些纹理。
使用 CCRenderTexture非常简单 – 你只需要做以下5步就行了:
- 创建一个新的CCRenderTexture. 这里,你可以指定将要创建的纹理的宽度和高度。.
- 调用 CCRenderTexture:begin. 这个方法会启动OpenGL,并且接下来,任何绘图的命令都会渲染到CCRenderTexture里面去,而不是画到屏幕上。
- 绘制纹理. 你可以使用原始的OpenGL调用来绘图,或者你也可以使用cocos2d对象里面已经定义好的visit方法。(这个visit方法就会调用一些opengl命令来绘制cocos2d对象)
- 调用 CCRenderTexture:end. 这个方法会渲染纹理,并且会关闭渲染至CCRenderTexture的通道。
- 从生成的纹理中创建一个sprite. 你现在可以用CCRenderTexture的sprite.texture属性来轻松创建新的精灵了。
void LayerBoard::addBlur()
{
Size size = Director::getInstance()->getWinSize();
RenderTexture *rendertexture = RenderTexture::create(size.width, size.height, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8);
rendertexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
Director::getInstance()->getRunningScene()->visit(); --在正在运行的场景上添加模糊背景
rendertexture->end();
LayerBlur * blur = LayerBlur::create(rendertexture->getSprite()->getTexture(), Rect(0, 0, rendertexture->getSprite()->getContentSize().width, rendertexture->getSprite()->getContentSize().height));
blur->setPosition(Vec2(rendertexture->getSprite()->getContentSize().width / 2, rendertexture->getSprite()->getContentSize().height / 2));
blur->setFlippedX(true);
blur->setRotation(180);
Director::getInstance()->getRunningScene()->addChild(blur);
blurSprite = blur;
blurSprite->retain();
LayerColor * color = LayerColor::create(Color4B(0, 0, 0, 100), blur->getContentSize().width, blur->getContentSize().height);
blurSprite->addChild(color);
}
void LayerBoard::removeBlur()
{
if (blurSprite!=0)
{
blurSprite->removeAllChildren();
blurSprite->removeFromParentAndCleanup(true);
blurSprite = 0;
}
}
void LayerBoard::addBlur(Node * node) --在node上添加模糊层效果
{
if (node == 0)
{
Log("LayerBoard::addBlur .panrent node is invalid");
return;
}
Size size = Director::getInstance()->getWinSize();
RenderTexture *rendertexture = RenderTexture::create(size.width, size.height, Texture2D::PixelFormat::RGBA8888, GL_DEPTH24_STENCIL8);
rendertexture->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);
Director::getInstance()->getRunningScene()->visit();
rendertexture->end();
LayerBlur * blur = LayerBlur::create(rendertexture->getSprite()->getTexture(), Rect(0, 0, rendertexture->getSprite()->getContentSize().width, rendertexture->getSprite()->getContentSize().height));
blur->setPosition(Vec2(rendertexture->getSprite()->getContentSize().width / 2, rendertexture->getSprite()->getContentSize().height / 2));
blur->setFlippedX(true);
blur->setRotation(180);
node->addChild(blur);
LayerColor * color = LayerColor::create(Color4B(0, 0, 0, 100), blur->getContentSize().width, blur->getContentSize().height);
blur->addChild(color);
}