quick cocos2d x-x3.2中怎么做ShareSdk的步骤

cocos2d-x 技术文章 - 编程大巴
cocos2d-x 技术文章
之前学习过c++在cocos2d-x游戏引擎上实现的消灭星星游戏,为了熟悉quickcocos2d-x以及Lua语言,我使用2 1 4版本的quickcocos2d-x重写了消灭星星,不过只是实现了其基本的消除,移动,计分以及过关等功能,一些文
上一章已经学习了环境的搭建。这一章对基础概念进行掌握。内容大概有:1 导演2 场景3 节点4 层4 精灵1 导演(Director)导演存在的主要作用:a 环境设定(帧率初始化openGl和渲染器)b 场景管理c 执行主循环游戏就是
场景切换函数:Director-&getInstance()-&replaceScene(Scene*);Director-&getInstance()-&runWithScene(Scene*);两者的区别在于,如果有Scene存在,使用第一个;第一次运行场景,用第二个。下面是一个切换场景的
该部分我们添加螃蟹伤人事件,道路位置随机添加螃蟹精灵,当角色行走完毕如果停留位置碰到了螃蟹,首先播放伤人动画,然后是播放救护车把角色带走动画。如果轮流到该角色行走时,吐司提示住院还有几天,当住院天
这里是Evankaka的博客,欢迎大家前面讨论与交流~~~~~~出处http:
blog csdn net evankaka article details 本文这里将要实现的一个功能是怪物受伤血量减少时,会出现一个扣了多少血量的数字从怪物
开发cocos2d-x前端的非核心开发人员对于编辑器的选择,多数的选择有两个,一个是传统的ultraedit,另外的就是现在很流行的sublimetext 以前我是比较喜欢用ultraedit的,但是现在用了一段时间的sublimetext,也渐渐的喜
cocos2d-x开发,包括核心模块接口开发和脚本部分的业务逻辑实现 从上层应用需求开始说,脚本在做业务逻辑实现的时候,很多时候都需要依赖底层的接口功能,但是不是所有的人都可以游刃有余的去明白该怎么使用下层的接
这部分代码从网上查阅了一下,基本都是以前版本编写的,需要稍微改动一下即可,效果如图首先看看在MenuScene cpp如是如何调用起对话框的voidMenuScene::popupLayer(){
定义一个弹出层,传入一张背景图PopupLaye
什么是热更新所谓的热更新,指的是客户端的更新。大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端。热更新代码
相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK。这篇文章主要是对我做过项目中接入iOS原生SDK实现
Cocos2d中一些验证正则表达式:邮箱: if(CC_TARGET_PLATFORM==CC_PLATFORM_WIN32)regexpattern(&([0-9A-Za-z
]+)@([0-9a-z]+
[a-z]{2,3}(
[a-z]{2})?)&);if(!std::regex_match(m_pRegEmail-&getText(),
在Coco2d-x3 2版本中,对LuaSocket进行了集成,我们可以直接在程序中调用luaSocket进行方便的TCP UDP FTP HTTP等等通讯,非常方便。下边先上一段代码:localsocket=require(&socket&)localhost=&115 28 * *&loca
1 三维拾取技术在3D游戏中通常会有这样的需求,用户可以选取3D世界中的某些物体进行如拖拽等操作,这时便需要程序通过将二维屏幕上的点坐标转换为三维世界中的坐标,并进行比对,这个过程就需要用到三维拾取。三
本文使用万普广告平台往Cocos2d-x3 1项目中添加广告。万普的SDKforCocos2d-x功能挺全的,只是官方文档的使用说明中使用的Cocos2d-x引擎是2 0 1,平台是Windows下的,年代有点久远,本文主要介绍Mac10 9 5+XCode6
我一直用WIN7+VS2012开发cocos2d-x游戏。但是,我一直郁闷一件事,之前也说过,就是,这个情况:周围的黑乎乎的是肿么情况啊!!!后来,在做2048的时候,找到了解决办法。最后效果图是这样的:如何做到的呢?其
Cocos2d-x3 0以上版本的环境搭建和之前的Cocos2d-x2 0版差异较大的,同时从Cocos2d-x3 0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷!OK,现在就开始搭建环境吧!
创建一个Cocos2d-X工程,工程的目录如下图所示:在Resourcees文件夹中添加一张png& 26684;式的图片在HelloWorldScene cpp文件中的boolHelloWorld::init()函数中添加下面的代码
调用CCLayer的父类的初始化函数if
精灵:Cocos2d中的精灵和其他游戏引擎中的精灵相& 20284;,它可以移动,旋转,缩放,执行动画,并接受其他转换。Cocos2dx的Sprite(精灵)由Texure,frame和animation组成,由openes负责渲染。主要的类关系如下:
LUABinding比JSBinding要简单,无论是使用脚本自动绑定还是手动写绑定代码,都能很轻松实现在LUA访问C++的类和对象。但如果想在C++里访问LUA里的自定义类和对象,则需要再自己修改一下C++的代码了。应用场景:1、
碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高。在Cocos2d-x3 x中使用事件派发机制管理碰撞事件,EventListenerPhysicsContact是碰撞事件监听器。碰撞检测相
AndroidStudio的SVN安装和使用方法与我以前用的其他I...
:软件工程师
:软件开发工程师
:软件开发工程师
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
北京时间4月12日凌晨消息,市场研究公司comScore周......3717人阅读
cocos2d-x(IOS)学习日志(6)
转载请标明:转载自【小枫栏目】,博文链接:http://blog.csdn.net/my/article/details/
ShareSDK是为iOS的APP提供社会化功能的一个组件,开发者只需10分钟即可集成到自己的APP中,它不仅支持如QQ、微信、新浪微博、腾讯微博、开心网、人人网、豆瓣、网易微博、搜狐微博、facebook、twitter、google+等国内外主流社交平台,还有强大的统计分析管理后台,可以实时了解用户、信息流、回流率、传播效应等数据,有效的指导日常运营与推广,同时为APP引入更多的社会化流量。
二、功能要求
实现新浪微博、腾讯微博、QZone的分享、绑定、取消绑定、关注等功能
三、实现步聚
步骤一:注册ShareSDK帐号及新浪、腾讯的APPKEY
1.注册Sharesdk帐号
请登陆并注册帐号。&
注册成功后,在首页点击”我的应用”&
因为我之前已经创建过,无妨,点击添加按钮&
选中您需要的平台和应用名称,因为我需要支持android,ios,所以创建了两个应用,分别是PokerFaceAndroid, PokerFaceIOS用以区分。
选择一个应用,你将在”下载SDK”的底部发现Appkey的字样,这个就是将来你要用到的key。下载相应的SDK备用。
2.介绍一下新浪微博,腾讯微博,QZone这三个平台的appkey的申请方法&
【新浪微博】&
进入/developers,进行开发者帐号的申请与身份认证,具体不再赘述。
验证过程可能需要点时间,请稍安勿躁,看下面的介绍&
进入/development/mobile&
点击创建应用&
输入您应用的相关信息,注意,选择您需要的平台,并创建。创建完成后可到管理界面查看应用的基本情况。&
记下AppKey和AppSecret,接下来提供给sharesdk使用。&
这里有个坑,如果你按照上面的步骤创建了应用,你在分享的时候会出现报错error:redirect_uri_mismatch。解决方法就是进入应用程序-高级信息里设置安全设置里的域名绑定。
至此,sina微博的app申请流程介绍完毕,sina微博的规则是自申请之日3天后才能开启审核,so,这段时间加油写代码吧。
【腾讯微博】&
跟新浪微博一样,腾讯微博也要进行类似的操作,进入http://dev./development/developer/&
填写相关的资料进行审核和资质验证。&
验证通过后点击“创建应用”&
根据提示填写相关资料&
提交后,进入“管理中心”可以看到我们应用的基本信息&
Tencent微博也就这么happy的结束了&
【QZone】&
进入/intro/login/,点击申请加入,经过一系列的申请,审核,验证的操作,进入管理中心&
点击创建应用&
这里,我们选择移动应用&
补全相关信息。点击创建应用,我们就可以在“管理中心”内看到我们创建的应用了。&
至此,这三个平台的注册,创建过程介绍完毕。
步骤二:下载官方sharesdk(ios版),解压后得到如下图所示的文件列表
步骤三:添加依赖框架(FrameWork)
添加依赖框架(Framework)&
打开项目设置中的Build Phases页,在“Link Binary With Libraries”一栏中,点击左下角的“+”号;在弹出窗口里面分别以下库加入到项目中:&
SystemConfiguration.framework&
QuartzCore.framework&
libicucore.dylib&
libz.1.2.5.dylib&
//下面的描述来自官方文档 BEGIN&
打开*-Info.plist(*代表你的工程名字)。在配置文件中新增一项URL types&(如果存在可以不创建),展开URL types –URL Schemes,在URL Schemes下分别各新增一项用于新浪微博和Facebook授权的Scheme(如果不添加则会导致新浪微博或Facebook的SSO授权方式无法返回应用)。
其中新浪填写格式为:sinaweibosso.,其中后面的数字段为你在新浪微博申请的AppKey。
Facebook填写格式为:fb179,其中后面的数字段为你在Facebook申请的AppKey&
//from官方文档 END&
步聚四:实现代码
1.导入头文件ShareSDK.h并初始化社交平台的APP的信息。
AppController.mm
#import &ShareSDK/ShareSDK.h&
//初始化交平台
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:self];
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
return [ShareSDK handleOpenURL:url wxDelegate:self];
2.实现功能SocialShareIOS类
SocialShareIOS.h文件
SocialShareIOS.h
Created by IDEA-MAC03 on 13-8-14.
#ifndef __shareSDK__SocialShareIOS__
#define __shareSDK__SocialShareIOS__
#include &cocos2d.h&
using namespace cocos2d;
class SocialShare{
void init();
void end();
void updateWeiboInfo(const char* strWeiboName);
void weiboShare(const char* strWeiboName,const char* strTitle,const char* strText,const char* strImageDir,const char* strTitleUrl,const char* strImageUrl,const char* strSiteUrl);
void weiboFollowFriend(const char* strWeiboName, const char *strAccount);
void doWeiboResultFunc(const char* strWeiboName,int state1, int state);
void weiboAuth(const char* strWeiboName);
void weiboRemoveAccount(const char* strWeiboName);
std::string weiboGetUserId(const char* strWeiboName);
std::string weiboGetUserName(const char* strWeiboName);
static SocialShare *create(void);
SocialShare(void);
virtual ~SocialShare(void);
#endif /* defined(__shareSDK__SocialShareIOS__) */
SocialShareIOS.mm
SocialShareIOS.cpp
Created by IDEA-MAC03 on 13-8-14.
#include &SocialShare.h&
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
//#include
#import &ShareSDK/ShareSDK.h&
SocialShare *m_sShare = NULL;
typedef struct WeiboUserInfo
std::string userID;
std::string userN
}WeiboUserI
std::map&ShareType, WeiboUserInfo& g_mapUserI
bool g_bSocialShareInited =
//对shareSDK初始化
void SocialShare::init()
if (!g_bSocialShareInited) {
m_sShare = new SocialShare();
g_mapUserInfo.clear();
//你注册的sharesdk的appkey
[ShareSDK registerApp:@&api20&];
[ShareSDK connectSinaWeiboWithAppKey:@&& appSecret:@&38a4ff9f0daaf31e02e3& redirectUri:@&&];
//腾讯微博
[ShareSDK connectTencentWeiboWithAppKey:@&&
appSecret:@&ae36f4ee3946e1cbb98dff5c&
redirectUri:@&&];
[ShareSDK connectQZoneWithAppKey:@&&
appSecret:@&aed9be27bae87cd&];
g_bSocialShareInited =
//释放变量
void SocialShare::end()
delete m_sS
m_sShare = NULL;
//ShareType SocialShare::getWeiboType(const char* strWeiboName)
ShareType type = ShareTypeA
if (!strWeiboName || strlen(strWeiboName)==0) {
CCLOG(&SocialShare::getWeiboType strWeiboName is null!&);
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
//更新用户操作信息
void SocialShare::updateWeiboInfo(const char* strWeiboName)
//ShareType type = getWeiboType(strWeiboName);
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
if (type == ShareTypeAny) {
[ShareSDK getUserInfoWithType:type authOptions:nil result:^(BOOL result, id userInfo, id error)
if (result) {
WeiboUserI
tmp.userName = [[userInfo nickname]UTF8String];
tmp.userID = [[userInfo uid]UTF8String];
g_mapUserInfo[type] =
g_mapUserInfo.erase(type);
strWeiboName:选择平台;
strTitle:默认分享内容;
strTitle:标题;
strText:分享内容
strImageDir:图片
strTitleUrl:标题链接
strImageUrl:图片链接
strSiteUrl:内容链接
void SocialShare::weiboShare(const char* strWeiboName,const char* strTitle,const char* strText,const char* strImageDir,const char* strTitleUrl,const char* strImageUrl,const char* strSiteUrl)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
if (type == ShareTypeAny) {
char _strTitleUrl[128] = &\0&;
if (strTitleUrl && strlen(strTitleUrl)&0) {
strcpy(_strTitleUrl, strTitleUrl);
NSString *imagePath = [NSString stringWithUTF8String:strImageDir];
id publicContent = [ShareSDK content:[NSString stringWithUTF8String:strText]
//分享内容
defaultContent:@&&
//默认分享内容
image:[ShareSDK imageWithPath:imagePath]
//分享图片
title:[NSString stringWithUTF8String:strTitle]
url:[NSString stringWithUTF8String:_strTitleUrl]
description:[NSString stringWithUTF8String:strText]
//主体内容
mediaType:SSPublishContentMediaTypeText];
//分享类型
[ShareSDK shareContent:publicContent
//内容对象
//平台类型
authOptions:nil
//授权选项
statusBarTips:YES
//状态栏提示
//返回事件
^(ShareType type, SSPublishContentState state, id statusInfo, id error, BOOL end)
if (state == SSPublishContentStateFail) {
NSLog(@&weiboShare %@&, [NSString stringWithFormat:@&分享失败%@&, [error errorDescription]]);
if (state !=0) {
doWeiboResultFunc(strWeiboName, 1, (int)state);
updateWeiboInfo(strWeiboName);
NSLog(@&分享成功&);
void SocialShare::weiboFollowFriend(const char* strWeiboName, const char *strAccount)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
if (type == ShareTypeAny) {
[ShareSDK followUserWithType:type
//平台类型
field:[NSString stringWithUTF8String:strAccount] //用户信息字段值
fieldType:SSUserFieldTypeName
//用户名称
authOptions:nil
//授权选项
viewDelegate:nil
//非Facebook平台可以传入nil
result:^(SSResponseState state, id userInfo, id error)
if (state == SSResponseStateFail)
NSLog(@&weiboShare %@&, [NSString stringWithFormat:@&关注失败%@&, [error errorDescription]]);
if (state != 0)
doWeiboResultFunc(strWeiboName, 1, (int)state);
updateWeiboInfo(strWeiboName);
void SocialShare::weiboAuth(const char* strWeiboName)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
if (type == ShareTypeAny)
[ShareSDK authWithType:type options:nil result:^(SSAuthState state, id error) {
if (state == SSAuthStateFail)
NSLog(@&weiboShare %@&, [NSString stringWithFormat:@&授权失败%@&, [error errorDescription]]);
if (state != 0)
doWeiboResultFunc(strWeiboName, 1, (int)state);
updateWeiboInfo(strWeiboName);
//取消授权
void SocialShare::weiboRemoveAccount(const char* strWeiboName)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
if (type == ShareTypeAny)
//[ShareSDK ssoEnabled:NO];
[ShareSDK cancelAuthWithType:type];
doWeiboResultFunc(strWeiboName, 4, 1);
updateWeiboInfo(strWeiboName);
//获取用户ID
std::string SocialShare::weiboGetUserId(const char* strWeiboName)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
std::map&ShareType, WeiboUserInfo&::iterator mi = g_mapUserInfo.find(type);
if (mi != g_mapUserInfo.end())
return mi-&second.userID;
return &&;
//获取用户名
std::string SocialShare::weiboGetUserName(const char* strWeiboName)
ShareType type = ShareTypeA
if (strcmp(strWeiboName,&SOCIALSHARE_SINAWEIBO_NAME&)==0) {
type = ShareTypeSinaW
else if(strcmp(strWeiboName, &SOCIALSHARE_TENCENTWEIBO_NAME&) == 0)
type = ShareTypeTencentW
else if (strcmp(strWeiboName,&SOCIALSHARE_QZONE_NAME&) == 0)
type = ShareTypeQQS
std::map&ShareType, WeiboUserInfo&::iterator mi = g_mapUserInfo.find(type);
if (mi != g_mapUserInfo.end())
return mi-&second.userN
return &&;
void SocialShare::doWeiboResultFunc(const char* strWeiboName,int state1, int state)
步骤五:测试API
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include &cocos2d.h&
class HelloWorld : public cocos2d::CCLayer
// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
virtual bool init();
// there's no 'id' in cpp, so we recommend to return the class instance pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// preprocessor macro for &static create()& constructor ( node() deprecated )
CREATE_FUNC(HelloWorld);
//add code
void onweiboid(CCObject* sender);
void onweiboname(CCObject* sender);
void onweiboauth(CCObject* sender);
void onweibofollow(CCObject* sender);
void onweiboshare(CCObject* sender);
void onremovecount(CCObject* sender);
std::string saveScreen(const char *fileName);
#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
在init()内添加文字菜单
CCMenuItemFont * weiboid = CCMenuItemFont::create((&获取微博id&),this,menu_selector(HelloWorld::onweiboid));
CCMenuItemFont * weiboname = CCMenuItemFont::create((&获取微博名字&),this,menu_selector(HelloWorld::onweiboname));
CCMenuItemFont * weiboauth = CCMenuItemFont::create((&微博授权&),this,menu_selector(HelloWorld::onweiboauth));
CCMenuItemFont * removecount = CCMenuItemFont::create((&删除帐号&),this,menu_selector(HelloWorld::onremovecount));
CCMenuItemFont * weibofollow = CCMenuItemFont::create((&微博关注&),this,menu_selector(HelloWorld::onweibofollow));
CCMenuItemFont * weiboshare = CCMenuItemFont::create((&微博分享&),this,menu_selector(HelloWorld::onweiboshare));
CCMenu *menu = CCMenu::create(weiboid,weiboname,weiboauth,weibofollow,weiboshare,removecount,NULL);
CCPoint menuPostion = menu-&getPosition();
menu-&setPosition(menuPostion.x,menuPostion.y+size.height*0.1f);
menu-&alignItemsVertically();
addChild(menu);
点击事件处理方法
void HelloWorld::onweiboid(CCObject* sender)
SocialShare *mySocialShare = new SocialShare();
CCLOG(&HelloWorld::onweiboid\t%s&,mySocialShare-&weiboGetUserId(&SOCIALSHARE_SINAWEIBO_NAME&).c_str());
delete mySocialS
void HelloWorld::onweiboname(CCObject* sender)
SocialShare *mySocialShare = new SocialShare();
CCLOG(&HelloWorld::onweiboid\t%s&,mySocialShare-&weiboGetUserName(&SOCIALSHARE_SINAWEIBO_NAME&).c_str());
delete mySocialS
void HelloWorld::onweiboauth(CCObject* sender)
SocialShare *mySocialShare = new SocialShare();
mySocialShare-&weiboAuth(&SOCIALSHARE_SINAWEIBO_NAME&);
delete mySocialS
void HelloWorld::onweibofollow(CCObject* sender)
SocialShare *mySocialShare = new SocialShare();
mySocialShare-&weiboFollowFriend(&SOCIALSHARE_SINAWEIBO_NAME&, &热血枫叶&);
delete mySocialS
void HelloWorld::onweiboshare(CCObject* sender)
std::string strFile = saveScreen(&Icon.png&);
SocialShare *mySocialShare = new SocialShare();
if (!strFile.empty()) {
mySocialShare-&weiboShare(&SOCIALSHARE_SINAWEIBO_NAME&, &PokerFace测试&, &大家可以来关注哦,@李东日-ldr123 http://ldr123.mobi&, &Icon.png&,&&,NULL,NULL);
delete mySocialS
std::string HelloWorld::saveScreen(const char *fileName)
std::string strResult = &&;
bool bResult =
CCSize size = CCDirector::sharedDirector()-&getWinSize();
CCRenderTexture *screen = CCRenderTexture::create(size.width, size.height);
CCScene* temp = CCDirector::sharedDirector()-&getRunningScene();
screen-&begin();
temp-&visit();
screen-&end();
CCImage *pImage = screen-&newCCImage();
if (pImage) {
strResult = CCFileUtils::sharedFileUtils()-&getWriteablePath()+fileN
bResult = pImage-&saveToFile(strResult.c_str(), true);
CC_SAFE_DELETE(pImage);
CC_SAFE_DELETE(screen);
if (bResult) {
return strR
return &&;
void HelloWorld::onremovecount(CCObject* sender)
SocialShare *mySocialShare = new SocialShare();
mySocialShare-&weiboRemoveAccount(&SOCIALSHARE_SINAWEIBO_NAME&);
delete mySocialS
四、效果图:
引用博客:http://ldr123.mobi/?p=90
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:320716次
积分:4791
积分:4791
排名:第4198名
原创:149篇
转载:15篇
评论:150条
阅读:5717
文章:19篇
阅读:27394
阅读:21311
文章:24篇
阅读:26794
(9)(1)(4)(1)(1)(3)(4)(2)(1)(5)(5)(8)(2)(15)(21)(16)(35)(10)(22)Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++ Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。手机游戏,可以写在C++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry等操作系统中。
这篇文章主要介绍了Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题的解决方法以及需要注意的问题,需要的朋友可以参考下
给自己的手机游戏增加些社交分享功能,有助于游戏宣传和提升知名度,是一种不错的社交营销手段。国内这方面的第三方插件有不少,比如ShareSDK、友 盟分享组件、Baidu分享组件等,之前在研究2.2.2版本时,集成了ShareSDK这个组件,这次迁移到Cocos2d-x 3.0rc2依旧选择集成ShareSDK,这里就来说说集成的过程,遇到的一些问题以及解决方法。这里仅以Android平台游戏集成为例。
一、功能描述、SDK版本和帐号准备
功能大致是这样的:在游戏中设置一个按钮,点击这个按钮,弹出知名社交平台的分享图标集窗口,用户选择分享目标后,相关信息分享到对应的社交平台。分享结果通知通过Toast显示在屏幕的下方。
这次依旧使用ShareSDK for Android 2.3.7版本(ShareSDK-Android-2.3.7),Cocos2d-x的版本为3.0rc2。
集成前,你需要有一个基于Cocos2d-x 3.0rc2的可运行的Android平台游戏project,我们的集成就基于该project,这里我们的project名为GameDemo,GameDemo的源码结构大致是:
&&& – Classes/
&&& – proj.android/
&&& – Resources/
&&& – cocos2d/
&&& – CMakeLists.txt
&&& – … …
使用ShareSDK前,你需要在各大主流社交平台(微信、微博)申请开发者帐号以及游戏接入权限(app_key、app_secret)等,当然在ShareSDK站点也应该有自己的帐号和应用AppKey,这些申请的审核需要几个工作日,甚至更长。
二、ShareSDK集成步骤
按照ShareSDK官方manual说法,Cocos2d-x集成ShareSDK有三种方式,之前在Cocos2d-x 2.2.2引擎中采用的是专用组件集成的方式,该组件(C2DXShareSDKSample)可以在这里下载(/ShareSDKPlatform/C2DXShareSDKSample,该组件近期已经fix了我之前发现的bug)。
1.jar包集成
这次我们主要做微博、微信的社交分享,因此只需要微博、微信相关jar包。在C2DXShareSDKSample/proj.android/libs下,我们找到以下几个jar包:
& -rw-rw-r– 1 tonybai tonybai& 97K& 4月& 8 18:10 mframework.jar
& -rw-rw-r– 1 tonybai tonybai 112K& 4月& 8 17:39 ShareSDK-Core-2.3.7.jar
& -rw-rw-r– 1 tonybai tonybai& 19K& 4月& 8 17:39 ShareSDK-SinaWeibo-2.3.7.jar
& -rw-rw-r– 1 tonybai tonybai 4.3K& 4月& 8 17:39 ShareSDK-Wechat-2.3.7.jar
& -rw-rw-r– 1 tonybai tonybai& 29K& 4月& 8 17:39 ShareSDK-Wechat-Core-2.3.7.jar
& -rw-rw-r– 1 tonybai tonybai 4.6K& 4月& 8 17:39 ShareSDK-Wechat-Favorite-2.3.7.jar
& -rw-rw-r– 1 tonybai tonybai 4.4K& 4月& 8 17:39 ShareSDK-Wechat-Moments-2.3.7.jar
把这些jar包文件Copy到GameDemo/proj.android/libs下。
2. 配置文件与资源部分集成
修改GameDemo/proj.android/AndroidManifest.xml文件,在application标签下,添加如下Activity标签:
&&&&&&& &activity
&&&&&&&&&&& android:name="cn.sharesdk.framework.ShareSDKUIShell"
&&&&&&&&&&& android:configChanges="keyboardHidden|orientation|screenSize"
&&&&&&&&&&& android:screenOrientation="portrait"
&&&&&&&&&&& android:theme="@android:style/Theme.Translucent.NoTitleBar"
&&&&&&&&&&& android:windowSoftInputMode="stateHidden|adjustResize" &
&&& &/activity&
&&& &activity
&&&&&&&&&&& android:name=".wxapi.WXEntryActivity"
&&&&&&&&&&& android:configChanges="keyboardHidden|orientation|screenSize"
&&&&&&&&&&& android:exported="true"
&&&&&&&&&&& android:screenOrientation="portrait"
&&&&&&&&&&& android:theme="@android:style/Theme.Translucent.NoTitleBar" /&
将C2DXShareSDKSample/proj.android/res下的如下目录中的文件复制到GameDemo/proj.android/res下:
&& drawable-hdpi/& drawable-ldpi/& drawable-mdpi/
&& drawable-xhdpi/& layout/& values/& values-en/
注意,类似icon.png这种文件就不要复制了,自己做一下判断就好。
3. C++部分代码集成
将C2DXShareSDKSample/Classes下的C2DXShareSDK文件夹Copy到GameDemo/Classes下面。
由于Cocos2d-x 3.0rc2的类命名发生了变化,我们需要对C2DXShareSDK中使用到的引擎中的类名以及方法名进行修改。但实际上Cocos2d-x 3.0rc2考虑到了一些兼容性的问题,大部分名字通过cocos2d/cocos/deprecated/CCDeprecated.h中定义的typedef得以保留,虽然这些名字已经被建议deprecated了。rc2中CCObject被改名为Ref了,这个我们需要手工在C2DXShareSDK进行修改。
另外ShareSDK组件在实现时大量使用了CCDictionary、CCArray和CCString,而这三个类在Cocos2d-x 3.0rc2中均被deprecated了,但我们依然可以使用,所以我们可以不做修改。但以后随着cocos2d-x版本的演进,这些类很可能被彻底移除出引擎,我们就需要重新使用其替代品进行实现了。
此外我们还需要手工修改一下C2DXShareSDK/Android/JSON/CCJSONConverter.cpp文件中的getObjJson方 法,因为rc2中CCDictionary、CCString、CCArray这些类的真实名称都已经换成了__Dictionary、__String 和__Array,CCDictionary、CCString、CCArray只是些typedef,因此要像下面这样做些修改(如果你是集成 cocos2d-x 2.x.x版本,则无需做下面修改):
cJSON * CCJSONConverter::getObjJson(Ref * obj)
&&& std::string s = typeid(*obj).name();
&&& if(s.find("__Dictionary")!=std::string::npos){
&&&&&&& cJSON * json = cJSON_CreateObject();
&&&&&&& convertDictionaryToJson((CCDictionary *)obj, json);
&&& }else if(s.find("__Array")!=std::string::npos){
&&&&&&& cJSON * json = cJSON_CreateArray();
&&&&&&& convertArrayToJson((CCArray *)obj, json);
&&& }else if(s.find("__String")!=std::string::npos){
&&&&&&& CCString * s = (CCString *)
&&&&&&& cJSON * json = cJSON_CreateString(s-&getCString());
&&& }else if(s.find("CCNumber")!=std::string::npos){
&&&&&&& CCNumber * n = (CCNumber *)
&&&&&&& cJSON * json = cJSON_CreateNumber(n-&getDoubleValue());
&&& }else if(s.find("CCNull")!=std::string::npos){
&&&&&&& cJSON * json = cJSON_CreateNull();
&&& CCLog("CCJSONConverter encountered an unrecognized type");
&&& return NULL;
CCNumber和CCNull是ShareSDK组件自己实现的类名,这里无需修改。
接下来我们需要在AppDelegate.cpp中对ShareSDK做初始化了:
bool AppDelegate::applicationDidFinishLaunching() {
&&& initShareSDK();
void AppDelegate::initShareSDK(){&&& // sina weibo&&& CCDictionary *sinaConfigDict = CCDictionary::create();&&& sinaConfigDict-&setObject(CCString::create("YOUR_WEIBO_APPKEY"), "app_key");&&& sinaConfigDict-&setObject(CCString::create("YOUR_WEBIO_APPSECRET"), "app_secret");&&& sinaConfigDict-&setObject(CCString::create(""), "redirect_uri");&&& C2DXShareSDK::setPlatformConfig(C2DXPlatTypeSinaWeibo, sinaConfigDict);
&&& // wechat&&& CCDictionary *wcConfigDict = CCDictionary::create();&&& wcConfigDict-&setObject(CCString::create("YOUR_WECHAT_APPID"), "app_id");&&& C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiSession, wcConfigDict);&&& C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiTimeline, wcConfigDict);&&& C2DXShareSDK::setPlatformConfig(C2DXPlatTypeWeixiFav, wcConfigDict);
&&& C2DXShareSDK::open(CCString::create("YOUR_SHARESDK_APPKEY"), false);}
在Share按钮的事件回调函数中调用ShareSDK的接口进行社交平台分享:
void GameScene::menuShareCallback(Ref* sender)
&&& Dictionary *content = Dictionary::create();
&&& content-&setObject(String::create("ShareSDK for Cocos2d-x 3.0rc2社交分享测试。")&&&&&&&&&&&&&&&&&&&&&&& , "content");&&& content-&setObject(String::create("ShareSDK分享测试"), "title");&&& content-&setObject(String::create(""), "titleUrl");&&& content-&setObject(String::create(""), "url");&&& content-&setObject(String::create("Tony Bai"), "site");&&& content-&setObject(String::create(""), "siteUrl");&&& content-&setObject(String::createWithFormat("%s", YOUR_LOCAL_IMAGE_PATH)&&&&&&&&&&&&&&&&&&&&&& , "image");&&& content-&setObject(String::createWithFormat("%d", C2DXContentTypeNews)&&&&&&&&&&&&&&&&&&&&&& , "type");
&&& C2DXShareSDK::showShareMenu(NULL, content, CCPointMake(100, 100),&&&&&&&&&&&&&&&&&&&&&&&&& C2DXMenuArrowDirectionLeft, shareResultHandler);}
void shareResultHandler(C2DXResponseState state,&&&&&&&&&&&&&&&&&&&&&&& C2DXPlatType platType,&&&&&&&&&&&&&&&&&&&&&&& Dictionary *shareInfo,&&&&&&&&&&&&&&&&&&&&&&& Dictionary *error){&&& AppDelegate *app = (AppDelegate*)Application::getInstance();&&& switch (state) {&&&&&&& case C2DXResponseStateSuccess:&&&&&&&&&&& CCLog("Share Ok");&&&&&&&&&&& app-&showShareResultToast("分享成功");&&&&&&&&&&&&&&&&&& case C2DXResponseStateFail:&&&&&&&&&&& app-&showShareResultToast("分享失败");&&&&&&&&&&& CCLog("Share Failed");&&&&&&&&&&&&&&&&&& default:&&&&&&&&&&&&&& }}
showShareResultToast实现如下:
void AppDelegate::showShareResultToast(const char *msg)
&&& JniMethodI
&&& if (JniHelper::getStaticMethodInfo(t, "YOUR_ACTIVITY_NAME",
&&&&&&& "showShareResultToast", "(Ljava/lang/S)V")) {
&&&&&&& jstring jmsg = t.env-&NewStringUTF(msg);
&&&&&&& t.env-&CallStaticVoidMethod(t.classID, t.methodID, jmsg);
&&&&&&& if (t.env-&ExceptionOccurred()) {
&&&&&&&&&&& t.env-&ExceptionDescribe();
&&&&&&&&&&& t.env-&ExceptionClear();
&&&&&&&&&&&
&&&&&&& t.env-&DeleteLocalRef(t.classID);
4. Java部分代码集成
在GameDemo/proj.android/src下面建立cn/sharesdk路径,将C2DXShareSDKSample /proj.android/src/cn/sharesdk下的onekeyshare和ShareSDKUtils.java Copy到GameDemo/proj.android/src/cn/sharesdk下面。
将ShareSDK-Android-2.3.7.zip解压后的ShareSDK for Android/Src/wxapi Copy到GameDemo/proj.android/src/com.tonybai.game/下。
修改GameDemo/proj.android/src/com.tonybai.game/GameDemoActivity.java文件:
import android.widget.T
import cn.sharesdk.ShareSDKU
public class GameDemoActivity extends Cocos2dxActivity {
&&& private static C
&&& private static Handler notifyHandler = new Handler() {&&&&&&& public void handleMessage(Message msg) {&&&&&&&&&&& switch (msg.what) {&&&&&&&&&&&&&&& case 1:&&&&&&&&&&&&&&&&&&& String message = (String) msg.&&&&&&&&&&&&&&&&&&& Toast.makeText(context, message,&&&&&&&&&&&&&&&&&&&&& Toast.LENGTH_SHORT).show();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& default:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }&&& };
&&& @Override&&& protected void onCreate(Bundle savedInstanceState) {&&&&&&& super.onCreate(savedInstanceState);&&&&&&& context =&&&&&&& ShareSDKUtils.prepare();&&&&&&& ShareSDKUtils.initSDK("YOUR_SHARESDK_APPKEY", true);&&& }
&&& public static void showShareResultToast(String result) {&&&&&&& Message msg = new Message();&&&&&&& msg.what = 1;&&&&&&& msg.obj =&&&&&&& notifyHandler.sendMessage(msg);&&& }
&&& @Override&&& public void onDestroy() {&&&&&&& ShareSDKUtils.stopSDK();&&&&&&& super.onDestroy();&&& }}
三、问题与解决方法
按照上面的集成方法修改后,通过cocos编译app,在模拟器运行GameDemo,点击Share,理论上屏幕下方会出现ShareSDK的分享窗口,选择“新浪微博”图标,会打开“图文分享”内容窗口,点击窗口右上角的“分享”即可。
【问题1】“图文分享”窗口内容可编辑,并且总是弹出软键盘,影响体验。&期望:内容不可编辑,默认不弹出软键盘&解决方法:&&&&& 打开proj.android/src/cn/sharesdk/onekeyshare/EditPage.java,做如下修改:
&&&&& 将窗口的软输入方式默认改为SOFT_INPUT_STATE_HIDDEN。
&&&&& public void setActivity(Activity activity) {
&&&&&&& super.setActivity(activity);
&&&&&&& if (dialogMode) {
&&&&&&&&&&& activity.setTheme(android.R.style.Theme_Dialog);
&&&&&&&&&&& activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
&&&&&&& activity.getWindow().setSoftInputMode(
&&&&&&&&&&&&&&&&&& //WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
&&&&&&&&&&&&&&&&&& WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);//default: hidden
&&& 在initPageView中增加一行:etContent.setKeyListener(null)。让窗口内容无法修改。&&& private void initPageView() {
&&&&&&&& … …
&&&&&&& // 文字输入区域
&&&&&&& etContent = new EditText(getContext());
&&&&&&& etContent.setGravity(Gravity.LEFT | Gravity.TOP);
&&&&&&& etContent.setBackgroundDrawable(null);
&&&&&&& etContent.setText(String.valueOf(reqData.get("text")));
&&&&&&& etContent.setKeyListener(null);//make the edittext uneditable
&&&&&&& etContent.setLayoutParams(lpEt);
&&&&&&& … …
【问题2】向微博分享,点击“分享”后,过一会程序异常停止。
&原因分析:&&&&&&& 通过调试观察,发现ShareSDK在解析从Weibo收到的Json包时出现内存违法访问。具体位置是在解析一个数组对象时出现的问题。 ShareSDK用CCArray来存储Json中的数组对象。该问题在cocos2d-x 2.2.2版本中不会出现,但在cocos2d-x 3.0rc2版本中会出现。经代码对比发现,3.0rc2版本中的CCArray的实现与2.2.2 CCArray实现有很大不同,似乎是做了较大重构,暂不能确定是否是3.0rc2版本中CCArray实现的bug。
&解决方法:由于后续的分享结果通知成功与否只需要根据分享的状态来决定,因此我们只需解析出"status"、“action”和“platform” 这三个CCNumber类型字段的值即可。CCArray类型的对象我们并不需要,因此我们只需绕过对Array类型字段的解析和存储即可,修改如下:
// Classes/C2DXShareSDK/Android/JSON/CCJSONConverter.cpp
void CCJSONConverter::convertJsonToDictionary(cJSON *json, CCDictionary *dictionary){&&& dictionary-&removeAllObjects();&&& cJSON * j = json-&&&& while (j) {&&&&&&& if (j-&type == cJSON_Number) {&&&&&&&&&&& Ref * obj = getJsonObj(j);&&&&&&&&&&& dictionary-&setObject(obj, j-&string);&&&&&&& }&&&&&&& j = j-&&&& }}
在使用ShareSDK做社交分享时,注意下面两个现象:1) 第一次进行微博或微信分享时,会打开授权页面,授权后才能分享成功;2) 微信分享窗口只有在手机联网状态下才能打开。如果手机无法联网,那微信好友、朋友圈和收藏分享将无法打开分享窗口,也不会有什么提示。
Copyright &
All Rights Reserved &&&&&&

我要回帖

更多关于 quick cocos2d x 的文章

 

随机推荐