cocos2dx 3.2下利用裁剪节点实现跑马灯滚动效果

前端之家收集整理的这篇文章主要介绍了cocos2dx 3.2下利用裁剪节点实现跑马灯滚动效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

以前利用过ScrollView设置跑马灯效果。现在利用cocos2dx内置的ClippingNode也可以实现。

首先原理是什么呢?

将节点A用ClippingNode对象C的setStencil(A)方法设置,然后设置其透明度,

那么ClippingNode对象C再通过addChild添加B,则B将会仅显示A遮罩的部分。

然后移动B,则形成滚动。

当然了,如果你嫌我啰嗦或者描述不清的话,可以直达官网查看→相应文档←。


好了,步兵无真相。骑兵送上。

希望童鞋们发现知识的不足或者好的建议或者意见能够提醒小弟一下,毕竟菜鸟一枚。

文件

  1. /****************************************************************************
  2. Copyright (c) 2014-10-11 Real.xm
  3. Create by q229827701
  4. http://blog.csdn.net/q229827701
  5. ****************************************************************************/
  6. #pragma once
  7. #include "cocos2d.h"
  8. class ScrollText:public cocos2d::Node
  9. {
  10. public:
  11. CREATE_FUNC(ScrollText);
  12.  
  13. /**
  14. @pragma pMask 需要用于遮罩的精灵
  15. @pragma pMoveChild 需要移动的Node
  16. @pragma otherChid 其他需要显示的Node
  17. */
  18. static ScrollText* create(cocos2d::Sprite* &pMask,cocos2d::Node* &pMoveChild,cocos2d::Node* &otherChild,...);
  19. /**
  20. @pragma isScroll 设置是否需要自动滚动
  21. @pragma byWidth 设置是否需要根据长度来滚动
  22. PS:如果按照长度来设置,则长度小于遮罩长度的将不予滚动
  23. */
  24. void setAutoScroll(bool isScroll,bool byWidth=false);
  25. CC_CONSTRUCTOR_ACCESS:
  26. ScrollText();
  27. virtual ~ScrollText();
  28. virtual bool init();
  29. virtual bool initWithDatas(cocos2d::Sprite* &pMask,cocos2d::Node* &pMoveChild);
  30. bool initClipper(cocos2d::Sprite* &pMask,cocos2d::Node* &pMoveChild);
  31. void update(float delta);
  32.  
  33. private:
  34. cocos2d::Node* _mLable;
  35. cocos2d::Vector<Node*> _mNodes;
  36. bool _autoScroll;
  37. };

文件
  1. #include "ScrollText.h"
  2. USING_NS_CC;
  3. #define IF_RETURN(cont,p) if ((cont)){return (p);}
  4. #define IF_RETURN_FALSE(cont) IF_RETURN(cont,false)
  5. bool ScrollText::init()
  6. {
  7. bool ret = true;
  8. if (Node::init())
  9. {
  10. auto pMask = Sprite::create("text/switch-mask.png");
  11. _mLable = Label::createWithSystemFont("Title","Arial-BoldMT",16);
  12. _mLable->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
  13. IF_RETURN_FALSE(!initClipper(pMask,_mLable));
  14. scheduleUpdate();
  15. setAutoScroll(true);
  16. return ret;
  17. }
  18. return ret;
  19. }
  20.  
  21. bool ScrollText::initClipper( cocos2d::Sprite* &pMask,cocos2d::Node* &pMoveChild)
  22. {
  23. auto clipper = ClippingNode::create();
  24. IF_RETURN_FALSE(!clipper);
  25. IF_RETURN_FALSE(!pMask);
  26. setContentSize(pMask->getContentSize());
  27. IF_RETURN_FALSE(!pMask->getTexture());
  28. auto _clipperStencil = Sprite::createWithTexture(pMask->getTexture());
  29. IF_RETURN_FALSE(!_clipperStencil);
  30. _clipperStencil->retain();
  31. clipper->setAlphaThreshold(0.1f);
  32. clipper->setStencil(_clipperStencil);
  33. clipper->addChild(pMoveChild,1);
  34. addChild(clipper);
  35. for (auto child:_mNodes)
  36. {
  37. IF_RETURN_FALSE(!child);
  38. clipper->addChild(child);
  39. }
  40. return true;
  41. }
  42.  
  43. ScrollText::ScrollText():_autoScroll(false)
  44. {
  45.  
  46. }
  47.  
  48.  
  49. ScrollText::~ScrollText()
  50. {
  51. CC_SAFE_RELEASE(_mLable);
  52. }
  53.  
  54. void ScrollText::update( float delta )
  55. {
  56. if (!_mLable)
  57. {
  58. return;
  59. }
  60. float currentX = _mLable->getPositionX();
  61. float contentX = getContentSize().width*(-1.0f);
  62. float lableX = _mLable->getContentSize().width*(-1.0f);
  63.  
  64. if (_autoScroll)
  65. {
  66. if(_mLable->getPositionX()>=(lableX+contentX/2))
  67. _mLable->setPositionX(_mLable->getPositionX()-0.25f);
  68. else
  69. {
  70. _mLable->setPositionX(-contentX/2);
  71. }
  72. }
  73. else
  74. {
  75. _mLable->setPositionX(contentX/2);
  76. }
  77. }
  78.  
  79. void ScrollText::setAutoScroll( bool isScroll,bool byWidth/*=false*/ )
  80. {
  81. if (!byWidth)
  82. {
  83. _autoScroll = isScroll;
  84. }
  85. else
  86. {
  87. _autoScroll=_mLable->getContentSize().width>getContentSize().width?true:false;
  88. }
  89. }
  90.  
  91. ScrollText* ScrollText::create( cocos2d::Sprite* &pMask,... )
  92. {
  93. auto *sTxt = new ScrollText();
  94. if (sTxt )
  95. {
  96. va_list lst;
  97. va_start(lst,otherChild);
  98. Node* pNow;
  99. pNow=otherChild;
  100. while(otherChild)
  101. {
  102. if (pNow)
  103. {
  104. sTxt->_mNodes.pushBack(pNow);
  105. pNow=va_arg(lst,Node*);
  106. }
  107. else
  108. break;
  109. }
  110. va_end(lst);
  111. if(sTxt->initWithDatas(pMask,pMoveChild))
  112. {
  113. sTxt->autorelease();
  114. return sTxt;
  115. }
  116. else
  117. {
  118. delete sTxt;
  119. sTxt = NULL;
  120. return NULL;
  121. }
  122. }
  123. else
  124. {
  125. delete sTxt;
  126. sTxt = NULL;
  127. return NULL;
  128. }
  129. }
  130.  
  131. bool ScrollText::initWithDatas( cocos2d::Sprite* &pMask,cocos2d::Node* &pMoveChild)
  132. {
  133. bool ret = false;
  134. if (Node::init())
  135. {
  136. IF_RETURN_FALSE(!pMask);
  137. _mLable = pMoveChild;
  138. _mLable->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
  139. initClipper(pMask,_mLable);
  140. scheduleUpdate();
  141. return true;
  142. }
  143. return ret;
  144. }
  145.  

效果如图所示:

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