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");
}