• 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 )
    {
        
    }


  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3181793.html
Copyright © 2020-2023  润新知