打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【玩转cocos2d-x之二十九】利用CCClipingNode做游戏遮罩

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/17160973


新手引导是游戏中必备的(除了奇葩的MT用一段动画开始),也是玩家对游戏的第一印象,重要性不言而喻。一般采用的遮罩的形式来突出引导重点,同时屏蔽其他功能。这里简单的介绍一下游戏遮罩的实现,并给出一个示例。


1.CCClipingNode

CCClipingNode是一个可裁剪节点,简单理解:

(1)首先它是一个节点,继承于CCNode,所以它可以像普通节点一样放入CCLayer,CCScene,CCNode中。

(2)作为节点,它就可以用作容器,承载其他节点和精灵。我把它叫底板。

(3)如果想要对一个节点进行裁剪,那需要给出裁剪的部分,这个裁剪区域,我把它叫模版。

所以CCClipingNode裁剪节点在组成上=底板+模版,而在显示上=底板-模版。不知道这样解释会不会好理解一点。



2.API

CCClipingNode的使用还是比较简单的,至于显示底板还是模版,alpha值的设定,这些也不好说清楚,自己多试几次就知道是什么意思该怎么用了。

  1. //不带模版地创建一个裁剪节点  
  2. static CCClippingNode* create();  
  3.   
  4. //使用一个节点作为模版创建裁剪节点  
  5. static CCClippingNode* create(CCNode *pStencil);  
  6.   
  7. //不带模版地初始化一个裁剪节点  
  8. virtual bool init();  
  9.   
  10. //使用一个节点作为模版初始化裁剪节点  
  11. virtual bool init(CCNode *pStencil);  
  12.   
  13. //设置/获取模版,注意模版需要retain!  
  14. CCNode* getStencil() const;  
  15. void setStencil(CCNode *pStencil);  
  16.   
  17. //设置alpha值(0~1),这个很重要,裁剪是按像素抠图的,所以只有大于这个alpha值的模版像素才会被画出来  
  18. //默认是1,也就是完全裁剪。  
  19. GLfloat getAlphaThreshold() const;  
  20. void setAlphaThreshold(GLfloat fAlphaThreshold);  
  21.   
  22. //默认是false,用于设置显示底板还是模版  
  23. bool isInverted() const;  
  24. void setInverted(bool bInverted);  

3.示例

在init中实现:

  1. CCSize visibleSize=CCDirector::sharedDirector()->getVisibleSize();  
  2.   
  3. CCSprite* background = CCSprite::create("HelloWorld.png");//创建背景  
  4. background->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));  
  5. this->addChild(background,kTagBackground);  
  6.   
  7. clip=CCClippingNode::create();//创建裁剪节点,成员变量  
  8. clip->setInverted(true);//设置底板可见  
  9. clip->setAlphaThreshold(0.0f);//设置alpha为0  
  10. this->addChild(clip,kTagClipNode);//添加裁剪节点  
  11.   
  12. CCLayerColor* back=CCLayerColor::create(ccc4(0,0,0,200));  
  13. clip->addChild(back);//为裁剪节点添加一个黑色带透明(看起了是灰色)的底板  
  14.   
  15. //模版如果要在其他地方使用要记得retain!  
  16.   
  17. //第一种:以下模型是drawnode遮罩  
  18. //CCDrawNode* front=CCDrawNode::create();  
  19. //ccColor4F yellow = {1, 1, 0, 1};  
  20. //CCPoint rect[4]={ccp(-30,30),ccp(30,30),ccp(30,-30),ccp(-30,-30)};  
  21. //front->drawPolygon(rect, 4, yellow, 0, yellow);  
  22. //front->setPosition(ccp(visibleSize.width/2, visibleSize.height/2));  
  23. //clip->setStencil(front);  
  24.   
  25. //第二种:以下模型是带图像遮罩  
  26. CCNode* nodef=CCNode::create();//创建模版  
  27. CCSprite* close=CCSprite::create("CloseSelected.png");//这里使用的是close的那个图标,所以注意观察效果图2  
  28. nodef->addChild(close);//在模版上添加精灵  
  29. nodef->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));  
  30. clip->setStencil(nodef);//设置模版  
  31.   
  32. tip = CCSprite::create("tip.png");//一些引导提示  
  33. tip->setScale(0.5f);  
  34. tip->setRotation(60);  
  35. tip->setPosition(ccp(visibleSize.width/2-70,visibleSize.height/2+50));  
  36. this->addChild(tip,kTagTip);  
  37.   
  38. tip->runAction(CCRepeatForever::create(CCSequence::create(CCScaleBy::create(0.25f,0.95f),CCScaleTo::create(0.25f,0.5),NULL)));  
  39.   
  40. this->setTouchEnabled(true);//触摸有效,落点正确时移除裁剪节点和提示,相关处理请看源码  

4.效果

两种效果:


       


5.源码

http://download.csdn.net/detail/jackyvincefu/6667189

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[转载]cocos2d
cocos2dx用裁剪区域CCClippingNode实现滚动字幕
防水节点大样图免费下载
Deep learning:九(Sparse Autoencoder练习)
cocos2d框架介绍
请问,地下室顶板是不是一层的底板?一层的顶板就是二层的底板?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服