中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

cocos2dx基礎篇(16)——滾動視圖CCScrollView

發布時間:2020-07-02 18:12:34 來源:網絡 閱讀:32278 作者:shahdza 欄目:開發技術

【嘮叨】

    本節要講講滾動視圖CCScrollView,相信玩過手游的同學們應該對它不會陌生吧。

    例如:憤怒的小鳥的游戲場景里大大的地圖,手機的屏幕肯定無法完全顯示的,所以需要通過觸摸滾動才能顯示大地圖的其他區域;排行榜中上下滑動來查看其他玩家的排名;以及手機上主界面左右滑動來切換界面等等。

    如下圖為屏幕滾動,切換手機的界面。

cocos2dx基礎篇(16)——滾動視圖CCScrollView


【致謝】

    http://blog.csdn.net/paea_gulang/article/details/10283601


【Demo下載】

    https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E6%BB%9A%E5%8A%A8%E8%A7%86%E5%9B%BECCScrollView 


【3.x】

    (1)去掉 “CC”

    (2)滾動方向

        > CCScrollViewDirection 改為強枚舉 ScrollView::Direction

//
	HORIZONTAL     //只能橫向滾動
	VERTICAL       //只能縱向滾動
	BOTH           //橫向縱向都能滾動,默認方式
//

    (3)其他變化不大。




【CCScrollView】

    滾動視圖類CCScrollView繼承于CCLayer,故它會忽略錨點的設置,其錨點始終為(0,0)。而我們知道CCLayer繼承了觸控事件CCTouch相關的函數。而CCScrollView也繼承了觸控函數,并將屏幕觸控事件的四個函數ccTouchesBegan、ccTouchesMoved、ccTouchesEnded、ccTouchesCancelled進行了重寫并實現了有關觸摸移動相關的操作(其內部的實現代碼自己看cocos2dx的源碼)。這也就是為什么滾動視圖CCScrollView的屏幕可以進行上下左右滾動的原因了。

    值得注意的是:既然CCScrollView也是一個CCLayer圖層,我們都知道觸控滾動的不是CCLayer圖層,而是添加在圖層上的那些對象。比如CCSprite精靈、以及圖層上的CCLayer等等。為了方便實現CCScrollView的滾動效果,cocos2dx引擎規定在使用CCScrollView時,需要在它的上面添加一個用于觸控滾動的容器Container,一般容器都選用CCLayer類或其擴展類(如CCLayerColor等)。而觸控事件的四個函數也是針對容器Container進行操作的。

    也就是說CCScrollView實現的視圖滾動,在真正意義上說是對容器Container進行滾動。

    接下來就來講講它的使用方法吧!


1、引入頭文件和命名空間

//
	#include "cocos-ext.h"
	using namespace cocos2d::extension;
//


2、創建方式

    說明:有兩種創建方式。對于默認的創建方式create(),會自動創建CCLayer作為滾動視圖的容器,且滾動視圖的可視區域的大小默認為200*200。而第二種則是可以自定義選擇哪個CCLayer作為容器。

    值得注意的是:創建滾動視圖之后,對于添加子節點操作scrollView->addChild(sp),實際上是將sp添加到容器container中。

//
class CCScrollView : public CCLayer

/**
 *		2種創建方式
 */

	//會自動創建CCLayer作為容器
	static CCScrollView* create();

	//size:     滾動視圖的可視區域大小
	//container:自定義滾動視圖的CCLayer容器
	static CCScrollView* create(CCSize size, CCNode* container = NULL);


	//舉例
	CCLayer* scrollLayer = CCLayer::create();
	CCScrollView* scrollView = CCScrollView::create(CCSizeMake(150, 100), scrollLayer);
//


3、常用操作

    設置容器、尺寸大小、容器的偏移量、允許滾動的方向、放縮、以及其他屬性的判斷。

    注意:因為容器與滾動視圖的錨點均為(0,0)。所以容器的偏移量,指容器左下角坐標相對滾動視圖左下角坐標的偏移。

