cocos2dX 之CCScene的創建原理和切換方式

今天, 我們來看看場景CCScene的創建原理和切換方式, 


首先, 我們來看看一個空的場景是個什麼樣子:




我們先來看看效果:

啥也沒有:



諸位少俠莫急, 且待我一一解釋( 旁白: 你今天又是在發什麼瘋啊)


創建一個繼承於CCLayer的HelloWorld,然後通過HelloWorld這個Layer中提供一個產生CCScene的指針的靜態函數,獲取場景的指針,載入場景

我們先詳細的看看每個函數做了什麼


CCScene* HelloWorld::scene()

創建了一個場景

根據HelloWorld創建了一個層

將層添加到場景裏面

返回場景指針


bool HelloWorld::init()

判斷父類是否初始化成功, 如果不成功, 結束初始化操作


總的來說, CCScene相當於一個容器, 雖然繼承自CCNode, 但是什麼也沒幹, 沒有在它的基礎上添加成員變量和方法, 只是重構了init, 把層添加到場景中


所以我們要在init函數裏面進行各種操作, 然後使用addChild添加到層上面, 我們再讓CCDirector調用runWithScene(), 播放這個場景, 我們添加的精靈這些才能在屏幕上顯示出來




好了, 我們來看看今天最重要一部分, 場景切換

先來看看場景切換有多少特效:

[1]:CCTransitionCrossFade::create(時間,目標場景);

   //慢慢淡化到另一場景

[2]:CCTransitionFade::create(時間,目標場景);

   //本場景變暗消失後另一場景慢慢出現

[3]:CCTransitionFadeBL::create(時間,目標場景);

   //本場景右上角到左下角方塊消失到另一場景

[4]:CCTransitionFadeDown::create(時間,目標場景);

   //本場景從上到下橫條消失到另一場景

[5]:CCTransitionFadeTR::create(時間,目標場景);

   //本場景左下角到右上角方塊消失到另一場景

[6]:CCTransitionFadeUp::create(時間,目標場景);

   //本場景從下到上橫條消失到另一場景

[7]:CCTransitionFlipAngular::create(時間,目標場景,樣式 );

   //本場景翻轉消失到另一場景(斜上方)

   //樣式(可以不寫):

   //kCCTransitionOrientationLeftOver(左向右翻轉)

   //kCCTransitionOrientationRightOver(右向左翻轉)

[8]:CCTransitionFlipX::create(時間,目標場景,樣式);

   //本場景翻轉消失到另一場景(X軸)

   //樣式(可以不寫):

   //kCCTransitionOrientationLeftOver(左向右翻轉)

   //kCCTransitionOrientationRightOver(右向左翻轉)

[9]:CCTransitionFlipY::create(時間,目標場景);

   //本場景翻轉消失到另一場景(Y軸)

   //樣式(可以不寫):

   //kCCTransitionOrientationUpOver(下向上翻轉)

   //kCCTransitionOrientationDownOver(上向下翻轉)

[10]:CCTransitionJumpZoom::create(時間,目標場景);

   //本場景跳動消失後另一場景跳動出現

[11]:CCTransitionMoveInB::create(時間,目標場景);

   //另一場景由整體從下面出現

[12]:CCTransitionMoveInL::create(時間,目標場景);

   //另一場景由整體從左面出現

[13]:CCTransitionMoveInT::create(時間,目標場景);

   //另一場景由整體從上面出現

[14]:CCTransitionMoveInR::create(時間,目標場景);

   //另一場景由整體從右面出現

[15]:CCTransitionPageTurn::create(時間,目標場景,bool);

   //翻頁切換,bool爲true是向前翻。

[16]:CCTransitionProgressHorizontal::create(時間,目標場景);

   //本場景從左到右消失同時另一場景出現

[17]:CCTransitionProgressInOut::create(時間,目標場景);

   //本場景從中間到四周消失同時另一場景出現

[18]:CCTransitionProgressOutIn::create(時間,目標場景);

   //本場景從四周到中間消失同時另一場景出現

[19]:CCTransitionProgressRadialCCW::create(時間,目標場景);

   //本場景逆時針消失到另一場景

[20]:CCTransitionProgressRadialCW::create(時間,目標場景);

   //本場景順時針消失到另一場景

[21]:CCTransitionProgressVertical::create(時間,目標場景);

   //本場景從上到下消失同時另一場景出現

[22]:CCTransitionRotoZoom::create(時間,目標場景);

   //本場景旋轉消失後另一場景旋轉出現

[23]:CCTransitionShrinkGrow::create(時間,目標場景);

   //本場景縮小切換到另一場景放大

[24]:CCTransitionSlideInB::create(時間,目標場景);

   //本場景向上滑動到另一場景

[25]:CCTransitionSlideInL::create(時間,目標場景);

   //本場景向右滑動到另一場景

