關於cocos2d-x紋理裁剪的1個問題

tags:    時間:2013-12-03 21:43:23
我用cocos2d-x 中的CCTexture2D載入紋理之後,如何實現類似J2ME裡面setClip那樣的效果。參考了很多資料除了把他弄成Sprite進行裁剪外好像沒其他好的辦法,但是那樣用繪製效率太低了。我只想顯示紋理的一部分到屏幕上。

順便問下,cocos2d裡面繪製基礎的幾何圖元如何弄,比如說填充1個半透明的圓角矩形,繪製1個矩形
------解決方案--------------------
沒人知道么
------解決方案--------------------
用CCImage的這個方法初始化一個CCImage,bool  initWithImageFile (const char *strPath, EImageFormat imageType=kFmtPng);然後用unsigned char *  getData ()方法獲得圖片的像素指針,用int  getDataLen ()獲得像素個數,用virtual unsigned short  getWidth (void),virtual unsigned short  getHeight (void)獲得寬和高,然後算一下自己要截取的圖片的位置和大小,拷入一個新的char數組裡,然後用bool  initWithImageData (void *pData, int nDataLen, EImageFormat eFmt=kFmtUnKnown, int nWidth=0, int nHeight=0, int nBitsPerComponent=8)構造一個CCImage實例,用CCImage去構造一個CCTexture就OK了,看API自己想的,沒實際操作過
------解決方案--------------------
cocos2d裡面有opengl ES,用opengl的方法可以繪製圖元,詳細使用可以自己看看有關opengl的書
------解決方案--------------------
cocos2d 2.1提供了sprite新的API,指定區域的,不過還是用opengles來畫吧
------解決方案--------------------
------解決方案--------------------
void PlayLayer::initClisper(CCSprite *s_hole,CCClippingNode **cliper,int tag){
    
    CCDrawNode*stencil = CCDrawNode::create();
    CCPoint rectangle[4];
    rectangle[0]= ccp(0, 0);
    rectangle[1]= ccp(s_hole->getContentSize().width,0); 
    rectangle[2]= ccp(s_hole->getContentSize().width,400);
    rectangle[3]= ccp(0, 400);
    //繪製一個矩形
    ccColor4F color = {1, 1, 1, 1};
    stencil->drawPolygon(rectangle,4, color, 1, color);

    *cliper = CCClippingNode::create(stencil);
    (*cliper)->setPosition(s_hole->getPositionX()-s_hole->getContentSize().width/2,s_hole->getPositionY());
    (*cliper)->setContentSize(CCSizeMake(stencil->getContentSize().width, 200));
    (*cliper)->setTag(tag);
    this->addChild(*cliper);
}


代碼如上,主要類CCClippingNode能夠實現你所需要的功能,詳細如何坐,自己google一下,很多答案,這裡重點給你說一下,想要實現效果,你必須改ios目錄下appcontroller.mm文件里一個地方
EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
                                     pixelFormat: kEAGLColorFormatRGB565
                                     depthFormat: GL_DEPTH24_STENCIL8_OES
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples:0 ];
    
    cocos2d::CCDirector::sharedDirector()->setDepthTest(true);

自己對應下,kEAGLColorFormatRGB565,GL_DEPTH24_STENCIL8_OES,cocos2d::CCDirector::sharedDirector()->setDepthTest(true);

推薦閱讀文章

Bookmark the permalink ,來源:互聯網