a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

Cocos2d-x中使用CCScrollView來實現(xiàn)關(guān)卡選擇實例

2020-01-26 15:19:21
字體:
供稿:網(wǎng)友

類似關(guān)卡選擇的這種功能游戲中經(jīng)常看到,比如幫助場景,選擇關(guān)卡,通過滑動的方式選擇一些其他的東西等等。今天我們實現(xiàn)關(guān)卡的選擇是使用CCScrollView這個類。當(dāng)然還有一些其他的方法,比如使用cocostudio的page view也可以。我先說下整體的思路,CCScrollView這個類是繼承自CCLayer的,本身的觸摸事件有些bug,所以網(wǎng)上一般將這個層的touch事件處理為false,而使用它的父節(jié)點來處理觸摸事件,我們也是采用這個做法。先定義一個LevelScene類,將CCScrollView加入進來,然后再定義一個layer層,這個層里邊放的就是一些關(guān)卡的圖片,然后將layer這個層作為CCScrollView的內(nèi)容添加進去。好了,現(xiàn)在看代碼吧。

/*關(guān)卡選擇類的頭文件*/#ifndef _LEVEL_SCENE_H_#define _LEVEL_SCENE_H_#include "cocos2d.h"http://包含以下的頭文件#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ù)來校驗每個關(guān)卡的位置,是各個關(guān)卡都位于屏幕的中央	void adjustScrollView(float offset);private:	//將CCScrollView作為自己的層添加進來	CCScrollView * m_scrollView;	//觸摸點的位置	CCPoint m_touchPoint;	//CCScrollView的便宜量	CCPoint m_offsetPoint;	//當(dāng)前為第幾個關(guān)卡	int m_nCurPage;};#endif
/*關(guān)卡選擇類的具體實現(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也就是內(nèi)容的大小		//這里設(shè)置為整個屏幕的大小,也就是我們通過設(shè)備的整個屏幕去看里邊的內(nèi)容		CCScrollView * scrollView = CCScrollView::create(CCSize(winSize.width,winSize.height));		//等同于如下的語句		/*CCScrollView * scrollView = CCScrollView::create();		scrollView->setViewSize(CCSize(winSize.width,winSize.height));*/		//以下是CCScrollView的一些常用函數(shù),但是我們這里都不會用到,實現(xiàn)的思路不同		//設(shè)置是否有反彈的效果,反彈就是當(dāng)超出scrollview的大小的時候回到原來的位置		//scrollView->setBounceable(true);		//CCScrollView默認錨點是在(0,0)處		//scrollView->ignoreAnchorPointForPosition(false);		//scrollView->setPosition(ccp(winSize.width/2,winSize.height/2));		//設(shè)置滑動方向		//kCCScrollViewDirectionHorizontal――水平滑動		//kCCScrollViewDirectionVertical――垂直滑動		//scrollView->setDirection(kCCScrollViewDirectionBoth);		//創(chuàng)建一個CCLayer,將內(nèi)容添加到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);		}		//設(shè)置scrollView中的內(nèi)容,必須先設(shè)置內(nèi)容再設(shè)置內(nèi)容的大小		scrollView->setContainer(layer);		//setContentSize()設(shè)置內(nèi)容區(qū)的大小		scrollView->setContentSize(CCSize(winSize.width*5,winSize.height));		//我們屏蔽scrollView這個層的觸摸,采用其他的實現(xiàn)方法		scrollView->setTouchEnabled(false);		//設(shè)置里邊內(nèi)容的偏移量		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)如果觸摸不是很快	//的時候不會有什么問題,但是如果觸摸進行的很快,關(guān)卡的位置偏移的就不會正確,以下的代碼正是解決這個問題到	if((int)this->m_offsetPoint.x%((int)CCDirector::sharedDirector()->getWinSize().width) == 0)	{		return true;	}	return false;}/*以下代碼的整體含義就是當(dāng)手指移動的時候,讓關(guān)卡跟隨手指移動,當(dāng)移動結(jié)束的時候,判斷結(jié)束點和開始觸摸點的位置,對關(guān)卡的位置做相應(yīng)的處理*///設(shè)置關(guān)卡跟隨手指的方向移動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);}//以下的代碼是重點,當(dāng)結(jié)束觸摸的時候,為了使關(guān)卡顯示在屏幕的中間,我們需要這么做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);	}}//調(diào)整關(guān)卡的最終位置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ù)是設(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;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 日本黄网站在线观看 | 成人天堂噜噜噜 | 91精品国产91久久久久久吃药 | 欧美一区免费 | 久久久久久久久久久久久久久久久久久久 | 中文字字幕在线观看 | 成人在线视频网 | 亚洲一区中文字幕在线观看 | 搜索黄色毛片 | 成人免费看电影 | 亚洲网站久久 | 久草免费在线视频 | 91伦理片| 久久成人免费网站 | 中文字幕在线视频免费观看 | 亚洲97| 三级成人在线 | 成人小视频在线观看 | 三级黄视频在线观看 | 欧美黄色一区二区 | 美女主播精品视频一二三四 | 久久久久久国产精品 | 亚洲高清av| 日韩一级免费 | 2024av| 成人午夜 | 蜜臀网 | 国内精品久久精品 | 欧美精品三区 | 一区二区在线视频观看 | 久久福利 | 天天爽夜夜爽 | 91在线精品一区二区 | 天天看片天天操 | 一区二区三区国产视频 | 欧美精品欧美极品欧美激情 | 三级网站视频 | 蜜桃色网 | 国产免费视频在线 | 欧美视频网址 | 成人在线观看免费视频 |