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

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

思路和上一篇(利用裁剪节点生成)一样。现在师范下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;
				else
				sTxt->_mNodes.pushBack(pNow);
				pNow=va_arg(lst,Node*);
			}
			else
				break;
		}
		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",GlyphCollection::DYNAMIC,nullptr,true); return ttfConfig;}},//	{FONT_TYPE::SLIM,true); return ttfConfig;}}
	//};	
	//auto ttf = ttfConfigs[(int)mType].callTTF();
	////TTFConfig ttf("fonts/HKYuanMini.ttf","应用名称");
	//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();
}

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