先上核心代碼,基本的思路就是用黑色的同樣輪廓的字型,向四周偏移一點,最後在把需要的字型疊加在畫出來的輪廓上面。
CCLabelTTF* pLabel = CCLabelTTF::create("ABCDEFG", "Arial", 50);
pLabel->setPosition(ccp(visibleSize.width * 0.5, visibleSize.height * 0.5));
this->addChild(pLabel, 100);
CCRenderTexture* rt = CCRenderTexture::create(pLabel->getContentSize().width, pLabel->getContentSize().height);
CCPoint originalPos = pLabel->getPosition();
ccColor3B originalColor = pLabel->getColor();
bool originalVisibility = pLabel->isVisible();
pLabel->setColor(ccc3(0, 0, 0));
pLabel->setVisible(true);
ccBlendFunc originalBlend = pLabel->getBlendFunc();
ccBlendFunc func = { GL_SRC_ALPHA, GL_ONE};
pLabel->setBlendFunc(func);
pLabel->setAnchorPoint(ccp(0.5, 0.5));
rt->begin();
for(int i = 0; i < 360; i += 15)
{
float r = CC_DEGREES_TO_RADIANS(i);
pLabel->setPosition(ccp(pLabel->getContentSize().width * 0.5f + sin(r) * 2,
pLabel->getContentSize().height * 0.5f + cos(r) * 2));
pLabel->visit();
}
pLabel->setColor(ccc3(0, 255, 0));
pLabel->setBlendFunc(originalBlend);
pLabel->setPosition(ccp(pLabel->getContentSize().width * 0.5f, pLabel->getContentSize().height * 0.5f));
pLabel->visit();
rt->end();
CCTexture2D* texture = rt->getSprite()->getTexture();
texture->setAliasTexParameters();
CCSprite* m_sprite = CCSprite::createWithTexture(rt->getSprite()->getTexture());
setContentSize(m_sprite->getContentSize());
m_sprite->setAnchorPoint(ccp(0, 0));
m_sprite->setPosition(ccp(0, 0));
((CCSprite *)m_sprite)->setFlipY(true);
addChild(m_sprite);
這段代碼主要是需要了解兩個東西 1 openGl 顔色混合的方法glBlendFunc
OpenGL 會把源顔色和目标顔色各自取出,并乘以一個系數(源顔色乘以的系數稱為“源因子”,目标顔色乘以的系數稱為“目标因子”),然後相加,這樣就得到了新的顔色。(也可以不是相加,新版本的OpenGL可以設定運算方式,包括加、減、取兩者中較大的、取兩者中較小的、邏輯運算等,但我們這裡為了簡單起見,不讨論這個了) 下面用數學公式來表達一下這個運算方式。假設源顔色的四個分量(指紅色,綠色,藍色,alpha值)是(Rs, Gs, Bs, As),目标顔色的四個分量是(Rd, Gd, Bd, Ad),又設源因子為(Sr, Sg, Sb, Sa),目标因子為(Dr, Dg, Db, Da)。則混合産生的新顔色可以表示為: (Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da) 當然了,如果顔色的某一分量超過了1.0,則它會被自動截取為1.0,不需要考慮越界的問題。 源因子和目标因子是可以通過glBlendFunc函數來進行設定的。glBlendFunc有兩個參數,前者表示源因子,後者表示目标因子。這兩個參數可以是多種值,下面介紹比較常用的幾種。 GL_ZERO:表示使用0.0作為因子,實際上相當于不使用這種顔色參與混合運算。 GL_ONE:表示使用1.0作為因子,實際上相當于完全的使用了這種顔色參與混合運算。 GL_SRC_ALPHA:表示使用源顔色的alpha值來作為因子。 GL_DST_ALPHA:表示使用目标顔色的alpha值來作為因子。 GL_ONE_MINUS_SRC_ALPHA:表示用1.0減去源顔色的alpha值來作為因子。 GL_ONE_MINUS_DST_ALPHA:表示用1.0減去目标顔色的alpha值來作為因子。除此以外,還有GL_SRC_COLOR(把源顔色的四個分量分别作為因子的四個分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前兩個在OpenGL舊版本中隻能用于設定目标因子,後兩個在OpenGL 舊版本中隻能用于設定源因子。新版本的OpenGL則沒有這個限制,并且支援新的GL_CONST_COLOR(設定一種常數顔色,将其四個分量分别作為因子的四個分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外還有GL_SRC_ALPHA_SATURATE。新版本的OpenGL還允許顔色的alpha 值和RGB值采用不同的混合因子。 舉例來說: 如果設定了glBlendFunc(GL_ONE, GL_ZERO);,則表示完全使用源顔色,完全不使用目标顔色,是以畫面效果和不使用混合的時候一緻(當然效率可能會低一點點)。如果沒有設定源因子和目标因子,則預設情況就是這樣的設定。如果設定了glBlendFunc(GL_ZERO, GL_ONE);,則表示完全不使用源顔色,是以無論你想畫什麼,最後都不會被畫上去了。(但這并不是說這樣設定就沒有用,有些時候可能有特殊用途)如 果設定了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,則表示源顔色乘以自身的alpha 值,目标顔色乘以1.0減去源顔色的alpha值,這樣一來,源顔色的alpha值越大,則産生的新顔色中源顔色所占比例就越大,而目标顔色所占比例則減小。這種情況下,我們可以簡單的将源顔色的alpha值了解為“不透明度”。這也是混合時最常用的方式。如果設定了glBlendFunc(GL_ONE, GL_ONE);,則表示完全使用源顔色和目标顔色,最終的顔色實際上就是兩種顔色的簡單相加。例如紅色(1, 0, 0)和綠色(0, 1, 0)相加得到(1, 1, 0),結果為黃色。 注意: 所謂源顔色和目标顔色,是跟繪制的順序有關的。假如先繪制了一個紅色的物體,再在其上繪制綠色的物體。則綠色是源顔色,紅色是目标顔色。如果順序反過來,則紅色就是源顔色,綠色才是目标顔色。在繪制時,應該注意順序,使得繪制的源顔色與設定的源因子對應,目标顔色與設定的目标因子對應。不要被混亂的順序搞暈。
2 CCRenderTexture 的用法 這個類簡單說其實就是畫闆,在begin()和end()之間visit的紋理,都會畫在CCRenderTexture裡面。畫完之後,就可以将所畫的東西生成一個CCSprite對象,形成一個新的圖。 rt->begin(); //把需要畫在RenderTexture裡面的精靈全部 rt->end();