cocos2d-js制作的游戏集成到原生app里的方法之iOS版

公司的产品已经完善好了,是原生的应用 ,现在的需求是在应用里嵌入游戏,在app里点击某个按钮就可以直接玩游戏,游戏是用cocos2d-js开发的。之前我整合好了cocos2d-lua版本的,在csdn和CocosChina上也都写了教程,这两天有空把cocos2d-js的也整了一下,在此分享给大家。也希望有大牛能帮忙再优化一下,有些游戏中可能用不到的库比如物理引擎等该怎么删掉。下面就来从零开始详细描述一下吧。我是在Mac上Xcode8.2环境下整的,其他环境可能会有所出入。

1、使用cocos2d-x 3.13版本(当然其他版本也可以的,不过可能有些地方改动不一样),在命令行中新建cocos2d项目,使用js语言。

2、新建成功后,找到文件所在目录,打开,目录如下.

3、然后打开cocos2d_js_binding.xcodeproj工程,如图目录下。

4、按如图配置一下,然后编译(模拟器最好选iphone5,因为之前做cocos2d-lua的时候,xcode8对luajit的支持好像不完善,导致模拟器运行的时候只能选择iphone5及以下,真机的话就没这个问题了)

5、真机调试的话,这里选择Generic iOS Device。debug和release模式看个人了,我一般先用debug,万一有错误的话,查起来方便,之后就改为release。

6、点击左上角那个三角形编译成功后,选中左侧静态库libcocos2d iOS.a,看右边的fullpath,点击最后面的小箭头,就会指引你去这个静态库所在目录啦。

7、如果点击后没跳转的话,那就只能复制一下这个路径了,比如/Users/cxp/Library/Developer/Xcode/DerivedData/cocos2d_libs-gtvjufizxzyrodawozkyysktnkmn/Build/Products/Debug-iphoneos/ 然后打开Finder ,按下Command+shift+G进入文件夹搜索,粘贴后点击前往就可以啦,这次准能找到,再找不到,额,那我,也不知道咋整了。

8、找到的就是这个啦,复制一下备用先。

9、然后把Classes和刚刚生成的libjscocos2d iOS.a拷贝到cocos2d_libs.xcodeproj同级目录下,打开刚刚新建的cocos2d_libs.xcodeproj工程。Classes里面主要是可以连接cocos和ios那边的接口。

10、把Classes和静态库libjscocos2d iOS.a添加到工程里。

11、设置一下头文件查找路径,避免等会出现各种找不到头文件的错误提示。

12、添加cocos需要的相应库,并把静态库拖到那里。

13、如图把Classes下的可执行文件即.mm .cpp文件拖到Compile Sources里,参与编译。

14、这里是重点了(敲黑板状)!把CocosManager.h拖到Headers下面的Public下,其他的头文件都拖到Project下,因为之后CocosManager.h要暴露出来作为接口给iOS用的。

15、然后就是和步骤4、5、6、7一样了生成libcocos2d iOS.a静态库,并找到它拷贝备用。

16、这里编译的时候可能会出现找不到一些.a文件的错误,如图,这时候就把Link Binary With Libraries下的相关.a文件先删掉,然后在左侧的extenal下把刚刚删除的那几个再拖过去,然后在编译一下,还是有错的话就重启Xcode就没问题了,恩,如果还有问题,我也布吉岛啦。

17、这里还要提一下,刚刚的那个CocosManager接口,想起来改了个关于触摸传递的东东。触摸层默认是只能在cocos层或者ios层的,没法穿透,当然可以选择把cocos的view做小,cocos没遮到的ios层就还是可以点击的了,我是做了一个处理,重载了下-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event,使得点击游戏层里的相关部分不穿透,游戏里的其他部分的话就直接穿透到ios层。
@property (nonatomic, assign)CGRect m_notAllowedTouchRect; //不可点击区域
@property (nonatomic, assign)BOOL m_allowedThrough; //是否穿透
上面这两句加到CCEAGLView-ios.h里

18、在CCEAGLView-ios.mm里最上面加入 BOOL b_testHits;

19、在CCEAGLView-ios.mm里最下面重载-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event,
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
if (b_testHits) {
return nil;
}

