轉自: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事件。
