coco2d-x CCScrollView实现背包翻页,仅供参考

#include "CCCGameScrollView.h"



USING_NS_CC;

USING_NS_CC_EXT;



CCCGameScrollView::CCCGameScrollView()

:m_fAdjustSpeed(ADJUST_ANIM_VELOCITY)

, m_nPrePage(0)

{

    

}



CCCGameScrollView::~CCCGameScrollView()

{

    

}



bool CCCGameScrollView::init()

{

    if (!CCScrollView::init())

    {

        return false;

    }

    

    return true;

}



bool CCCGameScrollView::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )

{

    m_BeginOffset = getContentOffset();

    return CCScrollView::ccTouchBegan(pTouch, pEvent);

}



void CCCGameScrollView::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )

{

    CCScrollView::ccTouchMoved(pTouch, pEvent);

}



void CCCGameScrollView::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )

{

    CCPoint touchPoint = pTouch->getLocationInView();

    touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint );

    

    CCScrollView::ccTouchEnded(pTouch, pEvent);

    

    CCPoint m_EndOffset=getContentOffset();

    

    if (m_BeginOffset.equals(m_EndOffset))

    {

        int nPage = abs(m_EndOffset.x / (int)m_CellSize.width);

        m_pDelegate->scrollViewClick(nPage);

      //  pDele->scrollViewClick(m_EndOffset,touchPoint,m_pContainer->getChildByTag(nPage),nPage);

        return ;

    }

    

    adjustScrollView(m_BeginOffset,m_EndOffset);

}



void CCCGameScrollView::ccTouchCancelled( CCTouch *pTouch, CCEvent *pEvent )

{

    CCScrollView::ccTouchCancelled(pTouch, pEvent);

    

    CCPoint m_EndOffset=getContentOffset();

    adjustScrollView(m_BeginOffset,m_EndOffset);

}



void CCCGameScrollView::adjustScrollView( const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd)

{

    

    int nPage = abs(oBegin.x / (int)m_CellSize.width);

    

    int nAdjustPage = 0;

    

    int nDis = oEnd.x-oBegin.x;

    

    if (nDis<-getViewSize().width/5)

    {

        nAdjustPage=nPage+1;

    }

    else if (nDis>getViewSize().width/5)

    {

        nAdjustPage=nPage-1;

    }

    else

    {

        nAdjustPage=nPage;

    }

    

    nAdjustPage=MIN(nAdjustPage,m_nPageCount-1);

    nAdjustPage=MAX(nAdjustPage,0);

    

    scrollToPage(nAdjustPage);

}



void CCCGameScrollView::scrollToPage( int nPage )

{

    // 关闭CCScrollView中的自调整

    unscheduleAllSelectors();

    

    CCPoint oOffset=getContentOffset();

    // 调整位置

    CCPoint adjustPos=ccp(-m_CellSize.width*nPage,0);

    

    // 调整动画时间

    float adjustAnimDelay=ccpDistance(adjustPos,oOffset)/m_fAdjustSpeed;

    

    // 调整位置

    setContentOffsetInDuration(adjustPos, adjustAnimDelay);

    

    if (nPage!=m_nPrePage)

    {

        schedule(schedule_selector(CCCGameScrollView::onScrollEnd),adjustAnimDelay,0,0.0f);

        m_nPrePage=nPage;

    }

}



void CCCGameScrollView::onScrollEnd(float fDelay)

{

    int nPage=getCurPage();

    m_pDelegate->scrollViewScrollEnd(nPage);

}



void CCCGameScrollView::scrollToNextPage()

{

    int nCurPage=getCurPage();

    if (nCurPage>=m_nPageCount-1)

    {

        return ;

    }

    scrollToPage(nCurPage+1);

}



void CCCGameScrollView::scrollToPrePage()

{

    int nCurPage=getCurPage();

    if (nCurPage<=0)

    {

        return ;

    }

    scrollToPage(nCurPage-1);

}



bool CCCGameScrollView::createContainer(CCCGameScrollViewDelegate* pDele,

                                        int nCount, //总共的Page数量

                                        const cocos2d::CCSize & oSize )//每一个Page的尺寸

