1. 程式人生 > >UIKit和Cocos2d-x的整合使用;設定CCEAGLView背景為透明,來顯示背後的UIView; 以及整合中遇到的問題的解決方案

UIKit和Cocos2d-x的整合使用;設定CCEAGLView背景為透明,來顯示背後的UIView; 以及整合中遇到的問題的解決方案

UIKit和Cocos2d-x的整合使用

原來我們的專案通過原始的UIKit來實現應用開發,但是現在需要往應用中增加禮物特效動畫,而禮物特效需要通過cocos2d-x來實現。晚上的方法大多都是通過建立初始的cocos2d工程,再在工程中增加UIKit的實現。最著名的介紹這個方法的連結是:raywenderlich的介紹

但是我們的應用已經相對較大,所以計劃在原有的應用中整合Cocos2d-x。初期走了比較多的歪路,比較複雜,但是後面合併成功後比較簡單。首先把你的cocos2d的工程拷貝到你現有的工程目錄下,新增進你cocos2d資料夾中執行動畫的工程下所有包括的檔案和庫,包括cocos2d lib的工程。

新增完工程檔案的應用後開始更新標頭檔案和庫的引用目錄,在'Build Settings'的'Search Paths'下的'Header Search Paths', 'Library Search Paths', 和'User Header Search Paths'。設定的引數按照cocos2d中的動畫工程的設定,當然你需要更新下路徑到你的現有目錄的相對路徑。

接著在'Build Phases'中的'Link Binary with Libraries'中新增需要用到的庫,注意iOS9以後像是'libz.dylib'更新字尾為'libz.tbd'。此外還需要在‘Target Dependencies’來設定我們的工程的依賴為‘libcocos2d iOS’的。

刪除掉動畫類中的'main.m'的引用,重新命名我們的AppDelegate檔名或者cocos2d動畫的AppDelegate檔名,解決重名錯誤。

此外如果工程在ARC環境下,還需要刪除下MRC環境下的一些'dealloc'和'release'語句。增加'__bridge'來解決C++物件強轉成Objective-C物件時出現的問題。

設定CCEAGLView背景為透明,來顯示背後的UIView

為了顯示Cocos2d-x動畫背後的UIView的內容,嘗試著網上介紹的各種方法,來設定CCEAGLView的引數和Director的預設顏色,但是並沒有效果,依然顯示黑色背景,遮擋住了後面的view。

比較靠譜的一個網上介紹的方法的連結,雖然沒有完全解決問題,但是還挺有參考價值的。

最終發現解決方法是,首先先要在‘CCFrameBuffer.cpp’的初始化方法‘FrameBuffer()’中設定‘_clearColor’的預設值為‘Color4F(0, 0, 0, 0)’。這樣才能使預設的空白顏色clearColor的alpha值為‘0’,才能在設定為空白顏色clearColor時顯示出背後的view的內容。

FrameBuffer::FrameBuffer()
//: _clearColor(Color4F(0, 0, 0, 1))
: _clearColor(Color4F(0, 0, 0, 0))  // set background color alpha to 0.0f, in order to show UIView below -Michaelin 20160606
, _clearDepth(1.0)
, _clearStencil(0)
, _fbo(0)
, _rt(nullptr)
, _rtDepthStencil(nullptr)
, _fboBindingDirty(true)
, _isDefault(false)
#if CC_ENABLE_CACHE_TEXTURE_DATA
, _dirtyFBOListener(nullptr)
#endif
{
    _frameBuffers.insert(this);
}

此外,在新建CCEAGLView的時候需要更改下引數,以允許更改CCEAGLView的alpha值和設定透明的背景。

// Add the view controller's view to the window and display.
    CCEAGLView *eaglView = [CCEAGLView viewWithFrame: animationFrame
                                     pixelFormat: kEAGLColorFormatRGBA8 //allow you to set the alpha value
                                     depthFormat: 0
                              preserveBackbuffer: NO
                                      sharegroup: nil
                                   multiSampling: NO
                                 numberOfSamples: 0 ];
    
    eaglView.backgroundColor = [UIColor clearColor];    //set the background color to clear color
    eaglView.opaque = NO;       //let the view can be transparent

而在上面連結中提到的第三點,在‘CCDirector.cpp’的‘void Director::setGLDefaultValues()’中設定‘glClearColor(0, 0, 0, 0);’是不需要的。這可能是因為Cocos2d-x的版本不同的原因,我的Cocos2d-x版本為3.11.1。

具體的demo可以參考上方我的Github連結中的‘UIKitCocos2dLuaTest’工程。

"stack" file not found 的問題解決方案

在開發中我需要在我的ViewController.h檔案中import "cocos2d.h"和"platform/ios/CCEAGLView-ios.h"兩個cocos2d的標頭檔案來在我們的view中建立CCEAGLView。但是在編譯執行時,一直報“"stack" file not found”的錯誤。查詢了網上的資料(參考連結一參考連結二),這個問題可能是因為我們在.m檔案中引用了'<stack>',或者.cpp檔案或.h檔案中引用了'<stack>',但最後被.m檔案應用了,導致了上面的錯誤。這裡我們的解決方法可以考慮刪除引用,或者把.m檔案的字尾改成.mm,這樣就可以和cpp語言混編不再報錯了。

"use of undeclared identifier static_assert" 的問題解決方案

在將cocos2d-x整合進我原有的工程的過程中遇到了“static_assert”的問題,網上的解釋和解決方案是因為'static_assert'方法是在C++11中支援的,所以我們需要在build的時候使用C++11來編譯。具體方法是在 'Build Settings' 中的 'Apple LLVM 7.1 - Language - C++' 中設定 'C++ Language Dialect'為'GNU++11 [-std=gnu++11]'和'C++ Standard Library'為'libc++ (LLVM C++ standard library with C++11 support)'。