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解决

你可能感兴趣的:(iOS工程集成Cocos2d-x lua模块)