{

    m_nPageCount=nCount;

    m_CellSize=oSize;

    m_pDelegate = pDele;

    CCLayer* pContainer=CCLayer::create();

    pContainer->setAnchorPoint(CCPointZero);

    pContainer->setPosition(CCPointZero);

    

    CCSize winSize=CCDirector::sharedDirector()->getVisibleSize();

    

    for (int i=0;i<nCount;++i)

    {

        CCNode* pNode=CCNode::create();

        pDele->scrollViewInitPage(pNode,i);

        pNode->setPosition(ccp(winSize.width/2+i*oSize.width,winSize.height/2));

        pNode->setTag(i);

        pContainer->addChild(pNode);

    }

    

    setContainer(pContainer);

    setContentSize(CCSizeMake(oSize.width*nCount,oSize.height));

    

    return true;

}



int CCCGameScrollView::getCurPage()

{

    return abs(getContentOffset().x / (int)m_CellSize.width);

}

#include "cocos2d.h"#include "cocos-ext.h"USING_NS_CC;class CCCGameScrollViewDelegate: public cocos2d::extension::CCScrollViewDelegate{public: //初始化每个单独Page的回调 virtual bool scrollViewInitPage(cocos2d::CCNode* pPage,int nPage){return true;}; //点击一个Page的回调 virtual void scrollViewClick(int nPage ){}; //每一次切换Page的回调 virtual void scrollViewScrollEnd(int nPage){};};
 
  


 

#include "cocos2d.h"

#include "cocos-ext.h"

#include "CCCGameScrollViewDelegate.h"



// 校正滑动动画速度

#define ADJUST_ANIM_VELOCITY 2000



class CCCGameScrollView

: public cocos2d::extension::CCScrollView

{

private:

    CCCGameScrollViewDelegate* m_pDelegate;

public:

    CCCGameScrollView();

    ~CCCGameScrollView();

public:

    CREATE_FUNC(CCCGameScrollView);

    bool init();

    

    bool createContainer(CCCGameScrollViewDelegate* pDele, int nCount,const cocos2d::CCSize & oSize );

    

    virtual bool ccTouchBegan( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );

    

    virtual void ccTouchMoved( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );

    

    virtual void ccTouchEnded( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );

    

    virtual void ccTouchCancelled( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );

    

    void scrollToPage(int nPage);

    void scrollToNextPage();

    void scrollToPrePage();

    

    int getCurPage();

protected:

    void adjustScrollView(const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd);

    

    virtual void onScrollEnd(float fDelay);

protected:

    int m_nPageCount;

    int m_nPrePage;

    cocos2d::CCPoint m_BeginOffset;

    cocos2d::CCSize m_CellSize;

    float m_fAdjustSpeed;

};


 

#include "cocos2d.h"

#include "cocos-ext.h"

#include "CCCGameScrollViewDelegate.h"

#include "CCCGameScrollView.h"



USING_NS_CC;

USING_NS_CC_EXT;





class PageViewLayer : public CCLayer, public CCCGameScrollViewDelegate

{

public:

    CCCGameScrollView* m_ScrollView;

    virtual bool init();

    virtual void scrollViewDidScroll( cocos2d::extension::CCScrollView* view ) {};

    

    virtual void scrollViewDidZoom( cocos2d::extension::CCScrollView* view ) {};

    

    virtual bool scrollViewInitPage( cocos2d::CCNode* pPage,int nPage );

    

    virtual void scrollViewClick(int nPage );

    

    virtual void scrollViewScrollEnd(int nPage );

    

    CREATE_FUNC(PageViewLayer);

};

#include "PageViewLayer.h"



bool PageViewLayer::init()

{

    if (!CCLayer::init())

    {

        return false;

    }

    

    CCSprite* pBackGround=CCSprite::create("btn_bar04.png");

    pBackGround->setPosition(ccp(480,320));

    addChild(pBackGround);

    

    // CCScrollView

    m_ScrollView = CCCGameScrollView::create();

    m_ScrollView->createContainer(

                                  this,

                                  4,//总共的Page数量

                                  CCSizeMake(440,640));//每一个Page的尺寸

    m_ScrollView->setPosition(ccp(240,0));

    m_ScrollView->setContentOffset(CCPointZero);

    m_ScrollView->setViewSize(CCSizeMake(400, 640));

    m_ScrollView->setDirection(kCCScrollViewDirectionHorizontal);  

    

    this->addChild(m_ScrollView);

    

    return true;

}



bool PageViewLayer::scrollViewInitPage( cocos2d::CCNode* pPage,int nPage )

{

    CCSprite *sprite = CCSprite::create("gezi.png");

    sprite->setPosition(ccp(-300,0));

    pPage->addChild(sprite);

    return true;

}



void PageViewLayer::scrollViewScrollEnd(int nPage )

{

    

}



void PageViewLayer::scrollViewClick(int nPage )

{

    

}

 


你可能感兴趣的:(scrollview)