转自:http://www.cnblogs.com/dcxing/archive/2012/12/31/2840217.html
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事件。