当前位置:网站首页>【Cocos2d-x】可擦除的Layer:ErasableLayer
【Cocos2d-x】可擦除的Layer:ErasableLayer
2022-06-23 04:21:00 【linchaolong】
说明
源码
#ifndef __ERASABLELAYER_H__
#define __ERASABLELAYER_H__
#include "cocos2d.h"
USING_NS_CC;
// http://blog.csdn.net/linchaolong
// 可擦除的Layer
class ErasableLayer :public Layer
{
public:
// 创建ErasableLayer
//1.遮罩层
//2.橡皮擦(可以是Sprite或者纹理的路径)
static ErasableLayer* create(const char* layerPath, const char* erasaPath);
static ErasableLayer* create(Node *layer, Sprite* erasa);
static ErasableLayer* create(Node *layer, const char* erasaPath);
static ErasableLayer* create(const char* layerPath, Sprite* erasa);
// 还原
void clear();
// 是否可擦除
void setErasable(bool);
bool onTouchBegan(Touch* touch, Event *event);
void onTouchesMoved(Touch* touch, Event *event);
void onTouchEnded(Touch* touch, Event *event);
protected:
ErasableLayer();
~ErasableLayer();
bool init(Node *layer, Sprite* erasa);
void tick(float);
private:
Node* layer_;
Sprite* erasa_;
bool isErasable_;
RenderTexture* rt_;
};
#endif
#include "ErasableLayer.h"
ErasableLayer::ErasableLayer() :isErasable_(true)
{
}
ErasableLayer::~ErasableLayer()
{
CC_SAFE_RELEASE(layer_);
CC_SAFE_RELEASE(erasa_);
}
ErasableLayer* ErasableLayer::create(const char* layerPath, const char* erasaPath){
CCSprite* layer = CCSprite::create(layerPath);
CCSprite* erasa = CCSprite::create(erasaPath);
ErasableLayer* ret = new ErasableLayer;
if (ret->init(layer, erasa))
{
ret->autorelease();
return ret;
}
delete ret;
return nullptr;
}
ErasableLayer* ErasableLayer::create(Node* layer, Sprite* erasa){
ErasableLayer* ret = new ErasableLayer;
if (ret->init(layer, erasa))
{
ret->autorelease();
return ret;
}
delete ret;
return nullptr;
}
ErasableLayer* ErasableLayer::create(Node* layer, const char* erasaPath){
CCSprite* erasa = CCSprite::create(erasaPath);
ErasableLayer* ret = new ErasableLayer;
if (ret->init(layer, erasa))
{
ret->autorelease();
return ret;
}
delete ret;
return nullptr;
}
ErasableLayer* ErasableLayer::create(const char* layerPath, Sprite* erasa){
CCSprite* layer = CCSprite::create(layerPath);
ErasableLayer* ret = new ErasableLayer;
if (ret->init(layer, erasa))
{
ret->autorelease();
return ret;
}
delete ret;
return nullptr;
}
bool ErasableLayer::init(Node *layer, Sprite* erasa){
if (!Layer::init())
{
return false;
}
layer_ = layer;
erasa_ = erasa;
layer_->retain();
erasa_->retain();
this->setContentSize(layer_->getContentSize());
// 设置颜色混合模式
BlendFunc erasaBf = { GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }; //源因子:值为0,橡皮擦颜色为透明;目标因子:目标颜色透明度减去源颜色的透明度
erasa_->setBlendFunc(erasaBf);
auto size = layer_->getContentSize();
rt_ = RenderTexture::create(size.width, size.height);
rt_->setAnchorPoint(Vec2(0, 0));
rt_->setPosition(Vec2(size.width/2, size.height/2));
this->addChild(rt_);
clear();
schedule(CC_SCHEDULE_SELECTOR(ErasableLayer::tick));
// 触摸事件
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(ErasableLayer::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(ErasableLayer::onTouchesMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(ErasableLayer::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
listener->setSwallowTouches(false);
return true;
}
void ErasableLayer::tick(float){
if (!isErasable_)
{
return;
}
// 设置源颜色alpha值为最大值,目标颜色alpha值减去源颜色alpha值后就为0了,混合出来的效果就变透明了,这样就实现了橡皮擦效果了。
erasa_->setOpacity(255);
// 更新RenderTexture
rt_->begin();
// 绘制
erasa_->visit();
rt_->end();
}
void ErasableLayer::clear(){
layer_->setAnchorPoint(Vec2(0, 0));
layer_->setPosition(Vec2(0, 0));
rt_->begin();
layer_->visit();
rt_->end();
}
void ErasableLayer::setErasable(bool flag){
isErasable_ = flag;
}
bool ErasableLayer::onTouchBegan(Touch* touch, Event *event)
{
erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
return true;
}
void ErasableLayer::onTouchesMoved(Touch* touch, Event *event){
erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
}
void ErasableLayer::onTouchEnded(Touch* touch, Event *event)
{
erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
}
// 调用示例
// 遮罩层
auto maskLayer = LayerColor::create(Color4B(0,0,255,200));
maskLayer->setContentSize(sprite->getContentSize());
// 创建可擦除的Layer
auto layer = ErasableLayer::create(maskLayer, "eraser.png");
layer->setPosition(Vec2(visibleSize.width / 4, visibleSize.height / 4));
this->addChild(layer);

边栏推荐
- Dolphin scheduler dolphin scheduling upgrade code transformation -upgradedolphin scheduler
- JS interview question - anti shake function
- Three most advanced certifications, two innovative technologies and two outstanding cases, Alibaba cloud appeared at the cloud native industry conference
- Explanation of penetration test process and methodology (Introduction to web security 04)
- PAT 乙等 1016 C语言
- Wechat applet: wechat can also send flash photos to create wechat applet source code download and customize flash time
- PAT 乙等 1020.月饼
- Deploy docker and install MySQL in centos7
- PAT 乙等 1013 C语言
- PAT 乙等 1019 C语言
猜你喜欢

数字藏品如何赋能经济实体?

Use of visdom

The construction of digital factory can be divided into three aspects

runc 符号链接挂载与容器逃逸漏洞预警(CVE-2021-30465)

How to move the software downloaded from win11 app store to the desktop

What benefits have digital collections enabled the real industry to release?

Dolphin scheduler dolphin scheduling upgrade code transformation -upgradedolphin scheduler
![[proteus simulation] Arduino uno+pcf8574+lcd1602+mpx4250 electronic scale](/img/2d/96a370c90dcb7091038afad33bc4b4.png)
[proteus simulation] Arduino uno+pcf8574+lcd1602+mpx4250 electronic scale

True MySQL interview question (XXII) -- condition screening and grouping screening after table connection

Huawei's software and hardware ecosystem has taken shape, fundamentally changing the leading position of the United States in the software and hardware system
随机推荐
【斯坦福计网CS144项目】Lab2: TCPReceiver
The author believes that the so-called industrial Internet is a process of deep integration of industry and the Internet
【owt】owt-client-native-p2p-e2e-test vs2017构建 6:修改脚本自动生成vs工程
Software design and Development Notes 2: serial port debugging tool based on QT design
Wechat applet: production and generation of love guarantee
啊哈C语言 第8章 游戏时间到了(第29讲)
How to move the software downloaded from win11 app store to the desktop
Leetcode topic analysis add binary
Activity启动模式和生命周期实测结果
Leetcode topic analysis: factorial training zeroes
数字化工厂建设可划分为三个方面
Analysis on the problems and causes of digital transformation of manufacturing industry
Centos7部署radius服务-freeradius-3.0.13-15.el7集成mysql
Opencv display image
关于安装pip3 install chatterbot报错的问题
Pat class B 1010 C language
技术开发团队视角看到的数字藏品机遇与挑战
Operating mongodb in node
MySQL面试真题(二十五)——常见的分组比较场景
PAT 乙等 1024 科学记数法 C语言