cocos2dx之遮罩層
阿新 • • 發佈:2019-02-16
遮罩層,其實就是一個layer,一個只顯示出你自定義顯示的layer。
在瞄準線中我們用了引擎封裝的快捷繪圖,熟悉了自定義繪圖的基本流程。對於稍複雜的繪圖效果,就需要呼叫底層的OpenGL介面了,這裡我們用一個小小的例子來說明:滾動的數字表盤,在遊戲中顯示倒計時。在這個例子中,我們將使用OpenGL提供的遮罩效果來快速實現這一效果。
遮罩效果又稱為剪刀效果,允許一切的渲染結果只在螢幕的一個指定區域顯示:開啟遮罩效果後,一切的繪製提交都是正常渲染的,但最終只有螢幕上的指定區域會被繪製。形象地說,我們將當前螢幕截圖成一張固定的畫布蓋在螢幕上,只挖空指定的區域使之能活動,而螢幕上的其他位置儘管如常更新,但都被掩蓋住了。 於是,我們可以在錶盤上順序排列所有的數字,不該顯示的部分用遮罩效果蓋住,滾動的錶盤效果可以藉助遮罩得到快速的實現。
我們先來看下例子程式碼:
void glEnable(GLenum cap); GLenum 說明引數應為unsigned int 型別 cap 具體取值為OpenGl所預設的常量。cap決定所要啟用的功能。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); }