当前位置:文档之家› cocos2d-x android 截图分享

cocos2d-x android 截图分享

使用cocos2d-x编写的android游戏或者软件实现截图分享功能:

其实所说的截图,只是用cocos2d-x中的CCRenderTexture来绘制的纹理,底层方面就是用的openGL,具体的原理我目前还不清楚,(汗一个,还在看openGl);先不管openGl了吧,上层的操作很简单。

先上代码:

c++端:

CCSize size = CCDirector::sharedDirector()->getWinSize();
CCRenderTexture* in_texture = CCRenderTexture::renderTextureWithWidthAndHeight((int)size.width, (int)size.height,kCCTexture2DPixelFormat_RGBA8888);

in_texture->begin();
this->getParent()->visit();
in_texture->end();


#ifndef WIN32
bool bSucc = in_texture->saveBuffer("//sdcard/share.png");
#else
bool bSucc = in_texture->saveBuffer("d:\\share.png");
#endif

1.创建一个新的CCRenderTexture. 这里,你可以指定将要创建的纹理的宽度和高度。.
2.调用 CCRenderTexture的begin(). 这个方法会启动OpenGL,并且接下来,任何绘图的命令都会渲染到CCRenderTexture里面去,而不是画到屏幕上。
3.绘制纹理. 你可以使用原始的OpenGL调用来绘图,或者你也可以使用cocos2d-x对象里面已经定义好的visit方法。(这个visit方法就会调用一些opengl命令来绘制cocos2d-x对象)
4.调用 CCRenderTexture的end(). 这个方法会渲染纹理,并且会关闭渲染至CCRenderTexture的通道。
5.调用CCRenderTexture的saveBuffer(),将获得的纹理资源保存成所需的图片(以上说明粘贴了网上一些大牛的原话 :-) )

java端:
Intent intent = new Intent("android.intent.action.SEND");
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_SUBJECT, R.string.share);
intent.putExtra(Intent.EXTRA_TEXT, R.string.sharecon);
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse("file:////sdcard/share.png"));
Log.i("debug", "/data/data/" + ctx.getApplicationInfo().packageName+ "/share.png");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
artActivity(Intent.createChooser(intent, "share"));

java端没什么好说的,就是一个android系统自带的简单分享功能。调用后,系统会帮你找现在手机上有分享功能的软件,并自动帮你分享。不懂的可以看看开发文档。


要点说明:
1.首先是保存路径,为什么选的是sdcard下,而不是自己程序的路径(/data/data/包名/).因为先前考虑到用户手机可能没有装sd卡,所以是写在自己程序内的,而且也不用关心读写权限的问题 ps.在cocos2d-x中可以用CCFileUtils::sharedFileUtils()->getWriteablePath()获取到可读写的文件目录。
但是不知什么原因,在java端读取图片后,可以看到图片的大小,但是却获取不到图片,所以就改存到内存卡上了,就不会存在获取不到图片的问题。ps.鄙人觉得现在的安卓手机都有sd卡吧。

2.就是c++和java交互的问题。就是你c++端

绘制保存好图片后,如何通知java端来获取图片来分享。这就用到jni了,我就不在这里讨论了,网上有很多参考,也不难.

3.java端的分享。当c++端绘制保存图片时会花费一些时间(当然时间应该非常之短),但是根据各自的手机性能来说会有个卡顿,所以建议java的图片分享功能放到另一个线程来调用,因为很多默认的功能都是开在主线程中的(你现在的主线程在绘制保存图片),所以新
开的线程会好些,新开的线程也可以延迟执行分享操作,已确保图片已经绘制保存完毕。ps.自己只是这么考虑的,但是不知道正不正确,当然也可能是自己多想了。

4.小贴士:c++端绘制的纹理可以用kCCTexture2DPixelFormat_RGBA4444代替kCCTexture2DPixelFormat_RGBA8888,这样可以减少图片的绘制细节,绘制出来的图片也会小一些,效果方面也看不出多大的差别。java端分享时,最好判断一下图片是否已经存在了
(可以用Uri u = Uri.parse("file:////sdcard/share.png"),如果u为null,表示当前没有图片,就不要再分享了,要不然会报错,可能也不会,没试过,自己看着办吧:-))

相关主题
文本预览
相关文档 最新文档