1. 程式人生 > >cocos2dx之遮罩層

cocos2dx之遮罩層

遮罩層,其實就是一個layer,一個只顯示出你自定義顯示的layer。

在瞄準線中我們用了引擎封裝的快捷繪圖,熟悉了自定義繪圖的基本流程。對於稍複雜的繪圖效果,就需要呼叫底層的OpenGL介面了,這裡我們用一個小小的例子來說明:滾動的數字表盤,在遊戲中顯示倒計時。在這個例子中,我們將使用OpenGL提供的遮罩效果來快速實現這一效果。
遮罩效果又稱為剪刀效果,允許一切的渲染結果只在螢幕的一個指定區域顯示:開啟遮罩效果後,一切的繪製提交都是正常渲染的,但最終只有螢幕上的指定區域會被繪製。形象地說,我們將當前螢幕截圖成一張固定的畫布蓋在螢幕上,只挖空指定的區域使之能活動,而螢幕上的其他位置儘管如常更新,但都被掩蓋住了。 於是,我們可以在錶盤上順序排列所有的數字,不該顯示的部分用遮罩效果蓋住,滾動的錶盤效果可以藉助遮罩得到快速的實現。

我們先來看下例子程式碼:

void ShelterLayer::initLayer() {
    visiable = CCNode::create();
    visiable->retain();
    win_Size = CCDirector::sharedDirector()->getWinSize();
    
    int iwin_width = win_Size.width;
    int iwin_height = win_Size.height - 100;

    for(int i = 0 ; i < 10; ++i) {
        char a_string[2];
        a_string[0] = '0' + i;
        a_string[1] = '\0';
        label = CCLabelTTF::create(a_string, "Thonburi", 16);
        label->retain();
        label->setAnchorPoint(ccp(0.5f, 0.5f));
        label->setPosition(ccp(iwin_width / 2.0f, iwin_height / 2.0f + 16 * i));//16是字型大小,我是從小往上方label,這裡就是設定位置
        visiable->addChild(label);//這個node我是為了將它儲存10個label
    }
    this->addChild(visiable);
}

ShelterLayer *ShelterLayer::createlable() {
    ShelterLayer *layer = new ShelterLayer;
    return layer;
}

void ShelterLayer::visit() {
    glEnable(GL_SCISSOR_TEST);
    
    //CCPoint point_ = CCPointZero;
    //point_ = visiable->getParent()->convertToWorldSpace(point_);
    //CCRect rect_ = CCRectMake(point_.x, point_.y, 16, 16 * 10);

    int iwin_width = win_Size.width;//先前建立的label的橫座標.
    int iwin_height = win_Size.height - 100;//....縱座標

    //16是字型大小,iwin_width / 2.0f - 16是在該layer的的坐下角
    glScissor(iwin_width / 2.0f - 16 , iwin_height / 2.0f - 16,  32, 32 * 10);//這裡繪製你現實的layer的顯示地大小

    CCNode::visit();//呼叫node的vist進行繪圖
    glDisable(GL_SCISSOR_TEST);

}
void glEnable(GLenum cap); GLenum 說明引數應為unsigned int 型別 cap 具體取值為OpenGl所預設的常量。cap決定所要啟用的功能。