公司的产品已经完善好了,是原生的应用 ,现在的需求是在应用里嵌入游戏,在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这类就可以啦,比如显示和隐藏游戏,播放动画什么的。。。
好了,大致流程就是这样了,感觉自己写的好啰嗦啊,果然不是做文案的料子啊。
看到这里的顺手给一个赞呗,鼓励鼓励下
Classes.zip (15.7 KB)