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

来源:互联网 发布:网络大神级作家排行榜 编辑:程序博客网 时间:2024/04/30 11:44
[cpp] view plaincopy
  1. <pre name="code" class="cpp">#include "CCCGameScrollView.h"  
  2.   
  3. USING_NS_CC;  
  4. USING_NS_CC_EXT;  
  5.   
  6. CCCGameScrollView::CCCGameScrollView()  
  7. :m_fAdjustSpeed(ADJUST_ANIM_VELOCITY)  
  8. , m_nPrePage(0)  
  9. {  
  10.       
  11. }  
  12.   
  13. CCCGameScrollView::~CCCGameScrollView()  
  14. {  
  15.       
  16. }  
  17.   
  18. bool CCCGameScrollView::init()  
  19. {  
  20.     if (!CCScrollView::init())  
  21.     {  
  22.         return false;  
  23.     }  
  24.       
  25.     return true;  
  26. }  
  27.   
  28. bool CCCGameScrollView::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )  
  29. {  
  30.     m_BeginOffset = getContentOffset();  
  31.     return CCScrollView::ccTouchBegan(pTouch, pEvent);  
  32. }  
  33.   
  34. void CCCGameScrollView::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )  
  35. {  
  36.     CCScrollView::ccTouchMoved(pTouch, pEvent);  
  37. }  
  38.   
  39. void CCCGameScrollView::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )  
  40. {  
  41.     CCPoint touchPoint = pTouch->getLocationInView();  
  42.     touchPoint = CCDirector::sharedDirector()->convertToGL( touchPoint );  
  43.       
  44.     CCScrollView::ccTouchEnded(pTouch, pEvent);  
  45.       
  46.     CCPoint m_EndOffset=getContentOffset();  
  47.       
  48.     if (m_BeginOffset.equals(m_EndOffset))  
  49.     {  
  50.         int nPage = abs(m_EndOffset.x / (int)m_CellSize.width);  
  51.         m_pDelegate->scrollViewClick(nPage);  
  52.       //  pDele->scrollViewClick(m_EndOffset,touchPoint,m_pContainer->getChildByTag(nPage),nPage);  
  53.         return ;  
  54.     }  
  55.       
  56.     adjustScrollView(m_BeginOffset,m_EndOffset);  
  57. }  
  58.   
  59. void CCCGameScrollView::ccTouchCancelled( CCTouch *pTouch, CCEvent *pEvent )  
  60. {  
  61.     CCScrollView::ccTouchCancelled(pTouch, pEvent);  
  62.       
  63.     CCPoint m_EndOffset=getContentOffset();  
  64.     adjustScrollView(m_BeginOffset,m_EndOffset);  
  65. }  
  66.   
  67. void CCCGameScrollView::adjustScrollView( const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd)  
  68. {  
  69.       
  70.     int nPage = abs(oBegin.x / (int)m_CellSize.width);  
  71.       
  72.     int nAdjustPage = 0;  
  73.       
  74.     int nDis = oEnd.x-oBegin.x;  
  75.       
  76.     if (nDis<-getViewSize().width/5)  
  77.     {  
  78.         nAdjustPage=nPage+1;  
  79.     }  
  80.     else if (nDis>getViewSize().width/5)  
  81.     {  
  82.         nAdjustPage=nPage-1;  
  83.     }  
  84.     else  
  85.     {  
  86.         nAdjustPage=nPage;  
  87.     }  
  88.       
  89.     nAdjustPage=MIN(nAdjustPage,m_nPageCount-1);  
  90.     nAdjustPage=MAX(nAdjustPage,0);  
  91.       
  92.     scrollToPage(nAdjustPage);  
  93. }  
  94.   
  95. void CCCGameScrollView::scrollToPage( int nPage )  
  96. {  
  97.     // 关闭CCScrollView中的自调整  
  98.     unscheduleAllSelectors();  
  99.       
  100.     CCPoint oOffset=getContentOffset();  
  101.     // 调整位置  
  102.     CCPoint adjustPos=ccp(-m_CellSize.width*nPage,0);  
  103.       
  104.     // 调整动画时间  
  105.     float adjustAnimDelay=ccpDistance(adjustPos,oOffset)/m_fAdjustSpeed;  
  106.       
  107.     // 调整位置  
  108.     setContentOffsetInDuration(adjustPos, adjustAnimDelay);  
  109.       
  110.     if (nPage!=m_nPrePage)  
  111.     {  
  112.         schedule(schedule_selector(CCCGameScrollView::onScrollEnd),adjustAnimDelay,0,0.0f);  
  113.         m_nPrePage=nPage;  
  114.     }  
  115. }  
  116.   
  117. void CCCGameScrollView::onScrollEnd(float fDelay)  
  118. {  
  119.     int nPage=getCurPage();  
  120.     m_pDelegate->scrollViewScrollEnd(nPage);  
  121. }  
  122.   
  123. void CCCGameScrollView::scrollToNextPage()  
  124. {  
  125.     int nCurPage=getCurPage();  
  126.     if (nCurPage>=m_nPageCount-1)  
  127.     {  
  128.         return ;  
  129.     }  
  130.     scrollToPage(nCurPage+1);  
  131. }  
  132.   
  133. void CCCGameScrollView::scrollToPrePage()  
  134. {  
  135.     int nCurPage=getCurPage();  
  136.     if (nCurPage<=0)  
  137.     {  
  138.         return ;  
  139.     }  
  140.     scrollToPage(nCurPage-1);  
  141. }  
  142.   
  143. bool CCCGameScrollView::createContainer(CCCGameScrollViewDelegate* pDele,  
  144.                                         int nCount, //总共的Page数量  
  145.                                         const cocos2d::CCSize & oSize )//每一个Page的尺寸  
  146. {  
  147.     m_nPageCount=nCount;  
  148.     m_CellSize=oSize;  
  149.     m_pDelegate = pDele;  
  150.     CCLayer* pContainer=CCLayer::create();  
  151.     pContainer->setAnchorPoint(CCPointZero);  
  152.     pContainer->setPosition(CCPointZero);  
  153.       
  154.     CCSize winSize=CCDirector::sharedDirector()->getVisibleSize();  
  155.       
  156.     for (int i=0;i<nCount;++i)  
  157.     {  
  158.         CCNode* pNode=CCNode::create();  
  159.         pDele->scrollViewInitPage(pNode,i);  
  160.         pNode->setPosition(ccp(winSize.width/2+i*oSize.width,winSize.height/2));  
  161.         pNode->setTag(i);  
  162.         pContainer->addChild(pNode);  
  163.     }  
  164.       
  165.     setContainer(pContainer);  
  166.     setContentSize(CCSizeMake(oSize.width*nCount,oSize.height));  
  167.       
  168.     return true;  
  169. }  
  170.   
  171. int CCCGameScrollView::getCurPage()  
  172. {  
  173.     return abs(getContentOffset().x / (int)m_CellSize.width);  
  174. }</pre><br>  
  175. #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  
  176.  void scrollViewClick(int nPage ){}; //每一次切换Page的回调 virtual void scrollViewScrollEnd(int nPage){};};  
  177. <pre></pre>  
  178. <p><br>  
  179. </p>  
  180. <p></p>  
  181. <pre name="code" class="cpp">#include "cocos2d.h"  
  182. #include "cocos-ext.h"  
  183. #include "CCCGameScrollViewDelegate.h"  
  184.   
  185. // 校正滑动动画速度  
  186. #define ADJUST_ANIM_VELOCITY 2000  
  187.   
  188. class CCCGameScrollView  
  189. public cocos2d::extension::CCScrollView  
  190. {  
  191. private:  
  192.     CCCGameScrollViewDelegate* m_pDelegate;  
  193. public:  
  194.     CCCGameScrollView();  
  195.     ~CCCGameScrollView();  
  196. public:  
  197.     CREATE_FUNC(CCCGameScrollView);  
  198.     bool init();  
  199.       
  200.     bool createContainer(CCCGameScrollViewDelegate* pDele, int nCount,const cocos2d::CCSize & oSize );  
  201.       
  202.     virtual bool ccTouchBegan( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );  
  203.       
  204.     virtual void ccTouchMoved( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );  
  205.       
  206.     virtual void ccTouchEnded( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );  
  207.       
  208.     virtual void ccTouchCancelled( cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent );  
  209.       
  210.     void scrollToPage(int nPage);  
  211.     void scrollToNextPage();  
  212.     void scrollToPrePage();  
  213.       
  214.     int getCurPage();  
  215. protected:  
  216.     void adjustScrollView(const cocos2d::CCPoint& oBegin,const cocos2d::CCPoint & oEnd);  
  217.       
  218.     virtual void onScrollEnd(float fDelay);  
  219. protected:  
  220.     int m_nPageCount;  
  221.     int m_nPrePage;  
  222.     cocos2d::CCPoint m_BeginOffset;  
  223.     cocos2d::CCSize m_CellSize;  
  224.     float m_fAdjustSpeed;  
  225. };  
  226. </pre><br>  
  227. <br>  
  228. <p></p><pre name="code" class="cpp">#include "cocos2d.h"  
  229. #include "cocos-ext.h"  
  230. #include "CCCGameScrollViewDelegate.h"  
  231. #include "CCCGameScrollView.h"  
  232.   
  233. USING_NS_CC;  
  234. USING_NS_CC_EXT;  
  235.   
  236.   
  237. class PageViewLayer : public CCLayer, public CCCGameScrollViewDelegate  
  238. {  
  239. public:  
  240.     CCCGameScrollView* m_ScrollView;  
  241.     virtual bool init();  
  242.     virtual void scrollViewDidScroll( cocos2d::extension::CCScrollView* view ) {};  
  243.       
  244.     virtual void scrollViewDidZoom( cocos2d::extension::CCScrollView* view ) {};  
  245.       
  246.     virtual bool scrollViewInitPage( cocos2d::CCNode* pPage,int nPage );  
  247.       
  248.     virtual void scrollViewClick(int nPage );  
  249.       
  250.     virtual void scrollViewScrollEnd(int nPage );  
  251.       
  252.     CREATE_FUNC(PageViewLayer);  
  253. };  
  254. </pre><pre name="code" class="cpp">#include "PageViewLayer.h"  
  255.   
  256. bool PageViewLayer::init()  
  257. {  
  258.     if (!CCLayer::init())  
  259.     {  
  260.         return false;  
  261.     }  
  262.       
  263.     CCSprite* pBackGround=CCSprite::create("btn_bar04.png");  
  264.     pBackGround->setPosition(ccp(480,320));  
  265.     addChild(pBackGround);  
  266.       
  267.     // CCScrollView  
  268.     m_ScrollView = CCCGameScrollView::create();  
  269.     m_ScrollView->createContainer(  
  270.                                   this,  
  271.                                   4,//总共的Page数量  
  272.                                   CCSizeMake(440,640));//每一个Page的尺寸  
  273.     m_ScrollView->setPosition(ccp(240,0));  
  274.     m_ScrollView->setContentOffset(CCPointZero);  
  275.     m_ScrollView->setViewSize(CCSizeMake(400, 640));  
  276.     m_ScrollView->setDirection(kCCScrollViewDirectionHorizontal);    
  277.       
  278.     this->addChild(m_ScrollView);  
  279.       
  280.     return true;  
  281. }  
  282.   
  283. bool PageViewLayer::scrollViewInitPage( cocos2d::CCNode* pPage,int nPage )  
  284. {  
  285.     CCSprite *sprite = CCSprite::create("gezi.png");  
  286.     sprite->setPosition(ccp(-300,0));  
  287.     pPage->addChild(sprite);  
  288.     return true;  
  289. }  
  290.   
  291. void PageViewLayer::scrollViewScrollEnd(int nPage )  
  292. {  
  293.       
  294. }  
  295.   
  296. void PageViewLayer::scrollViewClick(int nPage )  
  297. {  
  298.       
  299. }</pre><br>  
  300. <br>  
  301. <p></p>  
  302. <p><br>  
  303. </p>  
0 0
原创粉丝点击