cocos2d-x使用一個專門的OpenGL View進(jìn)行渲染, 它的渲染和UIKit是分開進(jìn)行的, 因此我們使用時一般是把cocos2d-x全屏顯示, 比如 Ray的這篇教程(http://www.raywenderlich.com/4817/how-to-integrate-cocos2d-and-uikit) (cocos2d-x和cocos2d在本篇文章中沒有本質(zhì)區(qū)別)
如果我們把cocos2d作為一個子view插進(jìn)來時, cocos2d的scene如果不加任何東西, 就會是黑色的一個矩形, 無法做成透明效果. 即使把OpenGL View的background color 設(shè)成 clearColor 也沒用. cocos2d到底能不能變得透明?
通過bing艱難的找到這篇自問自答, http://stackoverflow.com/questions/12846744/cocos2d-opengl-es-becoming-transparent-over-uiview, 雖然只有一個贊, 但確實是網(wǎng)上唯一一個能夠解決該問題的回答. 必須記錄下來以饗后人.
解決方案
1. opengl view初始化時一定要選擇 kEAGLColorFormatRGBA8 像素模式, 這樣才能夠支持透明.
[CCEAGLView viewWithFrame: CGRectMake(0, 0, winHeight, winWidth)
pixelFormat: kEAGLColorFormatRGBA8
depthFormat: GL_DEPTH24_STENCIL8_OES
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0];
2. opengl view要啟用透明模式, 有一個 opaque 屬性, 默認(rèn)為YES, 表示會自動把覆蓋區(qū)域的內(nèi)容遮擋住, 這是為了優(yōu)化渲染快速裁切, 我們要把它設(shè)成 NO.
glClearColor(0, 0, 0, 0);
_cocosView.backgroundColor = [UIColor clearColor];
_cocosView.opaque = NO;
3. cocos2d-x的clear color要設(shè)置為(0, 0, 0, 0). 這個值是opengl在開始渲染每一幀時, 給每個像素設(shè)置的默認(rèn)值. 因為cocos2d-x和UIKit的渲染是在不同opengl管線里實現(xiàn)的, 因為cocos2d-x會把UIKit渲染的內(nèi)容替換到, 表現(xiàn)出來就是黑屏.
這個需要修改cocos2d-x的源代碼, 在 CCDirector.cpp 的 void Director::setGLDefaultValues() 中, 把clear color值改一下就可以了.
使用以上三步操作, 我們就可以現(xiàn)在透明的cocos2d-x界面, 遮罩在UIKit上方.