cocos2dx 3.2下利用ui::scrollView实现跑马灯滚动效果

来源:互联网 发布:javamail smtp 端口 编辑:程序博客网 时间:2024/04/28 15:21

思路和上一篇(利用裁剪节点生成)一样。现在师范下ui::scrollView 实现跑马灯,注:可以是文本跑马灯也可以是其他Node.


那么废话就暂不说了,先上代码

头文件

/**************************************************************************** Copyright (c) 2014-10-11 Real.xm Create by q229827701 http://blog.csdn.net/q229827701 ****************************************************************************/#pragma once#include "cocos2d.h"#include "ui/UIScrollView.h"class ScrollText:public cocos2d::Node{public:enum class FONT_TYPE{BOLD,NOMAL,SLIM};public:CREATE_FUNC(ScrollText);/**@pragma  pMoveChild 需要移动的Node@pragma  otherChid 其他需要显示的Node*/static ScrollText* create(cocos2d::Node* pMoveChild,...);static ScrollText* create(FONT_TYPE mType);/**@pragma  isScroll 设置是否需要自动滚动@pragma  byWidth 设置是否需要根据长度来滚动PS:如果按照长度来设置,则长度小于遮罩长度的将不予滚动*/void setAutoScroll(bool isScroll,bool byWidth=false);CC_CONSTRUCTOR_ACCESS:ScrollText();virtual ~ScrollText();virtual bool init();virtual bool initWithDatas(cocos2d::Node* &pMoveChild);virtual bool init(FONT_TYPE mType);bool initLable(FONT_TYPE mType);bool initScroll();void update(float delta);virtual void onEnterTransitionDidFinish();CC_SYNTHESIZE_READONLY(cocos2d::Node*,_mLable,Lable);CC_SYNTHESIZE_READONLY(cocos2d::Size,_mSize,TextSize);CC_SYNTHESIZE(std::string,_content,Content);public:void setSize(const cocos2d::Size &size);private:cocos2d::Vector<Node*> _mNodes;bool _autoScroll;bool _byWidth;cocos2d::ui::ScrollView* _scrollView;};


源文件

#include "ScrollText.h"#include "ui/UIScrollView.h"USING_NS_CC;#define IF_RETURN(cont,p) if ((cont)){return (p);}#define IF_RETURN_FALSE(cont) IF_RETURN(cont,false)ScrollText::ScrollText():_autoScroll(false),_byWidth(false),_mLable(nullptr),_content("content"),_scrollView(nullptr),_mSize(120,40){}ScrollText::~ScrollText(){CC_SAFE_RELEASE(_mLable);CC_SAFE_RELEASE(_scrollView);}bool ScrollText::init(){IF_RETURN_FALSE(!init(FONT_TYPE::NOMAL));return true;}bool ScrollText::init( FONT_TYPE mType ){bool ret = false;if (Node::init()){IF_RETURN_FALSE(!initLable(mType));IF_RETURN_FALSE(!initScroll());return true;}return ret;}bool ScrollText::initScroll(){_scrollView = ui::ScrollView::create();IF_RETURN_FALSE(!_scrollView);_scrollView->setContentSize(_mSize);addChild(_scrollView);this->setContentSize(_scrollView->getContentSize());for (auto child:_mNodes){IF_RETURN_FALSE(!child);_scrollView->addChild(child);}IF_RETURN_FALSE(!_mLable);_scrollView->addChild(_mLable);return true;}void ScrollText::update( float delta ){//log("ScrollText::update");if (!_mLable){return;}float currentX = _mLable->getPositionX();float contentX = getContentSize().width*(-1.0f);float lableX = _mLable->getContentSize().width*(-1.0f);if(_byWidth){_autoScroll = _mLable->getContentSize().width>getContentSize().width?true:false;}if (_autoScroll){if(_mLable->getPositionX()>=lableX)_mLable->setPositionX(_mLable->getPositionX()-1.0f);else{_mLable->setPositionX(-contentX);}}else{_mLable->setPositionX(0);}auto label = dynamic_cast<Label*>(_mLable);if(label&&label->getString()!=_content){label->setString(_content);}}void ScrollText::setAutoScroll( bool isScroll,bool byWidth/*=false*/ ){_byWidth = byWidth;       if(isScroll&&byWidth)   {_autoScroll = _mLable->getContentSize().width>getContentSize().width?true:false;   }   else_autoScroll = isScroll;}ScrollText* ScrollText::create(cocos2d::Node* pMoveChild,... ){auto *sTxt = new ScrollText(); if (sTxt ) { va_list lst;va_start(lst,pMoveChild);Node* pNow;pNow=pMoveChild;bool isFirst = true;while(pMoveChild){if (nullptr!=pNow){if(isFirst)isFirst = false;elsesTxt->_mNodes.pushBack(pNow);pNow=va_arg(lst,Node*);}elsebreak;}va_end(lst);if(sTxt->initWithDatas(pMoveChild)){sTxt->autorelease(); return sTxt; }else{delete sTxt; sTxt = NULL; return NULL; }} else { delete sTxt; sTxt = NULL; return NULL; } }ScrollText* ScrollText::create( FONT_TYPE mType ){auto text = new ScrollText();if(text&&text->init(mType)){text->autorelease();return text;}else{delete text;text = nullptr;return nullptr;}}bool ScrollText::initWithDatas(cocos2d::Node* &pMoveChild){bool ret = false;if (Node::init()){IF_RETURN_FALSE(!pMoveChild);_mLable = pMoveChild;_mLable->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);IF_RETURN_FALSE(!initScroll());//scheduleUpdate();return true;}return ret;}void ScrollText::setSize( const cocos2d::Size &size ){_mSize = size;_scrollView->setContentSize(_mSize);this->setContentSize(_mSize);}bool ScrollText::initLable( FONT_TYPE mType ){//typedef struct//{//FONT_TYPE font_type;//std::function<TTFConfig()> callTTF;//} TTFModel;//TTFModel ttfConfigs[]={//{FONT_TYPE::BOLD,[](){ TTFConfig ttfConfig("fonts/HKYuanMini.ttf",30,GlyphCollection::CUSTOM, "应用名称");return ttfConfig;}},//{FONT_TYPE::NOMAL,[](){TTFConfig ttfConfig("fonts/arial.ttf", 30, GlyphCollection::DYNAMIC,nullptr,true); return ttfConfig;}},//{FONT_TYPE::SLIM,[](){TTFConfig ttfConfig("fonts/arial.ttf", 30, GlyphCollection::DYNAMIC,nullptr,true); return ttfConfig;}}//};//auto ttf = ttfConfigs[(int)mType].callTTF();////TTFConfig ttf("fonts/HKYuanMini.ttf",30,GlyphCollection::CUSTOM, "应用名称");//IF_RETURN_FALSE(!&ttf);//_mLable = Label::createWithTTF(ttf,"content", TextHAlignment::LEFT,_mSize.width);_mLable = Label::createWithSystemFont("content","Arial Bold",40);IF_RETURN_FALSE(!_mLable);_mLable->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);_mLable->retain();return true;}void ScrollText::onEnterTransitionDidFinish(){scheduleUpdate();}


0 0
原创粉丝点击