首页 > 代码库 > Cocos2dx-demo演示项目:Part1

Cocos2dx-demo演示项目:Part1

  这个项目,我主要是用来积累、记录自己在利用cocos2dx引擎进行项目开发、学习实践中的开发经验。每天的开发任务、查看别人分享的内容,总是能够收获到可取的东西,将这些可取的东西自己再着手开发一次,能够进一步深刻理解这些,同时今后如果碰到类似的开发需求,我也可以很快的迁移到开发项目中去。所以我将自己日常生活中积累的知识点通过一个演示项目,展示出来。因为没有苹果设备,不具备条件所以我只做安卓这块的开发(相关组件的添加是需要安卓、ios分开添加的)。


 

Part1:友盟社交分享

添加这个组件的原因:

  游戏开发中,如果添加了社交分享元素,那么游戏的互动性将会大大的提升,对于提升游戏留存的能提供很大的帮助。各个社交网站都提供了分享的api接口,如果单独为每个社交分享去写支持接口,那么任务量会挺大的。有需求就会有市场,友盟就提供了社交分享的组件,将大多数社交网站的分享功能都组合都一起了。既然友盟都封装好了,所以我就使用这个组件咯。

  我的笔记是在开发过程中记录下来的,发表到博客是对自己在evernote上记下的东西进行整理。博客也不一定是按照demo项目的各个部分的开发日期顺序来写的。

  官方对如何添加组件有详细的文档,我所记录的是在我添加组件的过程中遇到的一些问题。

1、添加官方提供的代码文件:

  因为要跨平台,所以C++ 2 Java、C++ 2 Object-C是必须的,但是直接将java调用的方法、object-c调用的方法放到工程中去,不做调整的话肯定是有问题的。因此官方就有这样的解决方案:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)#elif(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)#endif

采用预编译宏来解决跨平台编译的问题,这也就是引擎做跨平台支持采用的方案。那么问题来了,友盟这里就有点问题,不过也不怪他,代码中都说了:

技术分享

  人家是机器生成的代码,难免有问题。问题是什么?

技术分享

  主要是安卓这块,即-Android文件夹内部的问题。他没有采用 #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 这个来判断!!!所以无论是用VS、还是用XCODE,都会报错,因为找不到<jni.h>文件,导致编译不了!(其实我很早之前就有做过添加友盟组件的工作,当时也遇到了这个问题,但是限于当时的能力没有发现原来是这个原因引发的问题)。

  所以解决方案就是使用:#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) 这个,将这个文件夹内的类代码处理,vs上不编译。这个类里面其实都是些Java调用C++、C++调用Java的方法,所以直接在win32上是不能通过编译的。

2、分享处理及相关:

  在做自定义按钮分享的时候,在按钮的回调函数中:

技术分享

  这样就可以打开友盟的分享面板了。需要注意的是,分享的回调函数需要是一个全局函数的!即代码中的shareTest是一个全局函数,我觉得这一点在看了实际代码后会更能理解.

3、关于友盟的截图分享功能:

  一个很大的坑:使用/data/data/com.../files/目录下的图片,um的java方法响应不了,因为其代码中没有针对这个做判断!!一直认为图片是空的。。。。坑了我一个下午。

具体来看:(友盟组件2.0,cocos2dx v3.2)

  定位到友盟sdk包里面的文件:Platforms\Android\controller\com\umeng\social\CCUMSocialController.java这个文件。里面提供的一个方法:parseShareImage(String imgName),这函数功能是根据图片存放路径,创建UMImage对象。实现方式是根据imgName这个参数(参数以什么开头,如”assets/”),判断图片的存储路径(如assets文件夹、网络图片、res资源图片,都不是的话就是sd卡目录),只有这几个判断。但是问题来了,游戏中截图后默认图片存放路径是在data/data/com.xxx.xxx/files目录下,所以友盟提供的那个函数找不到这个路径!!!我对安卓不熟啊,所以我折腾了一个下午就是没有得出个所以然,然后又不会使用eclipse进行debug断点调试,只能是通过打印log来查找,花费了很长的时间才找出问题所在。不过我还是学到了东西:要善于通过log进行问题查找!

  解决方案便是修改这个函数,追加一个判断:

 1 else if(imgName.startsWith("/data")){  2  3     if(!TextUtils.isEmpty(imgName)){  4  5     File imgFile = new File(imgName);  6  7     shareImage = new UMImage(mActivity, imgFile);  8  9     }10 }

4、微信分享:

  需要使用微信分享的话,那么游戏的安卓包必须是签名包(怎么签名网上有很多文档),否则启动不了微信的分享activity。这个问题好像(或者是我没有注意到)友盟官方没有提到,所以当时我在添加微信分享的时候,一直打不开微信分享的UI界面,也是折腾了挺久的。

Cocos2dx-demo演示项目:Part1