1. 程式人生 > >【玩轉cocos2d-x之二十九】利用CCClipingNode做遊戲遮罩

【玩轉cocos2d-x之二十九】利用CCClipingNode做遊戲遮罩

新手引導是遊戲中必備的(除了奇葩的MT用一段動畫開始),也是玩家對遊戲的第一印象,重要性不言而喻。一般採用的遮罩的形式來突出引導重點,同時遮蔽其他功能。這裡簡單的介紹一下游戲遮罩的實現,並給出一個示例。

1.CCClipingNode

CCClipingNode是一個可裁剪節點,簡單理解:

(1)首先它是一個節點,繼承於CCNode,所以它可以像普通節點一樣放入CCLayer,CCScene,CCNode中。

(2)作為節點,它就可以用作容器,承載其他節點和精靈。我把它叫底板。

(3)如果想要對一個節點進行裁剪,那需要給出裁剪的部分,這個裁剪區域,我把它叫模版。

所以CCClipingNode裁剪節點在組成上=底板+模版,而在顯示上=底板-模版。不知道這樣解釋會不會好理解一點。


2.API

CCClipingNode的使用還是比較簡單的,至於顯示底板還是模版,alpha值的設定,這些也不好說清楚,自己多試幾次就知道是什麼意思該怎麼用了。

    //不帶模版地建立一個裁剪節點
    static CCClippingNode* create();
    
    //使用一個節點作為模版建立裁剪節點
    static CCClippingNode* create(CCNode *pStencil);
    
    //不帶模版地初始化一個裁剪節點
    virtual bool init();
    
    //使用一個節點作為模版初始化裁剪節點
    virtual bool init(CCNode *pStencil);
    
    //設定/獲取模版,注意模版需要retain!
    CCNode* getStencil() const;
    void setStencil(CCNode *pStencil);
    
    //設定alpha值(0~1),這個很重要,裁剪是按畫素摳圖的,所以只有大於這個alpha值的模版畫素才會被畫出來
    //預設是1,也就是完全裁剪。
    GLfloat getAlphaThreshold() const;
    void setAlphaThreshold(GLfloat fAlphaThreshold);
    
    //預設是false,用於設定顯示底板還是模版
    bool isInverted() const;
    void setInverted(bool bInverted);

3.示例

在init中實現:
		CCSize visibleSize=CCDirector::sharedDirector()->getVisibleSize();

		CCSprite* background = CCSprite::create("HelloWorld.png");//建立背景
		background->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
		this->addChild(background,kTagBackground);

		clip=CCClippingNode::create();//建立裁剪節點,成員變數
		clip->setInverted(true);//設定底板可見
		clip->setAlphaThreshold(0.0f);//設定alpha為0
		this->addChild(clip,kTagClipNode);//新增裁剪節點

		CCLayerColor* back=CCLayerColor::create(ccc4(0,0,0,200));
		clip->addChild(back);//為裁剪節點新增一個黑色帶透明(看起了是灰色)的底板

		//模版如果要在其他地方使用要記得retain!

		//第一種:以下模型是drawnode遮罩
		//CCDrawNode* front=CCDrawNode::create();
		//ccColor4F yellow = {1, 1, 0, 1};
		//CCPoint rect[4]={ccp(-30,30),ccp(30,30),ccp(30,-30),ccp(-30,-30)};
		//front->drawPolygon(rect, 4, yellow, 0, yellow);
		//front->setPosition(ccp(visibleSize.width/2, visibleSize.height/2));
		//clip->setStencil(front);

		//第二種:以下模型是帶影象遮罩
		CCNode* nodef=CCNode::create();//建立模版
		CCSprite* close=CCSprite::create("CloseSelected.png");//這裡使用的是close的那個圖示,所以注意觀察效果圖2
		nodef->addChild(close);//在模版上新增精靈
		nodef->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
		clip->setStencil(nodef);//設定模版

		tip = CCSprite::create("tip.png");//一些引導提示
		tip->setScale(0.5f);
		tip->setRotation(60);
		tip->setPosition(ccp(visibleSize.width/2-70,visibleSize.height/2+50));
		this->addChild(tip,kTagTip);

		tip->runAction(CCRepeatForever::create(CCSequence::create(CCScaleBy::create(0.25f,0.95f),CCScaleTo::create(0.25f,0.5),NULL)));

		this->setTouchEnabled(true);//觸控有效,落點正確時移除裁剪節點和提示,相關處理請看原始碼

4.效果

兩種效果:

       

5.原始碼