游戏中我们经常要用到按页翻动的滚动控件。
要自己实现也很简单,继承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
有问题欢迎网友留言指教!