iOS工程集成Cocos2d-x lua模块

本片文章针对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的安装路径中

image.png

把这三个库复制一份到你的目标工程目录中,然后拖进Xcode

image.png
导入文件

接下来我们需要把图中的ClassesResources文件导入到我们工程中,注意这个res src是蓝色的,是要拖入Xcode的时候选择 Create folder references

image.png

Classes文件夹是一些桥接文件直接拖进Xcode

image.png

然后config.json res src分别拖入工程,选择Create folder references

image.png

image.png

导入工作已经完成,这时候编译就会发现会报错找不到cocos2d头文件,接下来添加依赖 frameworks 和 头文件

添加依赖 frameworks

在cocos2d生成的工程中,点击Targets General 看到有这么多依赖包

image.png

除了最下面三个在拖入的时候自动加入了,其他的都需要我们手动添加。
我按照导出工程全加入之后还需要导入GameController.framework,不然会报错。

添加头文件

首先点击PROJECTbuild settingsUser Header Search Paths

image.png

路径是指向Cocos IDE里面的,可能安装路径不同有不同,这个需要自己确认,你最好是复制Cocos2d导出iOS工程的里面的。

然后是TARGETS里面的build settingsUser Header Search Paths

image.png

这里$(inherited)是指继承PROJECT中的User Header Search Paths

然后是TARGETS里面的 Header Search Paths

image.png

这里的$(SRCROOT)指的是你的工程目录,你要根据Classes文件夹在你工程中的位置修改中间路径

最后是TARGETS里面的build settingsLibrary Search Paths

image.png

还有需要在TARGETS里面的build settingsPreprocessing Macros所有环境下都添加一个CC_TARGET_OS_IPHONE

image.png

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

image.png

添加脚本

find ${SRCROOT}/Resources/src/ -name "*" -exec touch -cm {} \;
find ${SRCROOT}/Resources/res/ -name "*" -exec touch -cm {} \;

image.png

这里具体路径要根据你工程中的 src res的位置不同而修改

修改代码

因为Classes包含一个AppDelegate文件会跟原本工程的冲突,这里需要改一个名字,我建议改原生工程的,原生工程名字加个前缀之类的,然后在程序入口main.m中把AppDelegate改成修改后的就行

image.png

启动

如果你想在程序入口启动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就好了,大功告成。

可能出现报错


  1. 'OpenGL/gl.h' file not found
    image.png

看这个引用路径就是在CCGL-mac.h中宏定义判断中被分到了mac平台,

image.png

也就是这个CC_PlATFORM没有被定义为CC_PLATFORM_IOS,肯定是哪里宏定义漏了,查看Cocos2d头文件,发现平台定义是在CCPlatformConfig.h中定义的

image.png

也就是项目缺少一个CC_TARGET_OS_IPHONE的宏定义
所以我们在TARGETS中的build settingsPreprocessing Macros所有环境下都添加一个CC_TARGET_OS_IPHONE

  1. Showing Recent Errors Only :-1: Undefined symbol: _OBJC_CLASS_$_GCController
    image.png

看报错就是缺少framework, 添加GameController.framework解决

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容