Cocos2dx_可擦除Layer

前端之家收集整理的这篇文章主要介绍了Cocos2dx_可擦除Layer前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #ifndef __ERASABLELAYER_H__
  2. #define __ERASABLELAYER_H__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. USING_NS_CC;
  7.  
  8. // http://blog.csdn.net/linchaolong
  9. // 可擦除的Layer
  10. class ErasableLayer :public Layer
  11. {
  12. public:
  13. // 创建ErasableLayer
  14. //1.遮罩层
  15. //2.橡皮擦(可以是Sprite或者纹理的路径)
  16. static ErasableLayer* create(const char* layerPath,const char* erasaPath);
  17. static ErasableLayer* create(Node *layer,Sprite* erasa);
  18. static ErasableLayer* create(Node *layer,const char* erasaPath);
  19. static ErasableLayer* create(const char* layerPath,Sprite* erasa);
  20.  
  21. // 还原
  22. void clear();
  23. // 是否可擦除
  24. void setErasable(bool);
  25.  
  26. bool onTouchBegan(Touch* touch,Event *event);
  27. void onTouchesMoved(Touch* touch,Event *event);
  28. void onTouchEnded(Touch* touch,Event *event);
  29. protected:
  30. ErasableLayer();
  31. ~ErasableLayer();
  32.  
  33. bool init(Node *layer,Sprite* erasa);
  34. void tick(float);
  35. private:
  36. Node* layer_;
  37. Sprite* erasa_;
  38. bool isErasable_;
  39. RenderTexture* rt_;
  40. };
  41.  
  42. #endif
  1. #include "ErasableLayer.h"
  2.  
  3. ErasableLayer::ErasableLayer() :isErasable_(true)
  4. {
  5. }
  6.  
  7. ErasableLayer::~ErasableLayer()
  8. {
  9. CC_SAFE_RELEASE(layer_);
  10. CC_SAFE_RELEASE(erasa_);
  11. }
  12. ErasableLayer* ErasableLayer::create(const char* layerPath,const char* erasaPath)
  13. {
  14. CCSprite* layer = CCSprite::create(layerPath);
  15. CCSprite* erasa = CCSprite::create(erasaPath);
  16.  
  17. ErasableLayer* ret = new ErasableLayer;
  18. if (ret->init(layer,erasa))
  19. {
  20. ret->autorelease();
  21. return ret;
  22. }
  23. delete ret;
  24. return nullptr;
  25. }
  26.  
  27. ErasableLayer* ErasableLayer::create(Node* layer,Sprite* erasa)
  28. {
  29.  
  30. ErasableLayer* ret = new ErasableLayer;
  31. if (ret->init(layer,const char* erasaPath)
  32. {
  33. CCSprite* erasa = CCSprite::create(erasaPath);
  34. ErasableLayer* ret = new ErasableLayer;
  35. if (ret->init(layer,erasa))
  36. {
  37. ret->autorelease();
  38. return ret;
  39. }
  40. delete ret;
  41. return nullptr;
  42. }
  43.  
  44. ErasableLayer* ErasableLayer::create(const char* layerPath,Sprite* erasa)
  45. {
  46. CCSprite* layer = CCSprite::create(layerPath);
  47.  
  48. ErasableLayer* ret = new ErasableLayer;
  49. if (ret->init(layer,erasa))
  50. {
  51. ret->autorelease();
  52. return ret;
  53. }
  54. delete ret;
  55. return nullptr;
  56. }
  57.  
  58. bool ErasableLayer::init(Node *layer,Sprite* erasa)
  59. {
  60. if (!Layer::init())
  61. {
  62. return false;
  63. }
  64.  
  65. layer_ = layer;
  66. erasa_ = erasa;
  67.  
  68. layer_->retain();
  69. erasa_->retain();
  70.  
  71. this->setContentSize(layer_->getContentSize());
  72.  
  73. // 设置颜色混合模式
  74. BlendFunc erasaBf = { GL_ZERO,GL_ONE_MINUS_SRC_ALPHA }; //源因子:值为0,橡皮擦颜色为透明;目标因子:目标颜色透明度减去源颜色的透明度
  75. erasa_->setBlendFunc(erasaBf);
  76.  
  77. auto size = layer_->getContentSize();
  78. rt_ = RenderTexture::create(size.width,size.height);
  79. rt_->setAnchorPoint(Vec2(0,0));
  80. rt_->setPosition(Vec2(size.width/2,size.height/2));
  81. this->addChild(rt_);
  82.  
  83. clear();
  84.  
  85. schedule(CC_SCHEDULE_SELECTOR(ErasableLayer::tick));
  86.  
  87. // 触摸事件
  88. auto listener = EventListenerTouchOneByOne::create();
  89. listener->onTouchBegan = CC_CALLBACK_2(ErasableLayer::onTouchBegan,this);
  90. listener->onTouchMoved = CC_CALLBACK_2(ErasableLayer::onTouchesMoved,this);
  91. listener->onTouchEnded = CC_CALLBACK_2(ErasableLayer::onTouchEnded,this);
  92. _eventDispatcher->addEventListenerWithSceneGraPHPriority(listener,this);
  93. listener->setSwallowTouches(false);
  94.  
  95. return true;
  96. }
  97.  
  98. void ErasableLayer::tick(float)
  99. {
  100. if (!isErasable_)
  101. {
  102. return;
  103. }
  104. // 设置源颜色alpha值为最大值,目标颜色alpha值减去源颜色alpha值后就为0了,混合出来的效果就变透明了,这样就实现了橡皮擦效果了。
  105. erasa_->setOpacity(255);
  106.  
  107. // 更新RenderTexture
  108. rt_->begin();
  109. // 绘制
  110. erasa_->visit();
  111.  
  112. rt_->end();
  113. }
  114.  
  115. void ErasableLayer::clear()
  116. {
  117. layer_->setAnchorPoint(Vec2(0,0));
  118. layer_->setPosition(Vec2(0,0));
  119.  
  120. rt_->begin();
  121. layer_->visit();
  122. rt_->end();
  123. }
  124.  
  125. void ErasableLayer::setErasable(bool flag)
  126. {
  127. isErasable_ = flag;
  128. }
  129.  
  130. bool ErasableLayer::onTouchBegan(Touch* touch,Event *event)
  131. {
  132. erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
  133. return true;
  134. }
  135.  
  136. void ErasableLayer::onTouchesMoved(Touch* touch,Event *event)
  137. {
  138. erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
  139. }
  140.  
  141. void ErasableLayer::onTouchEnded(Touch* touch,Event *event)
  142. {
  143. erasa_->setPosition(this->convertToNodeSpace(touch->getLocation()));
  144. }
  145.  

猜你在找的Cocos2d-x相关文章