cocos2dx刮奖效果实现

本文详细介绍了如何使用RenderTexture来实现刮奖效果,并通过Lua语言实现代码演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刮奖效果其实挺简单的,需要用到RenderTexture来进行渲染,通过你所要渲染的图层,把该层的颜色进行设置混合就可以达到效果,具体看代码,我用的lua实现的。

[cpp]  view plain  copy
  1. local winsize = cc.Director:sharedDirector():getWinSize();  
  2. local dataSprite = cc.Sprite:create("Star.png")--要把这个图片刮出来  
  3. dataSprite:setAnchorPoint(cc.p(0.5, 0.5));  
  4. dataSprite:move(winsize.width / 2.0, winsize.height / 2.0);  
  5. self:addChild(dataSprite)  
  6.   
  7. pEarse = cc.DrawNode:create()  
  8. pEarse:drawDot(cc.p(0, 0), 5, cc.c4f(1, 0, 0, 1));  
  9. pEarse:retain()  
  10.   
  11. pRTex = cc.RenderTexture:create(winsize.width, winsize.height);  
  12. pRTex:setPosition(cc.p(winsize.width / 2, winsize.height / 2));  
  13. --this:addChild(pRTex);  
  14. pRTex:retain()  
  15.   
  16. local pBg = cc.Sprite:create("d1.png");--这个作为当“油漆层”  
  17. pBg:setAnchorPoint(cc.p(0.5, 0.5));  
  18. pBg:move(winsize.width / 2.0, winsize.height / 2.0);  
  19.   
  20. pRTex:begin();  
  21. dataSprite:visit();  
  22. pBg:visit();  
  23. pRTex:endToLua();  
  24. local layer=cc.Layer:create()  
  25. self:addChild(layer, 1000)  
  26. layer:addChild(pRTex);  
  27. layer:setNodeTouch(handler(self, self.onTouchStart))  
鼠标移动代码:



[cpp]  view plain  copy
  1. function shop.erasure(event)  
  2.     -- body  
  3.     print("erasure: ", event.name)  
  4.     --todo  
  5.     print("moved")  
  6.     local touchPoint = event.pos  
  7.     pEarse:setPosition(event.pos.x, event.pos.y);  
  8.     -- 设置混合模式  
  9.     local blendFunc = { GL_ONE, GL_ZERO };  
  10.     pEarse:setBlendFunc(blendFunc);  
  11.     -- 将橡皮擦的像素渲染到画布上,与原来的像素进行混合  
  12.     pRTex:begin();  
  13.     pEarse:visit();  
  14.     pRTex:endToLua();  
  15.       
  16. end  


C++代码:

void function()

{

[cpp]  view plain  copy
  1.      //test code  
  2.      auto aPanelSprite = Sprite::create("potentiometerTrack.png");  
  3.      aPanelSprite->setPosition(Vec2(s.width / 2, s.height / 2));  
  4.      this->addChild(aPanelSprite);  
  5.   
  6.      pEase = DrawNode::create();  
  7.      pEase->retain();  
  8.      pEase->drawDot(Point(0, 0), 4.0f, Color4F(255, 0, 0, 255));  
  9.   
  10.      pRender = RenderTexture::create(s.width, s.height);  
  11.      pRender->retain();  
  12.      pRender->setPosition(Vec2(s.width / 2, s.height / 2));  
  13.      this->addChild(pRender); //渲染纹理层需加入该父节点层  
  14.   
  15.   
  16.     auto pBg = Sprite::create("potentiometerProgress.png"); //这个作为当“油漆层”  
  17.     pBg->setAnchorPoint(Point(0.5, 0.5));  
  18.     pBg->setPosition(Vec2(s.width / 2, s.height / 2));  
  19.   
  20.     pRender->begin();  
  21.     aPanelSprite->visit();  
  22.     pBg->visit();  
  23.     pRender->end();  
  24.   
  25.     auto listener = EventListenerTouchOneByOne::create();  
  26.     listener->setSwallowTouches(true);  
  27.   
  28.     listener->onTouchBegan = CC_CALLBACK_2(SpriteEaseBezier::onTouchBegan, this);  
  29.     listener->onTouchMoved = CC_CALLBACK_2(SpriteEaseBezier::onTouchMoved, this);  
  30.   
  31.     auto _eventDispatcher = CCDirector::getInstance()->getEventDispatcher();  
  32.     _eventDispatcher->addEventListenerWithFixedPriority(listener, -10);  
  33. }  
  34.   
  35. bool SpriteEaseBezier::onTouchBegan(Touch *touch, Event *unused_event)  
  36. {  
  37.     CCLOG("SpriteEaseBezier::onTouchBegan");  
  38.     return true;  
  39. }  
  40.   
  41. void SpriteEaseBezier::onTouchMoved(Touch *touch, Event *unused_event)  
  42. {  
  43.     auto touchPoint = touch->getLocation();  
  44.     pEase->setPosition(touchPoint.x, touchPoint.y);  
  45.   
  46.     BlendFunc blendFunc = { GL_ONE, GL_ZERO };  
  47.     pEase->setBlendFunc(blendFunc);  
  48.   
  49.     pRender->begin();  
  50.     pEase->visit();  
  51.     pRender->end();  
  52.     CCLOG("SpriteEaseBezier::onTouchMoved");  
  53. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值