本片文章针对iOS原生工程集成 Cocos2d-x lua
游戏模块, 如果只是为了导出 Cocos2d
工程到iOS端,其实只要打开 Cocos Studio
里面生成的iOS工程就行了。 Cocos2d-js
也类似。最近在搞相关的工作,参考了很多网上的帖子,但是搜索出来的大多都是同一篇文章的转载,时间也比较老了。我这边对我的集成工作做一下记录,希望能帮到后面的人。
环境
- Xcode 10.3
- Cocos-x-3.1.0
其他版本可能有所出入,没做验证
集成
Cocos2d
工程建立过程我就不讲了。因为Cocos2d
是开源的缘故,所以建立的时候可以选择是使用静态库还是源码,网上的相关集成教程大多是源码,所以他们还有一个编译Cocos2d
库,我这里直接选择静态库,所以就没有那个过程了。
打开xxx ▸ TestCocosProject ▸ frameworks ▸ runtime-src ▸ proj.ios_mac▸ xxx.xcodeproj
(如果是其他版本或者建立的是源码工程路径可能不同),这就是Cocos2d
默认生成iOS工程了。默认应该就可以编译成功,如果你只是想要编译/打包iOS工程,那用这个就可以了,这篇文章的目的是要把这个导入原有的iOS工程里面去。
导入Cocos2d
的静态库
先导入Cocos2d
的静态库 libcocos2d iOS.a
libsimulator iOS.a
libluacocos2d iOS.a
(如果这个Cocos2d-js
,这个应该是libjscocos2d iOS.a
), 首先在工程Targets里面的Linked Frameworks and Libraries
中找到任意一个库,右键 Show in Finder 中,就能找到编译好的库,应该是会跳转到你Cocos2d IDE的安装路径中
把这三个库复制一份到你的目标工程目录中,然后拖进Xcode
导入文件
接下来我们需要把图中的Classes
和 Resources
文件导入到我们工程中,注意这个res
src
是蓝色的,是要拖入Xcode的时候选择 Create folder references
。
Classes
文件夹是一些桥接文件直接拖进Xcode
然后config.json
res
src
分别拖入工程,选择Create folder references
。
导入工作已经完成,这时候编译就会发现会报错找不到cocos2d
头文件,接下来添加依赖 frameworks 和 头文件
添加依赖 frameworks
在cocos2d生成的工程中,点击Targets General 看到有这么多依赖包
除了最下面三个在拖入的时候自动加入了,其他的都需要我们手动添加。
我按照导出工程全加入之后还需要导入
GameController.framework
,不然会报错。
添加头文件
首先点击PROJECT
的build settings
的 User Header Search Paths
路径是指向Cocos IDE里面的,可能安装路径不同有不同,这个需要自己确认,你最好是复制
Cocos2d
导出iOS
工程的里面的。
然后是TARGETS
里面的build settings
的 User Header Search Paths
这里$(inherited)是指继承
PROJECT
中的User Header Search Paths
然后是TARGETS
里面的 Header Search Paths
这里的
$(SRCROOT)
指的是你的工程目录,你要根据Classes文件夹在你工程中的位置修改中间路径
最后是TARGETS
里面的build settings
的 Library Search Paths
还有需要在TARGETS
里面的build settings
的 Preprocessing Macros
所有环境下都添加一个CC_TARGET_OS_IPHONE
Other Linker flags
添加$(_COCOS_LIB_IOS_END) $(_COCOS_LIB_IOS_BEGIN) -pagezero_size 10000 -image_base 100000000 -ObjC
Enable Bitcode
设置为NO
脚本
在TARGETS
中的Build Phases
中添加New Run Script Phaes
添加脚本
find ${SRCROOT}/Resources/src/ -name "*" -exec touch -cm {} \;
find ${SRCROOT}/Resources/res/ -name "*" -exec touch -cm {} \;
这里具体路径要根据你工程中的
src
res
的位置不同而修改
修改代码
因为Classes
包含一个AppDelegate
文件会跟原本工程的冲突,这里需要改一个名字,我建议改原生工程的,原生工程名字加个前缀之类的,然后在程序入口main.m
中把AppDelegate
改成修改后的就行
启动
如果你想在程序入口启动cocos2d
,修改AppDelegate.m
(这个是指原生工程中的那个,也就是修改过名字的那个,不是Classes中的那个)后缀为.mm
#import "CDAppDelegate.h"
#import "AppDelegate.h"
#import "RootViewController.h"
#import "platform/ios/CCEAGLView-ios.h"
#import "cocos2d.h"
@interface CDAppDelegate ()
@property (nonatomic, strong) RootViewController *viewController;
@end
static AppDelegate s_sharedApplication;
@implementation CDAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
cocos2d::Application *app = cocos2d::Application::getInstance();
app->initGLContextAttrs();
cocos2d::GLViewImpl::convertAttrs();
CGRect rect = [[UIScreen mainScreen] bounds];
CCEAGLView *eaglView = [CCEAGLView viewWithFrame: rect
pixelFormat: (__bridge NSString*)cocos2d::GLViewImpl::_pixelFormat
depthFormat: cocos2d::GLViewImpl::_depthFormat
preserveBackbuffer: NO
sharegroup: nil
multiSampling: NO
numberOfSamples: 0 ];
[eaglView setMultipleTouchEnabled:YES];
// Use RootViewController manage CCEAGLView
self.viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
self.viewController.wantsFullScreenLayout = YES;
self.viewController.view = eaglView;
[[UIApplication sharedApplication] setStatusBarHidden: YES];
// IMPORTANT: Setting the GLView should be done after creating the RootViewController
cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)eaglView);
cocos2d::Director::getInstance()->setOpenGLView(glview);
app->run();
self.window = [[UIWindow alloc] init];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
@end
如果你想在其他地方启动,就在其他地方present这个RootViewController就好了,大功告成。
可能出现报错
-
'OpenGL/gl.h' file not found
看这个引用路径就是在CCGL-mac.h
中宏定义判断中被分到了mac
平台,
也就是这个
CC_PlATFORM
没有被定义为CC_PLATFORM_IOS
,肯定是哪里宏定义漏了,查看Cocos2d
头文件,发现平台定义是在CCPlatformConfig.h
中定义的
也就是项目缺少一个
CC_TARGET_OS_IPHONE
的宏定义所以我们在
TARGETS
中的build settings
的 Preprocessing Macros
所有环境下都添加一个CC_TARGET_OS_IPHONE
-
Showing Recent Errors Only :-1: Undefined symbol: _OBJC_CLASS_$_GCController
看报错就是缺少framework
, 添加GameController.framework
解决