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

具体的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)'。


  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是一个示例代码,可以创建一个可缩放的 UIView,并确保它的尺寸不会小于父视图: 在 .h 文件声明 UIPinchGestureRecognizer 和一个指向父视图的 UIView 属性: ``` #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (nonatomic, strong) UIPinchGestureRecognizer *pinchGesture; @property (nonatomic, strong) UIView *parentView; @end ``` 在 .m 文件实现 UIPinchGestureRecognizer 和 UIView 的创建和缩放逻辑: ``` #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UIView *resizableView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建父视图 self.parentView = [[UIView alloc] initWithFrame:self.view.bounds]; self.parentView.backgroundColor = [UIColor lightGrayColor]; [self.view addSubview:self.parentView]; // 创建可缩放的视图 self.resizableView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; self.resizableView.backgroundColor = [UIColor redColor]; [self.parentView addSubview:self.resizableView]; // 创建缩放手势识别器 self.pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; [self.resizableView addGestureRecognizer:self.pinchGesture]; } - (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateChanged) { // 计算缩放比例 CGFloat scale = gestureRecognizer.scale; // 计算缩放后的视图大小 CGSize newSize = CGSizeMake(self.resizableView.frame.size.width * scale, self.resizableView.frame.size.height * scale); // 判断缩放后的大小是否小于父视图的大小 if (newSize.width >= self.parentView.frame.size.width && newSize.height >= self.parentView.frame.size.height) { // 缩放视图 self.resizableView.transform = CGAffineTransformScale(self.resizableView.transform, scale, scale); // 重置手势识别器的缩放比例 gestureRecognizer.scale = 1.0; } } } @end ``` 在这个示例,创建了一个父视图 self.parentView 和一个可缩放的子视图 self.resizableView,并将子视图添加到父视图。然后创建了一个 UIPinchGestureRecognizer 对象 self.pinchGesture,并将它添加到子视图。 在 handlePinchGesture: 方法,计算出缩放比例和缩放后的视图大小,并判断缩放后的大小是否小于父视图的大小。如果缩放后的大小不小于父视图的大小,就缩放视图,并重置手势识别器的缩放比例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值