cocos2dx achieves the scraping effect

  • 2020-06-12 10:06:49
  • OfStack

This article example Shared cocos2dx scraping effect realization code for everybody reference, the specific content is as follows

The raffle effect is actually quite simple, you need to use RenderTexture to render, through the layer you want to render, the color of the layer can be set and mixed to achieve the effect, see the code, I used lua to achieve.


local winsize = cc.Director:sharedDirector():getWinSize(); 
local dataSprite = cc.Sprite:create("Star.png")-- I'm going to scratch this out  
dataSprite:setAnchorPoint(cc.p(0.5, 0.5)); 
dataSprite:move(winsize.width / 2.0, winsize.height / 2.0); 
self:addChild(dataSprite) 
 
pEarse = cc.DrawNode:create() 
pEarse:drawDot(cc.p(0, 0), 5, cc.c4f(1, 0, 0, 1)); 
pEarse:retain() 
 
pRTex = cc.RenderTexture:create(winsize.width, winsize.height); 
pRTex:setPosition(cc.p(winsize.width / 2, winsize.height / 2)); 
--this:addChild(pRTex); 
pRTex:retain() 
 
local pBg = cc.Sprite:create("d1.png");-- This serves as a "paint layer"  
pBg:setAnchorPoint(cc.p(0.5, 0.5)); 
pBg:move(winsize.width / 2.0, winsize.height / 2.0); 
 
pRTex:begin(); 
dataSprite:visit(); 
pBg:visit(); 
pRTex:endToLua(); 
local layer=cc.Layer:create() 
self:addChild(layer, 1000) 
layer:addChild(pRTex); 
layer:setNodeTouch(handler(self, self.onTouchStart)) 

Mouse movement code:


function shop.erasure(event) 
 -- body 
 print("erasure: ", event.name) 
 --todo 
 print("moved") 
 local touchPoint = event.pos 
 pEarse:setPosition(event.pos.x, event.pos.y); 
 --  Set mixed mode  
 local blendFunc = { GL_ONE, GL_ZERO }; 
 pEarse:setBlendFunc(blendFunc); 
 --  The eraser pixels are rendered on the canvas and mixed with the original pixels  
 pRTex:begin(); 
 pEarse:visit(); 
 pRTex:endToLua(); 
  
end 

C + + code:


void function()

{

  //test code 
  auto aPanelSprite = Sprite::create("potentiometerTrack.png"); 
  aPanelSprite->setPosition(Vec2(s.width / 2, s.height / 2)); 
  this->addChild(aPanelSprite); 
 
  pEase = DrawNode::create(); 
  pEase->retain(); 
  pEase->drawDot(Point(0, 0), 4.0f, Color4F(255, 0, 0, 255)); 
 
  pRender = RenderTexture::create(s.width, s.height); 
  pRender->retain(); 
  pRender->setPosition(Vec2(s.width / 2, s.height / 2)); 
  this->addChild(pRender); // To render the texture layer add the parent node layer  
 
 
 auto pBg = Sprite::create("potentiometerProgress.png"); // This serves as a "paint layer"  
 pBg->setAnchorPoint(Point(0.5, 0.5)); 
 pBg->setPosition(Vec2(s.width / 2, s.height / 2)); 
 
 pRender->begin(); 
 aPanelSprite->visit(); 
 pBg->visit(); 
 pRender->end(); 
 
 auto listener = EventListenerTouchOneByOne::create(); 
 listener->setSwallowTouches(true); 
 
 listener->onTouchBegan = CC_CALLBACK_2(SpriteEaseBezier::onTouchBegan, this); 
 listener->onTouchMoved = CC_CALLBACK_2(SpriteEaseBezier::onTouchMoved, this); 
 
 auto _eventDispatcher = CCDirector::getInstance()->getEventDispatcher(); 
 _eventDispatcher->addEventListenerWithFixedPriority(listener, -10); 
} 
 
bool SpriteEaseBezier::onTouchBegan(Touch *touch, Event *unused_event) 
{ 
 CCLOG("SpriteEaseBezier::onTouchBegan"); 
 return true; 
} 
 
void SpriteEaseBezier::onTouchMoved(Touch *touch, Event *unused_event) 
{ 
 auto touchPoint = touch->getLocation(); 
 pEase->setPosition(touchPoint.x, touchPoint.y); 
 
 BlendFunc blendFunc = { GL_ONE, GL_ZERO }; 
 pEase->setBlendFunc(blendFunc); 
 
 pRender->begin(); 
 pEase->visit(); 
 pRender->end(); 
 CCLOG("SpriteEaseBezier::onTouchMoved"); 
} 


Related articles: