2011-06-24 37 views
3

我真的很瘋狂,試圖弄清楚這一點,所以任何幫助將非常感激。我試圖隱藏大部分精靈並逐漸顯示出來。這工作正常,如果我只與矩形工作。例如,我發現有人的實施「ClippingNode」類的,效果不錯,即這部分代碼:cocos2d - 只顯示精靈的一部分 - 不規則形狀

-(void) visit 
{ 
    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 
    glScissor(clippingRegion.origin.x + positionInPixels_.x, clippingRegion.origin.y + positionInPixels_.y, clippingRegion.size.width, clippingRegion.size.height); 

    [super visit]; 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix(); 
} 

的問題是我需要一個不規則的形狀,而不僅僅是一個矩形。我希望我可以堆疊調用glScissor並創建一個具有許多較小矩形的形狀,但不幸的是,glScissor只能使用一次(最後一次調用它)。

似乎cocos2d不支持OpenGLs模板緩衝區(是嗎?),即使它發生了,我發現OpenGL很難理解,我仍然需要有人向我解釋。如果我可以在精靈上設置一個貝塞爾路徑作爲掩碼(我認爲你可以在Quartz中完成),那很棒,但似乎並不支持。

請問,如果有人在這裏有任何智慧,那會很棒!

+0

事實上,我會問另一種方式:任何人都可以改變上述實施「遊」上CCNode以剪裁節點的內容以半徑40的圓爲中心在clippingRegion.origin? – johnnysports

+0

你是否設法讓這個工作很好地夾到一個圓圈? – jin

回答

1

glScissor是不可能的,但您可以使用模板緩衝區輕鬆實現此效果。下面是文檔:

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

還有在模版緩衝區訥河教程,但它是在C++中,不客觀的C(儘管它應該很容易翻譯成任何你需要的應用程序):

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26

編輯:這是基於你希望把它夾到一些任意的形狀,例如明星的假設,笑臉什麼的,而不是隻是一個矩形。

+0

第一個鏈接被破壞 – Grumdrig

1

想通了。您可以撥打glScissor多次,你只還需要繪製,每次剪毛形狀:

-(void) visit 
{ 
    NSEnumerator *enumerator; 
    NSValue *val; 
    CGRect aRegion; 

    glPushMatrix(); 
    glEnable(GL_SCISSOR_TEST); 

    enumerator = [regions objectEnumerator]; 
    while ((val = (NSValue *)[enumerator nextObject])) { 
     aRegion = [val CGRectValue]; 

     glScissor(aRegion.origin.x, aRegion.origin.y, 
        aRegion.size.width, aRegion.size.height); 
     [super visit]; 
    } 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix();  

}