Cocos2d-x中使用CCScrollView來實現(xiàn)關卡選擇實例
類似關卡選擇的這種功能游戲中經??吹?,比如幫助場景,選擇關卡,通過滑動的方式選擇一些其他的東西等等。今天我們實現(xiàn)關卡的選擇是使用CCScrollView這個類。當然還有一些其他的方法,比如使用cocostudio的page view也可以。我先說下整體的思路,CCScrollView這個類是繼承自CCLayer的,本身的觸摸事件有些bug,所以網上一般將這個層的touch事件處理為false,而使用它的父節(jié)點來處理觸摸事件,我們也是采用這個做法。先定義一個LevelScene類,將CCScrollView加入進來,然后再定義一個layer層,這個層里邊放的就是一些關卡的圖片,然后將layer這個層作為CCScrollView的內容添加進去。好了,現(xiàn)在看代碼吧。
/*關卡選擇類的頭文件*/ #ifndef _LEVEL_SCENE_H_ #define _LEVEL_SCENE_H_ #include "cocos2d.h" //包含以下的頭文件 #include "cocos-ext.h" using namespace cocos2d::extension; using namespace cocos2d; class LevelScene : public CCLayer { public: bool init(); CREATE_FUNC(LevelScene); //以下是注冊觸摸事件和實現(xiàn)各種的touch函數(shù) void registerWithTouchDispatcher(); bool ccTouchBegan(CCTouch * touch,CCEvent * pEvent); void ccTouchMoved(CCTouch * touch,CCEvent * pEvent); void ccTouchEnded(CCTouch * touch,CCEvent * pEvent); //最后這個函數(shù)來校驗每個關卡的位置,是各個關卡都位于屏幕的中央 void adjustScrollView(float offset); private: //將CCScrollView作為自己的層添加進來 CCScrollView * m_scrollView; //觸摸點的位置 CCPoint m_touchPoint; //CCScrollView的便宜量 CCPoint m_offsetPoint; //當前為第幾個關卡 int m_nCurPage; }; #endif
/*關卡選擇類的具體實現(xiàn)*/ #include "LevelScene.h" #include <math.h> //用到了fabs()函數(shù),用來求絕對值的 bool LevelScene::init() { bool bRet = false; do { CC_BREAK_IF(!CCLayer::init()); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); //CCScrollView繼承自CCLayer,傳入的參數(shù)是view size的大小 //view size也就是人看到的大小,content size也就是內容的大小 //這里設置為整個屏幕的大小,也就是我們通過設備的整個屏幕去看里邊的內容 CCScrollView * scrollView = CCScrollView::create(CCSize(winSize.width,winSize.height)); //等同于如下的語句 /*CCScrollView * scrollView = CCScrollView::create(); scrollView->setViewSize(CCSize(winSize.width,winSize.height));*/ //以下是CCScrollView的一些常用函數(shù),但是我們這里都不會用到,實現(xiàn)的思路不同 //設置是否有反彈的效果,反彈就是當超出scrollview的大小的時候回到原來的位置 //scrollView->setBounceable(true); //CCScrollView默認錨點是在(0,0)處 //scrollView->ignoreAnchorPointForPosition(false); //scrollView->setPosition(ccp(winSize.width/2,winSize.height/2)); //設置滑動方向 //kCCScrollViewDirectionHorizontal——水平滑動 //kCCScrollViewDirectionVertical——垂直滑動 //scrollView->setDirection(kCCScrollViewDirectionBoth); //創(chuàng)建一個CCLayer,將內容添加到CCLayer中,然后將這個layer添加到scrollview中 CCLayer * layer = CCLayer::create(); for(int i = 0;i<5;i++) { CCString * string = CCString::createWithFormat("%d.jpg",i+1); CCSprite * sprite = CCSprite::create(string->getCString()); //將所有的精靈都放到屏幕的中間顯示 sprite->setPosition(ccpAdd(ccp(winSize.width/2,winSize.height/2), ccp(winSize.width*i,0))); layer->addChild(sprite); } //設置scrollView中的內容,必須先設置內容再設置內容的大小 scrollView->setContainer(layer); //setContentSize()設置內容區(qū)的大小 scrollView->setContentSize(CCSize(winSize.width*5,winSize.height)); //我們屏蔽scrollView這個層的觸摸,采用其他的實現(xiàn)方法 scrollView->setTouchEnabled(false); //設置里邊內容的偏移量 scrollView->setContentOffset(CCPoint(0,0)); //讓本層來接受觸摸事件 this->setTouchEnabled(true); this->addChild(scrollView); m_scrollView = scrollView; this->m_nCurPage = 0; bRet = true; } while(0); return bRet; } void LevelScene::registerWithTouchDispatcher() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true); } bool LevelScene::ccTouchBegan(CCTouch * touch,CCEvent * pEvent) { //用開始的觸摸點和scroll的偏移量初始化以下的成員變量 this->m_touchPoint = touch->getLocation(); this->m_offsetPoint = this->m_scrollView->getContentOffset(); //以下的這一點特別要注意,大家可以先注釋掉以下的這句話然后運行程序,會發(fā)現(xiàn)如果觸摸不是很快 //的時候不會有什么問題,但是如果觸摸進行的很快,關卡的位置偏移的就不會正確,以下的代碼正是解決這個問題到 if((int)this->m_offsetPoint.x%((int)CCDirector::sharedDirector()->getWinSize().width) == 0) { return true; } return false; } /*以下代碼的整體含義就是當手指移動的時候,讓關卡跟隨手指移動,當移動結束的時候,判斷結束點和開始 觸摸點的位置,對關卡的位置做相應的處理*/ //設置關卡跟隨手指的方向移動 void LevelScene::ccTouchMoved(CCTouch * touch,CCEvent * pEvent) { CCPoint point = touch->getLocation(); CCPoint direction = ccpSub(point,this->m_touchPoint); //CCPoint spriteDirection = ccpAdd(this->m_offsetPoint,direction); //只在x方向偏移 CCPoint spriteDirection = CCPoint(direction.x+this->m_offsetPoint.x,0); this->m_scrollView->setContentOffset(spriteDirection); } //以下的代碼是重點,當結束觸摸的時候,為了使關卡顯示在屏幕的中間,我們需要這么做 void LevelScene::ccTouchEnded(CCTouch * touch,CCEvent * pEvent) { CCPoint endPoint = touch->getLocation(); float distance = endPoint.x-this->m_touchPoint.x; //手指移動的距離小于20的時候,就將偏移量作為0處理 if(fabs(distance) < 20) { this->adjustScrollView(0); } else { //將偏移量作為參數(shù)傳進來 this->adjustScrollView(distance); } } //調整關卡的最終位置 void LevelScene::adjustScrollView(float offset) { CCSize winSize = CCDirector::sharedDirector()->getWinSize(); // 我們根據(jù) offset 的實際情況來判斷移動效果 //如果手指往左劃,offset大于0,說明頁面在減小,往右增大 if (offset < 0) m_nCurPage ++; else if (offset > 0) m_nCurPage --; //不允許超出最左邊的一頁和最右邊的一頁 if (m_nCurPage < 0) m_nCurPage = 0; else if (m_nCurPage > 4) m_nCurPage = 4; CCPoint adjustPoint = ccp(-winSize.width * m_nCurPage , 0); //這個函數(shù)比setContentOffset多了一個參數(shù),第二個參數(shù)是設置時間的,就是用多長的時間來改變偏移量 this->m_scrollView->setContentOffsetInDuration(adjustPoint, 0.3f); }
bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); //添加背景圖片 CCSprite * sprite = CCSprite::create("background.png"); sprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); this->addChild(sprite); //添加CCScrollView層 LevelScene * scrollView = LevelScene::create(); this->addChild(scrollView); return true; }
- 剖析iOS開發(fā)中Cocos2d-x的內存管理相關操作
- iOS開發(fā)中使用cocos2d添加觸摸事件的方法
- cocos2dx骨骼動畫Armature源碼剖析(三)
- cocos2dx骨骼動畫Armature源碼剖析(二)
- cocos2dx骨骼動畫Armature源碼剖析(一)
- Cocos2d-x 3.x入門教程(二):Node節(jié)點類
- Cocos2d-x 3.x入門教程(一):基礎概念
- Cocos2d-x中調用Lua及HelloWorld.lua源碼分解
- Cocos2d-x中CCEditBox文本輸入框的使用實例
- Cocos2d-x中實現(xiàn)彈出對話框示例
- Cocos2d-x觸摸事件實例
- Cocos2d-x人物動作類實例
- 詳解iOS游戲開發(fā)中Cocos2D的坐標位置關系
相關文章
VS2019項目打包生成.exe文件與Setup的步驟實現(xiàn)
這篇文章主要介紹了VS2019項目打包生成.exe文件與Setup的步驟實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10