//
/**
 *		容器相關操作
 *		setContainer , setContentSize , setContentOffset
 */
	//設置滾動視圖的容器
	void setContainer(CCNode* pContainer);
	CCNode* getContainer();

	//設置容器Container的尺寸大小
	virtual void setContentSize(const CCSize & size);
	virtual const CCSize& getContentSize() const;

	//設置容器相對滾動視圖的偏移量
	//animated為是否附帶滑動的動作效果,還是直接設置為新的偏移量
	//默認滑動動作為0.15秒,從舊位置滑動到新位置.
	void setContentOffset(CCPoint offset, bool animated = false);
	void setContentOffsetInDuration(CCPoint offset, float dt); 
	CCPoint getContentOffset();


/**
 *		滾動視圖相關操作
 *		setViewSize , setDirection , setZoomScale ,
 *		isDragging , isTouchMoved , setBounceable , setTouchEnabled
 */
	//設置滾動視圖可視區域的大小
	void setViewSize(CCSize size);
	CCSize getViewSize();

	//設置滾動視圖允許滾動的方向
	//CCScrollViewDirection:
	//		kCCScrollViewDirectionBoth              橫向縱向都能滾動,默認方式
	//		kCCScrollViewDirectionHorizontal        只能橫向滾動
	//		kCCScrollViewDirectionVertical          只能縱向滾動
	virtual void setDirection(CCScrollViewDirection eDirection);
	CCScrollViewDirection getDirection();

	//放縮滾動視圖大小
	//好像有bug,建議不要使用了!
	void setZoomScale(float s);
	void setZoomScale(float s, bool animated);
	float getZoomScale();
	void setZoomScaleInDuration(float s, float dt);

	bool isDragging();                     //用戶是否正在CCScrollView中操作
	bool isTouchMoved();                   //用戶是否在CCScrollView中移動
	void setBounceable(bool bBounceable);  //是否開啟彈性效果 
	bool isBounceable();                   //是否具有彈性效果
	void setTouchEnabled(bool e);          //是否開啟觸摸
//


4、事件委托代理接口類CCScrollViewDelegate

    CCScrollViewDelegate類主要是用來偵聽CCScrollView的事件,并設置事件的回調響應函數。

    使用方法:在創建CCScrollView類的CCLayer類中,讓CCLayer繼承CCScrollViewDelegate,并重寫如下兩個事件回調響應函數。

//
	virual void scrollViewDidScroll(CCScrollView * view);   //有滾動時的響應函數
	virual void scrollViewDidZoom(CCScrollView * view);     //有縮放時的響應函數
//


5、委托代理

//
	//設置滾動視圖的事件委托代理對象,一般為this
	//并且CCLayer必需要繼承代理接口類CCScrollViewDelegate
	void setDelegate(CCScrollViewDelegate* pDelegate);
	CCScrollViewDelegate* getDelegate();


	//舉例:
	//scrollView->setDelegate(this);
//


6、關于尺寸大小

    CCScrollView的使用過程中涉及到兩個尺寸大小。

    (1)滾動視圖的尺寸大小:即可視區域的大小。使用setViewSize()進行設置。

    (2)容器的尺寸大小:使用setContentSize()進行設置。

    例如設置滾動視圖尺寸大小為100*100,容器的尺寸大小為1000*1000。那么每次對視圖進行滾動,都只能看到容器100*100的某部分區域。

    具體圖文解說可以參照cocos-孤狼大神寫的:和屌絲一起學cocos2dx-CCScrollView


7、關于觸摸滾動

    使用setDirection()可以設置滾動的方向。主要有三個類型:

    (1)橫向縱向都能滾動    kCCScrollViewDirectionBoth              

    (2)只能橫向滾動        kCCScrollViewDirectionHorizontal        

    (3)只能縱向滾動        kCCScrollViewDirectionVertical          

    另外setTouchEnabled()是用來設置是否開啟觸控事件的。所以若設置為false。那么即使setDirection()了,也無法滾動視圖。


8、使用技巧

    (1)創建CCScrollView,和容器CCLayer;并設置滾動視圖的容器為該容器。

    (2)設置容器的尺寸大小setContentSize;滾動視圖(可視區域)的尺寸大小setViewSize。

    (3)將各種精靈、菜單、按鈕等加入到容器中。

    (4)設置委托代理setDelegate(this),并實現回調函數。




