效果:
游戏中经常会用到这种效果,今天,实现下,方便以后使用。
实现方法:
1.添加ClippingNode
2.为ClippingNode添加模板(即我们要添加动态光效的模板)
3.添加光效到ClippingNode中
4.将ClippingNode添加到节点中
下面,将把这个过程封装到一个方法中,用的时候,直接调用这个方法就OK了。
源码:
.h
void clipping(cocos2d::Node * pNode,std::string fileName);
.cpp
void DemoMainLayer::clipping(cocos2d::Node * pNode, std::string fileName)
{
Vec2 pos = pNode->getPosition();
Size size = pNode->getContentSize();
ClippingNode* clippingNode = ClippingNode::create();
clippingNode->setInverted(false);
clippingNode->setAlphaThreshold(0);
clippingNode->setStencil(pNode);
auto light = Sprite::create(fileName, Rect(0, 0, size.width, size.height));
clippingNode->addChild(light);
light->setOpacity(150);
light->setPosition(Vec2(pos.x - size.width / 2 - light->getContentSize().width / 2, pos.y));
float dis = size.width + light->getContentSize().width;
auto moveBy = MoveBy::create(0.8f, Vec2(dis, 0));
auto place = Place::create(light->getPosition());
auto seq = Sequence::create(moveBy, Hide::create(), DelayTime::create(1.0f), place, Show::create(), nullptr);
light->runAction(RepeatForever::create(seq));
addChild(clippingNode, pNode->getLocalZOrder() + 5);
}
使用:
auto title = Sprite::create("game_title.png");
addChild(title, this->getLocalZOrder());
title->setPosition(SFUtils::getCenterPos());
// auto title = Label::createWithTTF("HelloWorld", "fonts/Marker Felt.ttf",50.0f,Size::ZERO,cocos2d::TextHAlignment::RIGHT);
// addChild(title);
// title->setPosition(SFUtils::getCenterPos());
// title->setColor(Color3B(0, 255, 255));
clipping(title,"light_red.png");
从上面的代码可以看出,这个效果也是可以用于Label的。