UIKit和Cocos2d-x的整合使用;设置CCEAGLView背景为透明,来显示背后的UIView; 以及整合中遇到的问题的解决方案

时间:2022-10-30 08:46:28

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对象时出现的问题。

具体的Demo见 Github链接


设置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)'。