本文发自 http://www.binss.me/blog/way-to-develop-ios-sdk-for-cocos2dx-games/,转载请注明出处。

由于实训课要求制作SDK并接入到cocos2dx的游戏中,在很开心地用storyboard拖拖拖实现了注册与登录等功能后,发现不知道怎么将其编译并接入到cocos2dx。在研究了一天后,终于成功接入到游戏中。在此总结流程。

  1. 完成代码逻辑

    使用storyboard拖拖拖,然后把对应的controller写完。

  2. 创建bundle

    打开File->New->Target,从OSX的framework选择框中选择Bundle。在这里我将Bundle为UserManageResources。

    在Build Settings中:搜索base SDK,选中并按下delete键,将OSX转为IOS。搜索product name,将${TARGET_NAME}替换为静态库的名字。如UserManageSDK。

    默认情况下,有两种resolutions的图片可以产生一些有趣的现象。例如,当你导入一个retina@2x版本的图片时,普通版的和Retina版的将会合并成一个多resolution的TIFF(标签图像文件格式,Tagged Image File Format)。这不是一件好事。搜索hidpi将COMBINE_HIDPI_IMAGES设置为NO。

    对每个需要添加到bundle的资源文件,在target membership中给bundle的target(UserManageResources)打勾

  3. 创建静态库

    打开File->New->Target,选择Cocoa Touch Static Library。

    在Build Phases中:

    Target Dependencies中添加UserManageResources。

    Copy File中添加所有需要包含的头文件(.h)。

    Compile Sources中添加被包含头文件的实现文件(.m)。

  4. 编译

    command+b编译,编译成功后,可以在/Users/用户名/Library/Developer/Xcode/DerivedData/project名称/Build/Products/Debug-iphonesimulator里找到静态库文件,bundle文件和头文件。

    复制这三个文件到要使用它们的工程目录下放好。

  5. 使用

    将刚刚的三个文件拉入工程目录下

    检查target:

    1. General中Linked Frameworks and Libraries中是否有静态库

    2. Build Phases中Copy Bundle Resources中是否有bundle

    3. 是否已将SDK依赖的Linked Frameworks and libraries都添加进来

    检查后即可使用静态库,如果在使用静态文件(xib, storyboard)时报类似的错误:

    Unknown class XXX in Interface Builder file

    选择target的Build Settings,搜索Other Linker Flags(Target->Build Settings->Linking->Other Linker Flags)添加-force_load $(SRCROOT)/UserManageSDK/libUserManageSDK.a(修改为导入 sdk 到工程的路径)

    如果是纯Objc,可以将Other Linker Flags设置为-ObjC,或者-all_load -ObjC

    如果依然不行,可以通过手动调用类函数来发现类:

    #import "XXX.h"
    [XXX class];

    使用静态库的storyboard示例代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"UserManageSDK" ofType:@"bundle"]];
        UIStoryboard* mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:myBundle];
        self.window.rootViewController = [mainStoryboard instantiateInitialViewController];
        [self.window makeKeyAndVisible];
        return YES;
    }

    这种接入方法的思路是通过直接加载SDK中的storyboard,从而实现为cocos2dx游戏添加了UIKit界面,并且界面背后的控制逻辑被完全隐藏(无API)。

    为了偷懒地进行数据交互,在cocos2dx的AppController中加入观察者,用于SDK回调。

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startGameCallBack:) name:@"StartGame" object:nil];

    比如说接收SDK传来的用户名:

最后附上作业代码:

https://github.com/binss/fly_and_spin