if (CGRectEqualToRect(self.m_notAllowedTouchRect, CGRectZero)) {
    return self;
}
else{
    //返回Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图
    UIView *hitView = [super hitTest:point withEvent:event];
    if (hitView == self) {
        b_testHits = YES;
        
        CGPoint superPoint = [self.superview convertPoint:point fromView:self];
        UIView *superHitView = [self.superview hitTest:superPoint withEvent:event];
        b_testHits = NO;
        //NSLog(@"CGRectContainsPoint.....x = %f  y = %f",point.x,point.y);
        //NSLog(@"CGRectContainsPoint.....x = %f  y = %f  width = %f  height = %f",self.m_notAllowedTouchRect.origin.x,self.m_notAllowedTouchRect.origin.y,self.m_notAllowedTouchRect.size.width,self.m_notAllowedTouchRect.size.height);
        //判断当前点是否在矩形区域内,不在矩形区域内就穿透
        if (!CGRectContainsPoint(self.m_notAllowedTouchRect, point)) {
            //NSLog(@"CGRectContainsPoint...");
            hitView = superHitView;
        }
        
        if(self.m_allowedThrough){
            hitView = superHitView;
        }
    }
    return hitView;
}

}

20、然后打开CocosManager.mm文件,里面就可以设置触摸不可穿透区域的范围啦。

21、接下来就可以新建一个ios空工程了,然后把刚刚生成的静态库libcocos2d iOS.a和CocosManager.h拷贝到ios工程根目录下,并新建一个Resources文件夹。

22、把cocos工程下的script文件夹整个拷贝到ios工程根目录下。

23、把自己cocos工程下的这四个文件拷贝到刚刚新建的Resources下面。

24、打开ios工程,并添加刚刚加的那些文件。

25、注意添加script文件夹时,选择reference选项。

26、添加Resources后,把里面的文件删除后再以reference方式添加,然后这些文件夹会显示蓝色。

27、给ios工程添加相应框架。

28、在需要接入cocos2d游戏的类里引入CocosManager.h。

29、然后在需要的地方调用相应接口显示游戏。(具体接口实现都在classes里面的CocosManager.mm里)

30、最终的流程就是,ios这边调用接口加载cocos,然后再调用其他接口切换场景。需要其他的接口就改一下CocosManager这类就可以啦,比如显示和隐藏游戏,播放动画什么的。。。

好了,大致流程就是这样了,感觉自己写的好啰嗦啊,果然不是做文案的料子啊。

看到这里的顺手给一个赞呗,鼓励鼓励下:blush:

Classes.zip (15.7 KB)

13赞

赞一个~~~~

我们项目需求跟楼主一样,直接参照cocos creator的导出工程改的,不过native app用到的一些库(ReactiveCocoa)跟cocoslib有冲突,还改了不少源码。思路大体一样啊

感觉这样的需求会变多的,很多app里想加个游戏,原生的写又太麻烦,就想整合各游戏引擎进去,现在Creator也越来越完善了,希望有人能写个Creator相关的教程啊,让以后的开发者少走弯路:grin::grin:

1赞

感觉这样的需求会变多的,很多app里想加个游戏,原生的写又太麻烦,就想整合各游戏引擎进去,现在Creator也越来越完善了,希望有人能写个Creator相关的教程,让以后的开发者少走弯路啊:grin::grin:

楼主能否把完整的demo发出来,到最后一步xcode编译报错了

ld: warning: ignoring file /Users/testCocosJs/testCocosJs/libcocos2d iOS.a, file was built for archive which is not the architecture being linked (i386): /Users/testCocosJs/testCocosJs/libcocos2d iOS.a
Undefined symbols for architecture i386:
OBJC_CLASS$_CocosManager”, referenced from:
objc-class-ref in ViewController.o
ld: symbol(s) not found for architecture i386

这个应该已经很详细了啊,是不是平台那边选择有点问题,macos和ios,还没时间整理demo传,得等闲下来整咯

期待楼主的demo,感谢!

楼主麻烦问一下,照着你的方法做了,但是,出现了一写问题
testCococs2d/CocosManager.h:1:41: Source file is not valid UTF-8
拖进去的cocosManager.h文件打不开是什么情况?

编码格式有问题么看起来

请问win平台可以大致照做么?

可以的,只要能通过某个IDE或者命令行方式打包一个so文件就可以了,eclipse就可以做

:kissing_heart:谢谢楼主

楼主知道Creator怎么整合到app里面吗?

原理是一样的,之前一个朋友弄过了

超级:+1:!非常感谢楼主,适合我们这些入门者!

楼主知道怎么集成creator嘛,非常需要这样的教程,自己按照楼主的四楼集成了3次,都失败了。。。

你好,请问你们是直接导出的creator文件在进行更改,还是游戏做好之后,再导出包

楼主,lua版本在哪呀,求助呀

http://www.cocoachina.com/bbs/read.php?tid-1706940.html,,这里是lua版本的