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的安装路径中


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

导入文件

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

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

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

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

添加依赖 frameworks

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


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

添加头文件

首先点击PROJECTbuild settingsUser Header Search Paths


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

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


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

然后是TARGETS里面的 Header Search Paths


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

最后是TARGETS里面的build settingsLibrary Search Paths

还有需要在TARGETS里面的build settingsPreprocessing 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就好了,大功告成。

可能出现报错


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

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


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


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

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

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

猜你喜欢

转载自blog.csdn.net/qq_35624156/article/details/127306363