【代碼實戰】

    這里例舉了滾動視圖CCScrollView的三種用途。

//
	void test1();     //測試圖片滾動
	void test2();     //測試只能縱向滾動
	void test3();     //測試背包翻頁
//


1、資源圖片

    第一組:

cocos2dx基礎篇(16)——滾動視圖CCScrollView

    第二組:

cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView

    第三組:

cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView

cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView    cocos2dx基礎篇(16)——滾動視圖CCScrollView


2、引入頭文件和命名空間

//
	#include "cocos-ext.h"
	using namespace cocos2d::extension;
//


3、繼承CCScrollViewDelegate,重寫事件偵聽函數

//
	class HelloWorld : public cocos2d::CCLayer,public CCScrollViewDelegate
	{
	public:
		virtual bool init();  
		static cocos2d::CCScene* scene();
		void menuCloseCallback(CCObject* pSender);
		CREATE_FUNC(HelloWorld);

		void test1(); //測試圖片滾動
		void test2(); //測試只能縱向滾動
		void test3(); //測試背包翻頁

		int pageNumber;          //背包第幾頁
		CCMenuItemImage* pBack;  //往前翻頁
		CCMenuItemImage* pFront; //往后翻頁
		void scrollImage(CCObject* sender); //test3的背包翻頁

		void scrollViewDidScroll(CCScrollView* view); //滾動時響應的回調函數
		void scrollViewDidZoom(CCScrollView* view);   //放縮時響應的回調函數
	};
//


4、委托代理回調函數

    在控制臺輸出LOG。

//
	void HelloWorld::scrollViewDidScroll(CCScrollView* view) 
	{
		CCLOG("ScrollView Moved!");
	}
	void HelloWorld::scrollViewDidZoom(CCScrollView* view) 
	{
		CCLOG("ScrollView Scaled");
	}
//


5、測試圖片滾動test1()

    屏幕大小:480*320。滾動視圖大小:480*320。容器大小:960*600。

    開啟彈性效果setBounceable。

//
	void HelloWorld::test1()
	{
		CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
		CCSize mysize = CCSizeMake(960,600);       //容器大小

	//創建容器、設置大小
		CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
		scrollLayer->setContentSize(mysize);
		
	//容器中的東西
		CCSprite* bg = CCSprite::create("war.png");
		bg->setPosition( ccp(960/2.0, 600/2.0) );
		scrollLayer->addChild(bg);


	//創建滾動視圖CCScrollView
		CCScrollView* scrollView = CCScrollView::create();
		this->addChild(scrollView, 0, 1);
		
		//屬性設置
		scrollView->setContainer(scrollLayer);  //設置容器
		scrollView->setViewSize( visableSize ); //可視區域大小
		scrollView->setBounceable(true);        //是否具有彈性
		
		//委托代理
		scrollView->setDelegate(this);
	}
//


6、測試只能縱向滾動test2()

    屏幕大小:480*320。滾動視圖大小:150*100。容器大小:150*220。

    將滾動視圖設置到屏幕中心位置,并設置滾動方向setDirection,只能縱向滾動。

//
	void HelloWorld::test2()
	{
		CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
		CCSize mysize = CCSizeMake(150,220);       //容器大小

	//創建容器、設置大小
		CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
		scrollLayer->setContentSize(mysize);

	//容器中添加四個按鈕
		for(int i = 1; i <= 4; i++) 
		{
			char file[20];
			sprintf(file, "btn%d.png", i);
			CCSprite* btn = CCSprite::create(file);
			btn->setPosition( ccp(mysize.width/2, 220 - 50*i) );
			scrollLayer->addChild(btn);
		}

	//創建滾動視圖CCScrollView
		//可視區域大小150*100 、 容器為scrollLayer
		CCScrollView* scrollView = CCScrollView::create(CCSizeMake(150, 100), scrollLayer);
		scrollView->setPosition( visableSize/2 - ccp(150/2.0, 100/2.0) );
		this->addChild(scrollView, 0, 2);
		
		//設置為只能縱向滾動
		scrollView->setDirection(kCCScrollViewDirectionVertical);

		//委托代理
		scrollView->setDelegate(this);
	}
