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

原创 2014年10月30日 14:33:06

思路和上一篇(利用裁剪节点生成)一样。现在师范下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", 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();
}


Lua中调用 Cocos2d-x 中的滑动条 ScrollView

ScrollView

只为菜鸟 cocos2dx-lua 实现Scrollview (vs2013)

以前自己是学quick lua的 现在改用原型的lua了 所以整理一些资料,为初学者提供方便。当然你也可以去看lua-tests里面也很详细。 首先创建scrollview local scrol...

cocos2dx-lua ScrollView的第一次编写

cocos2dx里的滚动层 ScrollView!第一次写,终于能正常用了,后面可能需要完善

Cocos2d-lua嵌套使用ScrollView的方案

Cocos2d-x嵌套使用ScrollView的方案 比较典型的是皇室战争的UI设计,上下可以滚动,左右可以翻页 假设我们做一个PageView内嵌套ScrollView的UI,直接使用组件,会产...

Lua中调用 cocos2d-x 的滑动条/滚动条 ScrollView

 ScrollView        我想玩儿过手机的朋友对滑动条都不陌生吧,(旁边: 这不是废话么???? )               那好吧,废话不多说直接开始ScrollView吧...

cocos2dx-ScrollView和 ListView、PageView控件的使用

这篇记录了三个控件的使用流程:ScrollView和 ListView、PageView。 ScrollView ScrollView这个控件大家应该挺熟的吧,反正我是经常用到...

cocos2dx 3.3 scrollView lua 版本幻灯片效果

----- 需求 1.实现很多网站的图片左右循环滚动效果 2.当手移动到上面的时候,自动滑动暂停一段时间 3.当手在图片上移动一段距离的时候,图片跟随翻页(一次切一张图片)。 ...

利用ScrollView实现跑马灯效果

本文部分代码来自http://blog.csdn.net/q229827701/article/details/39996171,在此基础上稍作修改,并添加了详细注释。 1、ScrollText类...

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

以前利用过ScrollView设置跑马灯效果。现在利用

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx 3.2下利用ui::scrollView实现跑马灯滚动效果
举报原因:
原因补充:

(最多只允许输入30个字)