Cocos2dx學習之CCScrollView


      最近元旦放假,想想無聊,把cocos2d-x 2.0版本之后提供的一些控件總結一下吧。那么就從CCScrollView開始吧。

  ScrollView一般用在游戲的關卡選擇這種類似的場景還有幫助這種場景之中,當然,也可以用其他一些選擇菜單的場景。用途還是比較廣泛的嘛。

  首先CCScrollView 在 Cocosd-x 的擴展庫里面,要是使用的話,需要引入擴展包,然后添加命名空間

  #include "cocos-ext.h"
  USING_NS_CC_EXT;//cocos2dx定義的宏

 

  然后實現CCScrollViewDelegate,這個其實是和UISCrollView和相似的。

  必須實現的兩個方法。

   virtual void scrollViewDidScroll(CCScrollView* view);

     virtual void scrollViewDidZoom(CCScrollView* view);

  現在我們開始創建CCScrollView對象了。當然我們最好還是再創建一個Layer用來作為CCScrollView的Container。

    scrollView=CCScrollView::create();//創建一個scrollView

    continerLayer=CCLayer::create();

    CCSprite *sprite1=CCSprite::spriteWithFile("image1.jpg");

     sprite1->setPosition(ccp(240+0*480, 160));

     continerLayer->addChild(sprite1);

    CCSprite *sprite2=CCSprite::spriteWithFile("image2.jpg");

    sprite2->setPosition(ccp(240+1*480, 160));

    continerLayer->addChild(sprite2);

    continerLayer->setAnchorPoint(CCPointZero);

    continerLayer->setPosition(CCPointZero);

    

    scrollView->setAnchorPoint(CCPointZero);

    scrollView->setPosition(CCPointZero);

  

  //   顯示顯示的區域

    scrollView->setViewSize(CCSizeMake(480, 320));//設置view的大小

    scrollView->setContentOffset(CCPointZero);

    continerLayer->setContentSize(CCSizeMake(960, 320));//設置滾動區域的大小

//  顯示滑動的區域大小 scrollview的實際大小

    scrollView->setContentSize(CCSizeMake(960, 320));//設置scrollview區域的大小

    scrollView->setContainer(continerLayer);

//因為要自己實現觸摸消息,所以這里設為false//設置需要滾動的內容

    scrollView->setTouchEnabled(true);

    scrollView->setDirection(kCCScrollViewDirectionHorizontal);  //設置滾動的方向,有三種可以選擇

    scrollView->setDelegate(this);

      this->addChild(scrollView);

ok,這樣的話我們就創建完ScrollView了,但是要想做到好一點的效果還是要做一些其他處理。這里主要是設置滑動之后自動讓ScrollView自動調整大小。

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

{

    return true;

}

 

voidCCScrollViewLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

{

    CCLOG("move");

 

}

 

voidCCScrollViewLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

{

    adjustScrollView();

}

 

voidCCScrollViewLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)

{

    adjustScrollView();

}

 

void CCScrollViewLayer::adjustScrollView()

{

    // 關閉CCScrollView中的自調整

    scrollView->unscheduleAllSelectors();

     int x = scrollView->getContentOffset().x;

    CCLOG("offset=%d",x);

    int offset = (int) x % 480;

    // 調整位置

    CCPoint adjustPos;

    // 調整動畫時間

    float adjustAnimDelay;

//   向右滑動是正向左滑動是負

    if (offset < -240) {

        // 計算下一頁位置,時間

        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(480 + offset, 0));

        adjustAnimDelay = (float) (480 + offset) / ADJUST_ANIMATION_VELOCITY;

    }

    else {

        // 計算當前頁位置,時間

        adjustPos = ccpSub(scrollView->getContentOffset(), ccp(offset, 0));

        // 這里要取絕對值,否則在第一頁往左翻動的時,保證adjustAnimDelay為正數

        adjustAnimDelay = (float) abs(offset) / ADJUST_ANIMATION_VELOCITY;

    }

    

    // 調整位置

    scrollView->setContentOffsetInDuration(adjustPos, adjustAnimDelay);

}

當然再onEnter方法中加入

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, false);

保證當前layer和scrollview都能獲得touch事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM