自定义按页翻动的CCScrollView

游戏中我们经常要用到按页翻动的滚动控件。

要自己实现也很简单,继承CCScrollView,在ccTouchEnded中调整位置即可

下面是我自己试下的CTPageScrollView。已经提供了lua回调方法的接口

并且可以设置横着或者垂直按页翻动

CTPageScrollView.h

#ifndef _H_CTPAGESCROLLVIEW_H_
#define _H_CTPAGESCROLLVIEW_H_

#include "cocos2d.h"
#include "GUI\CCScrollView\CCScrollView.h"
#include "CTPageNumber.h"

USING_NS_CC;
USING_NS_CC_EXT;



class CTPageScrollView : public CCScrollView
{
public:
	CTPageScrollView();
	virtual ~CTPageScrollView();

	bool init();
	static CTPageScrollView* create();

	//virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
	void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
	//设置翻页滚动后的回调函数
	void setPageChangedCallBack(CCObject* target, SEL_SCHEDULE selector);
	//lua里面调用的
	void setPageChangedCallBack(int nHandler);

	//设置页面大小
	void setPageSize(CCSize pageSize);
	//设置调整位置时候的动画速度
	void setSpeed(int speed);
	//移动到指定页
	void scrollToPage(int page, float duration);
	

private:

	//页大小
	CCSize m_pageSize;
	//调整位置时动画的移动速度
	int m_speed;
	//当前页
	int m_currentPage;
	//回调方法
	SEL_SCHEDULE m_callBack;
	CCObject* m_target;
	int m_nScriptHandler;

	//调用回调函数
	void callHandler();
}

#endif

CTPageScrollView.cpp

#include "CTPageScrollView.h"
;
CTPageScrollView::CTPageScrollView():
	m_pageSize(CCSizeMake(100, 100)),
	m_speed(800),
	m_currentPage(1),
	m_target(NULL),
	m_callBack(NULL)
{

}

CTPageScrollView::~CTPageScrollView()
{
	if (m_nScriptHandler)
	{
		cocos2d::CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptHandler(m_nScriptHandler);
	}
	CC_SAFE_RELEASE(m_target);
}

bool CTPageScrollView::init()
{
	CCScrollView::init();
	return true;
}

CTPageScrollView* CTPageScrollView::create()
{
	CTPageScrollView *pRet = new CTPageScrollView();
	if (pRet && pRet->init()) 
	{ 
		pRet->autorelease(); 
		return pRet; 
	} 
	else 
	{ 
		delete pRet; 
		pRet = NULL; 
		return NULL; 
	} 
}


void CTPageScrollView::setPageSize(CCSize pageSize)
{
	m_pageSize = pageSize;
}

void CTPageScrollView::setSpeed(int speed)
{
	m_speed = speed;
}

void CTPageScrollView::setPageChangedCallBack(int nHandler)
{
	m_nScriptHandler = nHandler;
}

void CTPageScrollView::setPageChangedCallBack(CCObject* target, SEL_SCHEDULE selector)
{
	m_target = target;
	m_target->retain();
	m_callBack = selector;
	
}

void CTPageScrollView::scrollToPage(int page, float duration)
{
	if(page != m_currentPage)
	{
		m_currentPage = page;
		if(kCCScrollViewDirectionHorizontal == this->getDirection())
		{
			CCPoint adjustPos = ccp(-m_pageSize.width * (page - 1), 0);
			this->setContentOffsetInDuration(adjustPos, duration);
		}
		else if(kCCScrollViewDirectionVertical == this->getDirection())
		{
			CCPoint adjustPos = ccp(0, -m_pageSize.height * (page - 1));
			this->setContentOffsetInDuration(adjustPos, duration);
		}
	}
}

//调用回调
void CTPageScrollView::callHandler()
{
	if(m_callBack)
	{
		(m_target->*m_callBack)(m_currentPage);
	}
	if (m_nScriptHandler) 
	{
		CCScriptEngineManager::sharedManager()->getScriptEngine()->executeSchedule(m_nScriptHandler, m_currentPage);
	}
}



void CTPageScrollView::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
	
	CCScrollView::ccTouchEnded(pTouch, pEvent);
	if(kCCScrollViewDirectionHorizontal == this->getDirection() || kCCScrollViewDirectionVertical == this->getDirection())
	{
		// 关闭CCScrollView中的自调整
		this->unscheduleAllSelectors();
		// 调整位置
		CCPoint adjustPos;
		// 调整动画时间
		float adjustAnimDelay;
		float offset = 0;

		//水平方向滚动
		if(kCCScrollViewDirectionHorizontal == this->getDirection())
		{	
			int x = this->getContentOffset().x;
			offset =  x % (int)m_pageSize.width;

			if (offset < -m_pageSize.width / 2) {
				// 计算下一页位置,时间
				adjustPos = ccpSub(this->getContentOffset(), ccp(m_pageSize.width + offset, 0));
				adjustAnimDelay = (float) (m_pageSize.width + offset) / m_speed;
			}
			else {
				// 计算当前页位置,时间
				adjustPos = ccpSub(this->getContentOffset(), ccp(offset, 0));
				// 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数
				adjustAnimDelay = (float) abs(offset) / m_speed;
			}

			if(abs(adjustPos.x) > this->getContentSize().width - m_pageSize.width)
			{
				adjustPos.x = -(this->getContentSize().width - m_pageSize.width);
			}
			// 调整位置
			this->setContentOffsetInDuration(adjustPos, adjustAnimDelay);
			
			int newPage = abs(adjustPos.x / m_pageSize.width) + 1;
			if(m_currentPage != newPage)
			{
				m_currentPage = newPage;
				callHandler();
			}
			
		}
		//垂直方向滚动
		else
		{
			int y = this->getContentOffset().y;
			offset =  y % (int)m_pageSize.height;

			if (offset < -m_pageSize.height / 2) 
			{
				// 计算下一页位置,时间
				adjustPos = ccpSub(this->getContentOffset(), ccp(0, m_pageSize.height + offset));
				adjustAnimDelay = (float) (m_pageSize.height + offset) / m_speed;
			}
			else {
				// 计算当前页位置,时间
				adjustPos = ccpSub(this->getContentOffset(), ccp(0, offset));
				// 这里要取绝对值,否则在第一页往左翻动的时,保证adjustAnimDelay为正数
				adjustAnimDelay = (float) abs(offset) / m_speed;
			}

			if(abs(adjustPos.y) > this->getContentSize().height - m_pageSize.height)
			{
				adjustPos.y = -(this->getContentSize().height - m_pageSize.height);
			}
			// 调整位置
			this->setContentOffsetInDuration(adjustPos, adjustAnimDelay);
			int newPage = abs(adjustPos.y / m_pageSize.height) + 1;
			if(newPage != m_currentPage)
			{
				callHandler();
			}
		}
	}
}

 

转载请注明:http://blog.csdn.net/atsoar/article/details/10050429


有问题欢迎网友留言指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值