[26]:CCTransitionSlideInR::create(時間,目標場景);

   //本場景向左滑動到另一場景

[27]:CCTransitionSlideInT::create(時間,目標場景);

   //本場景向下滑動到另一場景

[28]:CCTransitionSplitCols::create(時間,目標場景);

   //本場景三矩形上下消失後另一場景三矩形上下出現

[29]:CCTransitionSplitRows::create(時間,目標場景);

   //本場景三矩形左右消失後另一場景三矩形左右出現

[30]:CCTransitionTurnOffTiles::create(時間,目標場景);

   //本場景小方塊消失到另一場景

[31]:CCTransitionZoomFlipAngular::create(時間,目標場景,樣式);

   //本場景翻轉消失到另一場景(斜上方)

   //樣式(可以不寫):

   //kCCTransitionOrientationLeftOver(左向右翻轉)

   //kCCTransitionOrientationRightOver(右向左翻轉)

[32]:CCTransitionZoomFlipX::create(時間,目標場景,樣式);

   //本場景翻轉消失到另一場景(X軸)

   //樣式(可以不寫):

   //kCCTransitionOrientationLeftOver(左向右翻轉)

   //kCCTransitionOrientationRightOver(右向左翻轉)

[33]:CCTransitionZoomFlipY::create(時間,目標場景,樣式);

   //本場景翻轉消失到另一場景(Y軸)

   //樣式(可以不寫):

   //kCCTransitionOrientationUpOver(下向上翻轉)

   //kCCTransitionOrientationDownOver(上向下翻轉)

嗯, 這裏借用孤狼大神整理的, 感謝哈, 嘿嘿, 我人比較懶

好了, 我們先來創建一個新的場景

創建一個名叫scene2的類, 從HelloWorld把代碼複製過來, 注意要把類名這些換過來哦

#ifndef __SCENE2_H__
#define __SCENE2_H__

#include "cocos2d.h"

class scene2 : public cocos2d::CCLayer
{
public:
	//初始化一個場景, 成功返回TRUE, 失敗返回FALSE
	virtual bool init();  

	//創建一個場景, 返回類的實例指針, 說白了就是返回一個場景指針
	static cocos2d::CCScene* scene();

	//創建一個層
	CREATE_FUNC(scene2);
};

#endif // __SCENE2_H__

#include "scene2.h"

USING_NS_CC;

CCScene* scene2::scene()
{
	//創建場景對象, 並且返回它
	CCScene *scene = CCScene::create();

	//創建一個層
	scene2 *layer = scene2::create();

	//將層添加到場景中
	scene->addChild(layer);

	return scene;
}

bool scene2::init()
{
	if ( !CCLayer::init() )
	{
		return false;
	}

	return true;
}

這樣, 一個新的場景就創建完成了


我們在原來的場景上創建一張背景圖片, 一個按鈕, 額, 這個按鈕我就用的是程序裏面的關閉按鈕, 函數內容一改, 嘿嘿, 你懂得( 旁白: 你這是沒救了的節奏)

CCSprite* bg = CCSprite::create( "HelloWorld.png");
	bg->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
	addChild( bg);

	CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
		"CloseNormal.png",
		"CloseSelected.png",
		this,
		menu_selector(HelloWorld::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
		origin.y + pCloseItem->getContentSize().height/2));

	// create menu, it's an autorelease object
	CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

關鍵的來了, 我們來修改一下關閉按鈕的功能, 直接使用scene2的scene()函數創建了一個場景, 用導演類直接切換到我們新創建的場景

CCScene* myScene = scene2::scene();
	CCDirector::sharedDirector()->replaceScene( myScene);

當然, 我們得把scene2的頭文件引進來

#include "scene2.h"

再來修改scene2依樣畫葫蘆, 我們再把scene2實現了:

	CCLabelTTF* ttf = CCLabelTTF::create( "SCENE_2", "Arial", 40);
	ttf->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
	addChild( ttf);


	CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
		"CloseNormal.png",
		"CloseSelected.png",
		this,
		menu_selector(scene2::menuCloseCallback));

	pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
		origin.y + pCloseItem->getContentSize().height/2));

	// create menu, it's an autorelease object
	CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
	pMenu->setPosition(CCPointZero);
	this->addChild(pMenu, 1);

修改關閉函數, 在這個切換場景的時候, 我們選擇使用了一個滑動切換場景的特效:

void scene2::menuCloseCallback(CCObject* pSender)
{
	CCScene* myScene = HelloWorld::scene();
	CCTransitionScene* tx = CCTransitionMoveInB::create( 2, myScene);
	CCDirector::sharedDirector()->replaceScene( tx);
}



看看效果, 場景一切換到場景二:

直接一下就切換過去了, 沒有任何效果


再看看場景二切換到場景一:

從下面把場景一拉上來的



好了  我們今天就到這裏了, 希望大家把這些特效都看看有什麼效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章