//


7、測試背包翻頁test3()

    屏幕大小:480*320。滾動視圖大小:100*80。容器大小:300*80。

    關閉觸控事件setTouchEnabled(false),創建兩個按鈕,實現只能通過按鈕進行左右翻頁。

    翻頁原理:通過設置容器的偏移值setContentOffset。

//
	void HelloWorld::test3()
	{
		CCSize visableSize = CCSizeMake(480, 320); //屏幕大小
		CCSize mysize = CCSizeMake(300,80);        //容器大小

	//創建容器、設置大小
		CCLayerColor* scrollLayer = CCLayerColor::create( ccc4(255,255,255,255) );
		scrollLayer->setContentSize(mysize);

	//容器中添加三個圖片
		for(int i = 1; i <= 3; i++) 
		{
			char file[20];
			sprintf(file, "sp%d.png", i);
			CCSprite* sp = CCSprite::create(file);
			sp->setPosition( ccp(100*i - 50, 40) );
			scrollLayer->addChild(sp);
		}

	//創建滾動視圖CCScrollView
		//可視區域大小100*80 、 容器為scrollLayer
		CCScrollView* scrollView = CCScrollView::create(CCSizeMake(100, 80), scrollLayer);
		scrollView->setPosition( visableSize/2 - ccp(100/2.0, 0) );
		this->addChild(scrollView, 0, 3);

		//屬性設置
		scrollView->setTouchEnabled(false); //關閉觸碰事件,無法觸摸滾動

		//委托代理
		scrollView->setDelegate(this);


	//創建背包翻頁按鈕
		//前翻pBack、后翻pFront
		pBack = CCMenuItemImage::create("b1.png", "b2.png", "b3.png", this, menu_selector(HelloWorld::scrollImage) );
		pFront = CCMenuItemImage::create("f1.png", "f2.png", "f3.png", this, menu_selector(HelloWorld::scrollImage) );
		pBack->setPosition( ccp(visableSize.width/2 - 100, 60) );
		pFront->setPosition( ccp(visableSize.width/2 + 100, 60) );
		CCMenu* pMenu = CCMenu::create(pBack, pFront, NULL);
		pMenu->setPosition(CCPointZero);
		this->addChild(pMenu, 0, 100);

		pBack->setEnabled(false);
		pageNumber = 0; //第0頁

	}


	//實現翻頁效果scrollImage
	void HelloWorld::scrollImage(CCObject* sender)
	{
		CCScrollView* scrollView = (CCScrollView*)this->getChildByTag(3);

		if(sender == pBack && pBack->isEnabled() )
		{
			pageNumber = max(0, pageNumber-1); //前翻
		}
		else if( pFront->isEnabled() )
		{
			pageNumber = min(2, pageNumber+1); //后翻
		}

		//設置容器相對滾動視圖的偏移量
		scrollView->setContentOffset(ccp(-100 * pageNumber, 0), true);

		pBack->setEnabled( pageNumber != 0);
		pFront->setEnabled( pageNumber != 2);
	}
//


8、運行結果


    8.1、背景滾動、附帶彈性效果

cocos2dx基礎篇(16)——滾動視圖CCScrollView

        

    8.2、只能縱向滾動,附帶彈性效果

cocos2dx基礎篇(16)——滾動視圖CCScrollView


    8.3、背包翻頁、無法觸摸滾動、通過按鈕進行翻頁

cocos2dx基礎篇(16)——滾動視圖CCScrollView



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

托克逊县| 松江区| 乌兰察布市| 贺兰县| 天祝| 和平县| 顺昌县| 沙田区| 策勒县| 驻马店市| 天祝| 尼木县| 葫芦岛市| 隆德县| 土默特右旗| 乌苏市| 本溪市| 永福县| 延安市| 陆良县| 普安县| 隆子县| 扶绥县| 淳安县| 扬州市| 阿拉善左旗| 上蔡县| 邵武市| 交口县| 聂荣县| 大悟县| 开鲁县| 高要市| 信丰县| 武安市| 嵩明县| 丹阳市| 宜宾县| 浙江省| 安顺市| 沙田区|