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事件。

posted @ 2012-12-31 11:15  丁昌兴  阅读(9397)  评论(0编辑  收藏  举报