Cocos2d-x基礎:TestCpp之場景切換

TransitionsTest.h 文件:

        有一個場景類TransitionsTestScene,還有兩個佈景層類TestLayer1、TestLayer2。

        在主菜單選擇了TransitionsTest菜單項後,首先運行以下代碼,從默認的場景切換到“場景切換示例的場景”來:

void TransitionsTestScene::runThisTest()
{
    CCLayer * pLayer = new TestLayer1();
    addChild(pLayer);
    pLayer->release();

    CCDirector::sharedDirector()->replaceScene(this);
}
        調用佈景層1的構造函數,在佈景層中加入一個背景圖片、Label文字、三個切換菜單項,代碼如下:

TestLayer1::TestLayer1(void)
{
    float x,y;

    CCSize size = CCDirector::sharedDirector()->getWinSize();
    x = size.width;
    y = size.height;

    CCSprite* bg1 = CCSprite::create(s_back1);
    bg1->setPosition( ccp(size.width/2, size.height/2) );
    addChild(bg1, -1);

    CCLabelTTF* title = CCLabelTTF::create( (transitions[s_nSceneIdx]).c_str(), "Thonburi", 32 );
    addChild(title);
    title->setColor( ccc3(255,32,32) );
    title->setPosition( ccp(x/2, y-100) );

    CCLabelTTF* label = CCLabelTTF::create("SCENE 1", "Marker Felt", 38);
    label->setColor( ccc3(16,16,255));
    label->setPosition( ccp(x/2,y/2));    
    addChild( label);

    // menu
    CCMenuItemImage *item1 = CCMenuItemImage::create(s_pPathB1, s_pPathB2, this, menu_selector(TestLayer1::backCallback) );
    CCMenuItemImage *item2 = CCMenuItemImage::create(s_pPathR1, s_pPathR2, this, menu_selector(TestLayer1::restartCallback) );
    CCMenuItemImage *item3 = CCMenuItemImage::create(s_pPathF1, s_pPathF2, this, menu_selector(TestLayer1::nextCallback) );

    CCMenu *menu = CCMenu::create(item1, item2, item3, NULL);

    menu->setPosition( CCPointZero );
    item1->setPosition(ccp(VisibleRect::center().x - item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));
    item2->setPosition(ccp(VisibleRect::center().x, VisibleRect::bottom().y+item2->getContentSize().height/2));
    item3->setPosition(ccp(VisibleRect::center().x + item2->getContentSize().width*2, VisibleRect::bottom().y+item2->getContentSize().height/2));

    addChild(menu, 1);    

    schedule( schedule_selector(TestLayer1::step), 1.0f); 
}
        當我們按下向右或向左的菜單項後,就會調用下面的回調函數,進行場景的切換,代碼如下:

void TestLayer1::nextCallback(CCObject* pSender)
{
    s_nSceneIdx++;
    s_nSceneIdx = s_nSceneIdx % MAX_LAYER;

    CCScene* s = new TransitionsTestScene();

    CCLayer* pLayer = new TestLayer2();
    s->addChild(pLayer);

    CCScene* pScene = createTransition(s_nSceneIdx, TRANSITION_DURATION, s);
    s->release();
    pLayer->release();
    if (pScene)
    {
        CCDirector::sharedDirector()->replaceScene(pScene);
    }
}
        上面代碼的執行過程:

                            (1)創建新場景、佈景層

                            (2)將佈景層放入場景中

                            (3)包裝創建的新場景,增加切換效果

                            (4)替換場景。


OK,如果正常點寫切換場景這個效果的話,是這麼寫的:

	CCScene* s = new CCScene();
	testLayer* pLayer = new testLayer();
	s->addChild(pLayer);
	pLayer->release();

	if (s)
	{
		CCDirector::sharedDirector()->pushScene(CCTransitionSlideInT::create(2,s));
	}
        我這寫法也有點戳敲打~    寫法有千奇百怪,但執行過程都是這些。123按順序來。

最後,注意一點,pushScene只是將新場景放到棧頂,顯示出來,舊場景依然存在(在內存中),所以一般是使用replaceScene。

        沒有最好的方法,只有最適合的方法,所以實際情況,自己把握咯~







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