Merge pull request #3221 from natural-law/develop

Add ProtocolSocial for social SDKs in plugin
This commit is contained in:
James Chen 2013-07-23 07:44:12 -07:00
commit aef9d1f4ea
28 changed files with 1385 additions and 35 deletions

View File

@ -0,0 +1,241 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.plugin;
import java.util.Hashtable;
import com.nd.commplatform.NdCallbackListener;
import com.nd.commplatform.NdCommplatform;
import com.nd.commplatform.NdErrorCode;
import com.nd.commplatform.NdMiscCallbackListener.OnLoginProcessListener;
import com.nd.commplatform.entry.NdAchieveUnlockInfo;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
public class SocialNd91 implements InterfaceSocial {
private static final String LOG_TAG = "UserNd91";
private static Activity mContext = null;
private static SocialNd91 mNd91 = null;
private static boolean bDebug = false;
private static NdCallbackListener<Object> submitListener = null;
private static NdCallbackListener<Object> unlockListener = null;
protected static void LogE(String msg, Exception e) {
Log.e(LOG_TAG, msg, e);
e.printStackTrace();
}
protected static void LogD(String msg) {
if (bDebug) {
Log.d(LOG_TAG, msg);
}
}
public SocialNd91(Context context) {
mContext = (Activity) context;
mNd91 = this;
submitListener = new NdCallbackListener<Object>(){
@Override
public void callback(int arg0, Object arg1) {
int nRet = SocialWrapper.SOCIAL_SUBMITSCORE_FAILED;
String msg = "Unknow Error";
switch (arg0) {
case NdCommplatform.SCORE_SUBMIT_SUCCESS:
nRet = SocialWrapper.SOCIAL_SUBMITSCORE_SUCCESS;
msg = "Submit Success";
break;
case NdCommplatform.SCORE_SAVE_LOCAL:
nRet = SocialWrapper.SOCIAL_SUBMITSCORE_FAILED;
msg = "Score saved locally";
break;
case NdCommplatform.LEADERBOARD_NOT_EXIST:
nRet = SocialWrapper.SOCIAL_SUBMITSCORE_FAILED;
msg = "The leaderboard not exist";
break;
default:
nRet = SocialWrapper.SOCIAL_SUBMITSCORE_FAILED;
break;
}
SocialWrapper.onSocialResult(mNd91, nRet, msg);
}
};
unlockListener = new NdCallbackListener<Object>(){
@Override
public void callback(int arg0, Object arg1) {
int nRet = SocialWrapper.SOCIAL_UNLOCKACH_FAILED;
String msg = "Unknow Error";
switch (arg0) {
case NdErrorCode.ND_COM_PLATFORM_SUCCESS:
nRet = SocialWrapper.SOCIAL_UNLOCKACH_SUCCESS;
msg = "Unlock Success";
break;
case NdErrorCode.ND_COM_PLATFORM_ERROR_SERVER_RETURN_ERROR:
nRet = SocialWrapper.SOCIAL_UNLOCKACH_FAILED;
msg = "Server return error";
break;
case NdErrorCode.ND_COM_PLATFORM_ERROR_ACHIEVEMENT_NO_EXIST:
nRet = SocialWrapper.SOCIAL_UNLOCKACH_FAILED;
msg = "Achievement not exist";
break;
default:
nRet = SocialWrapper.SOCIAL_UNLOCKACH_FAILED;
break;
}
SocialWrapper.onSocialResult(mNd91, nRet, msg);
}
};
}
@Override
public void configDeveloperInfo(Hashtable<String, String> cpInfo) {
LogD("initDeveloperInfo invoked " + cpInfo.toString());
final Hashtable<String, String> curCPInfo = cpInfo;
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
String appId = curCPInfo.get("Nd91AppId");
String appKey = curCPInfo.get("Nd91AppKey");
int id = Integer.parseInt(appId);
String orientation = curCPInfo.get("Nd91Orientation");
Nd91Wrapper.initSDK(mContext, id, appKey, orientation);
} catch (Exception e) {
LogE("Developer info is wrong!", e);
}
}
});
}
@Override
public void submitScore(String leaderboardID, long score) {
final String curID = leaderboardID;
final long curScore = score;
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
NdCommplatform.getInstance().ndSubmitScore(curID, (int) curScore, null, (Activity) mContext, submitListener);
}
});
}
@Override
public void showLeaderboard(String leaderboardID) {
final String curID = leaderboardID;
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
if (Nd91Wrapper.isLogined()) {
NdCommplatform.getInstance().ndOpenLeaderBoard(mContext, curID, 0);
} else {
Nd91Wrapper.userLogin(mContext, new OnLoginProcessListener() {
@Override
public void finishLoginProcess(int code) {
if (code == NdErrorCode.ND_COM_PLATFORM_SUCCESS) {
NdCommplatform.getInstance().ndOpenLeaderBoard(mContext, curID, 0);
} else {
LogD("User should login first");
}
}
});
}
}
});
}
@Override
public void unlockAchievement(Hashtable<String, String> achInfo) {
final Hashtable<String, String> curInfo = achInfo;
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
String achID = curInfo.get("AchievementID");
if (achID == null || TextUtils.isEmpty(achID))
{
SocialWrapper.onSocialResult(mNd91, SocialWrapper.SOCIAL_UNLOCKACH_FAILED, "Achievement info error");
return;
}
String displayText = curInfo.get("NDDisplayText");
String strScore = curInfo.get("NDScore");
long score = Long.parseLong(strScore);
NdAchieveUnlockInfo info = new NdAchieveUnlockInfo();
info.setAchievementId(achID);
info.setCurrentValue(score);
info.setDisplayText(displayText);
NdCommplatform.getInstance().ndUnlockAchievement(info, mContext, unlockListener);
} catch (Exception e) {
LogE("Unknown Error!", e);
}
}
});
}
@Override
public void showAchievements() {
PluginWrapper.runOnMainThread(new Runnable() {
@Override
public void run() {
if (Nd91Wrapper.isLogined()) {
NdCommplatform.getInstance().ndOpenAchievement(mContext, 0);
} else {
Nd91Wrapper.userLogin(mContext, new OnLoginProcessListener() {
@Override
public void finishLoginProcess(int code) {
if (code == NdErrorCode.ND_COM_PLATFORM_SUCCESS) {
NdCommplatform.getInstance().ndOpenAchievement(mContext, 0);
} else {
LogD("User should login first");
}
}
});
}
}
});
}
@Override
public void setDebugMode(boolean debug) {
bDebug = debug;
}
@Override
public String getSDKVersion() {
return Nd91Wrapper.getSDKVersion();
}
@Override
public String getPluginVersion() {
return Nd91Wrapper.getPluginVersion();
}
}

View File

@ -16,7 +16,6 @@
<meta-data android:name="QHOPENSDK_APPID" android:value="Your app_id" />
<meta-data android:name="QHOPENSDK_APPKEY" android:value="Your app_key" />
<meta-data android:name="QHOPENSDK_PRIVATEKEY" android:value="Your app_private_key" />
<meta-data android:name="QHOPENSDK_CHANNEL" android:value="Your channel or delete this line" />
</applicationCfg>
<permissionCfg>
<uses-permission android:name="android.permission.SEND_SMS" />

View File

@ -0,0 +1,96 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#ifndef __CCX_PROTOCOL_SOCIAL_H__
#define __CCX_PROTOCOL_SOCIAL_H__
#include "PluginProtocol.h"
#include <map>
#include <string>
namespace cocos2d { namespace plugin {
typedef std::map<std::string, std::string> TSocialDeveloperInfo;
typedef std::map<std::string, std::string> TAchievementInfo;
typedef enum
{
// code for leaderboard feature
SCORE_SUBMIT_SUCCESS = 1,
SCORE_SUBMIT_FAILED,
// code for achievement feature
ACH_UNLOCK_SUCCESS,
ACH_UNLOCK_FAILED,
} SocialRetCode;
class SocialListener
{
public:
virtual void onSocialResult(SocialRetCode code, const char* msg) = 0;
};
class ProtocolSocial : public PluginProtocol
{
public:
ProtocolSocial();
virtual ~ProtocolSocial();
/**
@brief config the share developer info
@param devInfo This parameter is the info of developer,
different plugin have different format
@warning Must invoke this interface before other interfaces.
And invoked only once.
*/
void configDeveloperInfo(TSocialDeveloperInfo devInfo);
/**
* @brief methods of leaderboard feature
*/
void submitScore(const char* leadboardID, long score);
void showLeaderboard(const char* leaderboardID);
/**
* @brief methods of achievement feature
*/
void unlockAchievement(TAchievementInfo achInfo);
void showAchievements();
inline void setListener(SocialListener* listener) {
_listener = listener;
}
inline SocialListener* getListener()
{
return _listener;
}
protected:
SocialListener* _listener;
};
}} // namespace cocos2d { namespace plugin {
#endif /* ----- #ifndef __CCX_PROTOCOL_SOCIAL_H__ ----- */

View File

@ -29,6 +29,7 @@ THE SOFTWARE.
#include "ProtocolIAP.h"
#include "ProtocolShare.h"
#include "ProtocolUser.h"
#include "ProtocolSocial.h"
namespace cocos2d { namespace plugin {
@ -38,6 +39,7 @@ enum {
kPluginIAP,
kPluginShare,
kPluginUser,
kPluginSocial,
};
#define ANDROID_PLUGIN_PACKAGE_PREFIX "org/cocos2dx/plugin/"
@ -134,6 +136,9 @@ PluginProtocol* PluginFactory::createPlugin(const char* name)
case kPluginUser:
pRet = new ProtocolUser();
break;
case kPluginSocial:
pRet = new ProtocolSocial();
break;
default:
break;
}

View File

@ -0,0 +1,159 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "ProtocolSocial.h"
#include "PluginJniHelper.h"
#include <android/log.h>
#include "PluginUtils.h"
#include "PluginJavaData.h"
namespace cocos2d { namespace plugin {
extern "C" {
JNIEXPORT void JNICALL Java_org_cocos2dx_plugin_SocialWrapper_nativeOnSocialResult(JNIEnv* env, jobject thiz, jstring className, jint ret, jstring msg)
{
std::string strMsg = PluginJniHelper::jstring2string(msg);
std::string strClassName = PluginJniHelper::jstring2string(className);
PluginProtocol* pPlugin = PluginUtils::getPluginPtr(strClassName);
PluginUtils::outputLog("ProtocolSocial", "nativeOnSocialResult(), Get plugin ptr : %p", pPlugin);
if (pPlugin != NULL)
{
PluginUtils::outputLog("ProtocolSocial", "nativeOnSocialResult(), Get plugin name : %s", pPlugin->getPluginName());
ProtocolSocial* pSocial = dynamic_cast<ProtocolSocial*>(pPlugin);
if (pSocial != NULL)
{
SocialListener* pListener = pSocial->getListener();
if (NULL != pListener)
{
pListener->onSocialResult((SocialRetCode) ret, strMsg.c_str());
}
}
}
}
}
ProtocolSocial::ProtocolSocial()
: _listener(NULL)
{
}
ProtocolSocial::~ProtocolSocial()
{
}
void ProtocolSocial::configDeveloperInfo(TSocialDeveloperInfo devInfo)
{
if (devInfo.empty())
{
PluginUtils::outputLog("ProtocolSocial", "The developer info is empty!");
return;
}
else
{
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "configDeveloperInfo"
, "(Ljava/util/Hashtable;)V"))
{
// generate the hashtable from map
jobject obj_Map = PluginUtils::createJavaMapObject(&devInfo);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map);
t.env->DeleteLocalRef(obj_Map);
t.env->DeleteLocalRef(t.classID);
}
}
}
void ProtocolSocial::submitScore(const char* leadboardID, long score)
{
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "submitScore"
, "(Ljava/lang/String;J)V"))
{
jstring strID = PluginUtils::getEnv()->NewStringUTF(leadboardID);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, strID, score);
t.env->DeleteLocalRef(strID);
t.env->DeleteLocalRef(t.classID);
}
}
void ProtocolSocial::showLeaderboard(const char* leaderboardID)
{
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "showLeaderboard"
, "(Ljava/lang/String;)V"))
{
jstring strID = PluginUtils::getEnv()->NewStringUTF(leaderboardID);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, strID);
t.env->DeleteLocalRef(strID);
t.env->DeleteLocalRef(t.classID);
}
}
void ProtocolSocial::unlockAchievement(TAchievementInfo achInfo)
{
if (achInfo.empty())
{
PluginUtils::outputLog("ProtocolSocial", "The achievement info is empty!");
return;
}
else
{
PluginJavaData* pData = PluginUtils::getPluginJavaData(this);
PluginJniMethodInfo t;
if (PluginJniHelper::getMethodInfo(t
, pData->jclassName.c_str()
, "unlockAchievement"
, "(Ljava/util/Hashtable;)V"))
{
// generate the hashtable from map
jobject obj_Map = PluginUtils::createJavaMapObject(&achInfo);
// invoke java method
t.env->CallVoidMethod(pData->jobj, t.methodID, obj_Map);
t.env->DeleteLocalRef(obj_Map);
t.env->DeleteLocalRef(t.classID);
}
}
}
void ProtocolSocial::showAchievements()
{
PluginUtils::callJavaFunctionWithName(this, "showAchievements");
}
}} // namespace cocos2d { namespace plugin {

View File

@ -0,0 +1,36 @@
/****************************************************************************
Copyright (c) 2013 cocos2d+x.org
http://www.cocos2d+x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
@protocol InterfaceSocial <NSObject>
- (void) configDeveloperInfo : (NSMutableDictionary*) cpInfo;
- (void) submitScore: (NSString*) leaderboardID withScore: (long) score;
- (void) showLeaderboard: (NSString*) leaderboardID;
- (void) unlockAchievement: (NSMutableDictionary*) achInfo;
- (void) showAchievements;
- (void) setDebugMode: (BOOL) debug;
- (NSString*) getSDKVersion;
- (NSString*) getPluginVersion;
@end

View File

@ -0,0 +1,115 @@
/****************************************************************************
Copyright (c) 2012-2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "ProtocolSocial.h"
#include "PluginUtilsIOS.h"
#import "InterfaceSocial.h"
namespace cocos2d { namespace plugin {
ProtocolSocial::ProtocolSocial()
: _listener(NULL)
{
}
ProtocolSocial::~ProtocolSocial()
{
}
void ProtocolSocial::configDeveloperInfo(TSocialDeveloperInfo devInfo)
{
if (devInfo.empty())
{
PluginUtilsIOS::outputLog("The developer info is empty for %s!", this->getPluginName());
return;
}
else
{
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
assert(pData != NULL);
id ocObj = pData->obj;
if ([ocObj conformsToProtocol:@protocol(InterfaceSocial)]) {
NSObject<InterfaceSocial>* curObj = ocObj;
NSMutableDictionary* pDict = PluginUtilsIOS::createDictFromMap(&devInfo);
[curObj configDeveloperInfo:pDict];
}
}
}
void ProtocolSocial::submitScore(const char* leadboardID, long score)
{
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
assert(pData != NULL);
id ocObj = pData->obj;
if ([ocObj conformsToProtocol:@protocol(InterfaceSocial)]) {
NSObject<InterfaceSocial>* curObj = ocObj;
NSString* pID = [NSString stringWithUTF8String:leadboardID];
[curObj submitScore:pID withScore:score];
}
}
void ProtocolSocial::showLeaderboard(const char* leaderboardID)
{
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
assert(pData != NULL);
id ocObj = pData->obj;
if ([ocObj conformsToProtocol:@protocol(InterfaceSocial)]) {
NSObject<InterfaceSocial>* curObj = ocObj;
NSString* pID = [NSString stringWithUTF8String:leaderboardID];
[curObj showLeaderboard:pID];
}
}
void ProtocolSocial::unlockAchievement(TAchievementInfo achInfo)
{
if (achInfo.empty())
{
PluginUtilsIOS::outputLog("ProtocolSocial", "The achievement info is empty!");
return;
}
else
{
PluginOCData* pData = PluginUtilsIOS::getPluginOCData(this);
assert(pData != NULL);
id ocObj = pData->obj;
if ([ocObj conformsToProtocol:@protocol(InterfaceSocial)]) {
NSObject<InterfaceSocial>* curObj = ocObj;
NSMutableDictionary* pDict = PluginUtilsIOS::createDictFromMap(&achInfo);
[curObj unlockAchievement:pDict];
}
}
}
void ProtocolSocial::showAchievements()
{
PluginUtilsIOS::callOCFunctionWithName(this, "showAchievements");
}
}} // namespace cocos2d { namespace plugin {

View File

@ -0,0 +1,42 @@
/****************************************************************************
Copyright (c) 2013 cocos2d+x.org
http://www.cocos2d+x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#import <Foundation/Foundation.h>
typedef enum {
kSubmitScoreSuccess = 1,
kSubmitScoreFailed,
kUnlockAchiSuccess,
kUnlockAchiFailed,
} SocialResult;
@interface SocialWrapper : NSObject
{
}
+ (void) onSocialResult:(id) obj withRet:(SocialResult) ret withMsg:(NSString*) msg;
@end

View File

@ -0,0 +1,50 @@
/****************************************************************************
Copyright (c) 2012+2013 cocos2d+x.org
http://www.cocos2d+x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#import "SocialWrapper.h"
#include "PluginUtilsIOS.h"
#include "ProtocolSocial.h"
using namespace cocos2d::plugin;
@implementation SocialWrapper
+ (void) onSocialResult:(id) obj withRet:(SocialResult) ret withMsg:(NSString*) msg
{
PluginProtocol* pPlugin = PluginUtilsIOS::getPluginPtr(obj);
ProtocolSocial* pSocial = dynamic_cast<ProtocolSocial*>(pPlugin);
if (pSocial) {
SocialListener* pListener = pSocial->getListener();
if (NULL != pListener)
{
const char* chMsg = [msg UTF8String];
SocialRetCode cRet = (SocialRetCode) ret;
pListener->onSocialResult(cRet, chMsg);
}
} else {
PluginUtilsIOS::outputLog("Can't find the C++ object of the Social plugin");
}
}
@end

View File

@ -17,6 +17,7 @@ $(addprefix ../../platform/android/, \
ProtocolAds.cpp \
ProtocolShare.cpp \
ProtocolUser.cpp \
ProtocolSocial.cpp \
) \
../../PluginManager.cpp \
../../PluginParam.cpp

View File

@ -0,0 +1,39 @@
/****************************************************************************
Copyright (c) 2012-2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.plugin;
import java.util.Hashtable;
public interface InterfaceSocial {
public final int PluginType = 6;
public void configDeveloperInfo(Hashtable<String, String> cpInfo);
public void submitScore(String leaderboardID, long score);
public void showLeaderboard(String leaderboardID);
public void unlockAchievement(Hashtable<String, String> achInfo);
public void showAchievements();
public void setDebugMode(boolean debug);
public String getSDKVersion();
public String getPluginVersion();
}

View File

@ -0,0 +1,46 @@
/****************************************************************************
Copyright (c) 2012-2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
package org.cocos2dx.plugin;
public class SocialWrapper {
public static final int SOCIAL_SUBMITSCORE_SUCCESS = 1;
public static final int SOCIAL_SUBMITSCORE_FAILED = 2;
public static final int SOCIAL_UNLOCKACH_SUCCESS = 3;
public static final int SOCIAL_UNLOCKACH_FAILED = 4;
public static void onSocialResult(InterfaceSocial obj, int ret, String msg) {
final int curRet = ret;
final String curMsg = msg;
final InterfaceSocial curAdapter = obj;
PluginWrapper.runOnGLThread(new Runnable() {
@Override
public void run() {
String name = curAdapter.getClass().getName();
name = name.replace('.', '/');
nativeOnSocialResult(name, curRet, curMsg);
}
});
}
private static native void nativeOnSocialResult(String className, int ret, String msg);
}

View File

@ -21,6 +21,8 @@
FAC2A7FA1777F8C200035D22 /* ShareWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAC2A7F81777F8C200035D22 /* ShareWrapper.mm */; };
FAD55520177D1FA900968F54 /* ProtocolUser.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAD5551D177D1FA900968F54 /* ProtocolUser.mm */; };
FAD55521177D1FA900968F54 /* UserWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = FAD5551F177D1FA900968F54 /* UserWrapper.mm */; };
FADBF89B179E509500F59B1D /* ProtocolSocial.mm in Sources */ = {isa = PBXBuildFile; fileRef = FADBF898179E509500F59B1D /* ProtocolSocial.mm */; };
FADBF89C179E509500F59B1D /* SocialWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = FADBF89A179E509500F59B1D /* SocialWrapper.mm */; };
FADC44CA176EABCF00B2D5ED /* AdsWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = FADC44C9176EABCF00B2D5ED /* AdsWrapper.mm */; };
/* End PBXBuildFile section */
@ -70,6 +72,11 @@
FAD5551E177D1FA900968F54 /* UserWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserWrapper.h; sourceTree = "<group>"; };
FAD5551F177D1FA900968F54 /* UserWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserWrapper.mm; sourceTree = "<group>"; };
FAD55522177D213F00968F54 /* ProtocolUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtocolUser.h; sourceTree = "<group>"; };
FADBF896179E504B00F59B1D /* ProtocolSocial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtocolSocial.h; sourceTree = "<group>"; };
FADBF897179E509500F59B1D /* InterfaceSocial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterfaceSocial.h; sourceTree = "<group>"; };
FADBF898179E509500F59B1D /* ProtocolSocial.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ProtocolSocial.mm; sourceTree = "<group>"; };
FADBF899179E509500F59B1D /* SocialWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocialWrapper.h; sourceTree = "<group>"; };
FADBF89A179E509500F59B1D /* SocialWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SocialWrapper.mm; sourceTree = "<group>"; };
FADC44C8176EABCF00B2D5ED /* AdsWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdsWrapper.h; sourceTree = "<group>"; };
FADC44C9176EABCF00B2D5ED /* AdsWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AdsWrapper.mm; sourceTree = "<group>"; };
/* End PBXFileReference section */
@ -119,6 +126,7 @@
FA09A336168ADC05008C1C7B /* include */ = {
isa = PBXGroup;
children = (
FADBF896179E504B00F59B1D /* ProtocolSocial.h */,
FAD55522177D213F00968F54 /* ProtocolUser.h */,
FAC2A7F41777F88700035D22 /* ProtocolShare.h */,
FAB6DF931755D7D100C90D89 /* PluginFactory.h */,
@ -136,6 +144,10 @@
FA0CB8B5168D3CC200E36B11 /* ios */ = {
isa = PBXGroup;
children = (
FADBF897179E509500F59B1D /* InterfaceSocial.h */,
FADBF898179E509500F59B1D /* ProtocolSocial.mm */,
FADBF899179E509500F59B1D /* SocialWrapper.h */,
FADBF89A179E509500F59B1D /* SocialWrapper.mm */,
FAD5551C177D1FA900968F54 /* InterfaceUser.h */,
FAD5551D177D1FA900968F54 /* ProtocolUser.mm */,
FAD5551E177D1FA900968F54 /* UserWrapper.h */,
@ -226,6 +238,8 @@
FAC2A7FA1777F8C200035D22 /* ShareWrapper.mm in Sources */,
FAD55520177D1FA900968F54 /* ProtocolUser.mm in Sources */,
FAD55521177D1FA900968F54 /* UserWrapper.mm in Sources */,
FADBF89B179E509500F59B1D /* ProtocolSocial.mm in Sources */,
FADBF89C179E509500F59B1D /* SocialWrapper.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -5,6 +5,7 @@
#include "TestIAPScene.h"
#include "TestIAPOnlineScene.h"
#include "TestUserScene.h"
#include "TestSocialScene.h"
USING_NS_CC;
@ -16,6 +17,7 @@ std::string g_testCases[] = {
"Test IAP",
"Test IAP Online",
"Test User",
"Test Social",
#endif
};
@ -57,22 +59,22 @@ bool HelloWorld::init()
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
pCloseItem->setPosition(Point(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,
origin.y + pCloseItem->getContentSize().height/2));
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pCloseItem, NULL);
pMenu->setPosition(PointZero);
pMenu->setPosition(Point::ZERO);
this->addChild(pMenu, 1);
Point beginPos = ccp(origin.x + visibleSize.width / 2, origin.y + visibleSize.height - 50);
Point beginPos = Point(origin.x + visibleSize.width / 2, origin.y + visibleSize.height - 50);
float step = 60.0f;
int nCaseCount = sizeof(g_testCases) / sizeof(std::string);
for (int i = 0; i < nCaseCount; ++i) {
std::string caseName = g_testCases[i];
MenuItemFont *pItem = MenuItemFont::create(caseName.c_str(), CC_CALLBACK_1(HelloWorld::menuCallback, this));
pItem->setTag(i);
pItem->setPosition(ccp(beginPos.x, beginPos.y - i * step));
pItem->setPosition(Point(beginPos.x, beginPos.y - i * step));
pMenu->addChild(pItem);
}
return true;
@ -101,6 +103,8 @@ void HelloWorld::menuCallback(Object* pSender)
case 5:
newScene = TestUser::scene();
break;
case 6:
newScene = TestSocial::scene();
default:
break;
}

View File

@ -103,7 +103,7 @@ bool TestAds::init()
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( PointZero );
pMenu->setPosition( Point::ZERO );
LabelTTF* label1 = LabelTTF::create("ShowAds", "Arial", 24);
MenuItemLabel* pItemShow = MenuItemLabel::create(label1, CC_CALLBACK_1(TestAds::testShow, this));

View File

@ -102,7 +102,7 @@ bool TestAnalytics::init()
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( PointZero );
pMenu->setPosition( Point::ZERO );
this->addChild(pMenu, 1);
float yPos = 0;

View File

@ -87,7 +87,7 @@ bool TestIAP::init()
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( PointZero );
pMenu->setPosition( Point::ZERO );
this->addChild(pMenu, 1);
Point posStep = ccp(220, -150);

View File

@ -81,21 +81,21 @@ bool TestIAPOnline::init()
// you may modify it.
EGLView* pEGLView = EGLView::getInstance();
Point posBR = ccp(pEGLView->getVisibleOrigin().x + pEGLView->getVisibleSize().width, pEGLView->getVisibleOrigin().y);
Point posTL = ccp(pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y + pEGLView->getVisibleSize().height);
Point posBR = Point(pEGLView->getVisibleOrigin().x + pEGLView->getVisibleSize().width, pEGLView->getVisibleOrigin().y);
Point posTL = Point(pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y + pEGLView->getVisibleSize().height);
// add a "close" icon to exit the progress. it's an autorelease object
MenuItemFont *pBackItem = MenuItemFont::create("Back", CC_CALLBACK_1(TestIAPOnline::menuBackCallback, this));
Size backSize = pBackItem->getContentSize();
pBackItem->setPosition(ccpAdd(posBR, ccp(- backSize.width / 2, backSize.height / 2)));
pBackItem->setPosition(posBR + Point(- backSize.width / 2, backSize.height / 2));
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( PointZero );
pMenu->setPosition( Point::ZERO );
this->addChild(pMenu, 1);
Point posStep = ccp(220, -150);
Point beginPos = ccpAdd(posTL, ccpMult(posStep, 0.5f));
Point posStep = Point(220, -150);
Point beginPos = posTL + (posStep * 0.5f);
int line = 0;
int row = 0;
for (int i = 0; i < sizeof(s_EventMenuItem)/sizeof(s_EventMenuItem[0]); i++) {
@ -103,13 +103,13 @@ bool TestIAPOnline::init()
CC_CALLBACK_1(TestIAPOnline::eventMenuCallback, this));
pMenu->addChild(pMenuItem, 0, s_EventMenuItem[i].tag);
Point pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
Point pos = beginPos + Point(posStep.x * row, posStep.y * line);
Size itemSize = pMenuItem->getContentSize();
if ((pos.x + itemSize.width / 2) > posBR.x)
{
line += 1;
row = 0;
pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
pos = beginPos + Point(posStep.x * row, posStep.y * line);
}
row += 1;
pMenuItem->setPosition(pos);

View File

@ -77,34 +77,34 @@ bool TestShare::init()
// you may modify it.
EGLView* pEGLView = EGLView::getInstance();
Point posBR = ccp(pEGLView->getVisibleOrigin().x + pEGLView->getVisibleSize().width, pEGLView->getVisibleOrigin().y);
Point posTL = ccp(pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y + pEGLView->getVisibleSize().height);
Point posBR = Point(pEGLView->getVisibleOrigin().x + pEGLView->getVisibleSize().width, pEGLView->getVisibleOrigin().y);
Point posTL = Point(pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y + pEGLView->getVisibleSize().height);
// add a "close" icon to exit the progress. it's an autorelease object
MenuItemFont *pBackItem = MenuItemFont::create("Back", CC_CALLBACK_1(TestShare::menuBackCallback, this));
Size backSize = pBackItem->getContentSize();
pBackItem->setPosition(ccpAdd(posBR, ccp(- backSize.width / 2, backSize.height / 2)));
pBackItem->setPosition(posBR + Point(- backSize.width / 2, backSize.height / 2));
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( PointZero );
pMenu->setPosition( Point::ZERO );
this->addChild(pMenu, 1);
Point posStep = ccp(150, -150);
Point beginPos = ccpAdd(posTL, ccpMult(posStep, 0.5f));
Point posStep = Point(150, -150);
Point beginPos = posTL + (posStep * 0.5f);
int line = 0;
int row = 0;
for (int i = 0; i < sizeof(s_EventMenuItem)/sizeof(s_EventMenuItem[0]); i++) {
MenuItemImage* pMenuItem = MenuItemImage::create(s_EventMenuItem[i].id.c_str(), s_EventMenuItem[i].id.c_str(), CC_CALLBACK_1(TestShare::eventMenuCallback, this));
pMenu->addChild(pMenuItem, 0, s_EventMenuItem[i].tag);
Point pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
Point pos = beginPos + Point(posStep.x * row, posStep.y * line);
Size itemSize = pMenuItem->getContentSize();
if ((pos.x + itemSize.width / 2) > posBR.x)
{
line += 1;
row = 0;
pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
pos = beginPos + Point(posStep.x * row, posStep.y * line);
}
row += 1;
pMenuItem->setPosition(pos);

View File

@ -0,0 +1,170 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "MySocialManager.h"
#include "PluginManager.h"
#include "cocos2d.h"
using namespace cocos2d::plugin;
using namespace cocos2d;
MySocialManager* MySocialManager::s_pManager = NULL;
MySocialManager::MySocialManager()
: _pNd91(NULL)
{
}
MySocialManager::~MySocialManager()
{
unloadPlugins();
}
MySocialManager* MySocialManager::sharedManager()
{
if (s_pManager == NULL) {
s_pManager = new MySocialManager();
}
return s_pManager;
}
void MySocialManager::purgeManager()
{
if (s_pManager)
{
delete s_pManager;
s_pManager = NULL;
}
PluginManager::end();
}
void MySocialManager::loadPlugins()
{
{
_pNd91 = dynamic_cast<ProtocolSocial*>(PluginManager::getInstance()->loadPlugin("SocialNd91"));
if (NULL != _pNd91)
{
TSocialDeveloperInfo pNdInfo;
pNdInfo["Nd91AppId"] = "100010";
pNdInfo["Nd91AppKey"] = "C28454605B9312157C2F76F27A9BCA2349434E546A6E9C75";
pNdInfo["Nd91Orientation"] = "landscape";
if (pNdInfo.empty()) {
char msg[256] = { 0 };
sprintf(msg, "Developer info is empty. PLZ fill your Nd91 info in %s(nearby line %d)", __FILE__, __LINE__);
MessageBox(msg, "Nd91 Warning");
}
_pNd91->configDeveloperInfo(pNdInfo);
_pNd91->setDebugMode(true);
_pNd91->setListener(this);
}
}
}
void MySocialManager::submitScore(MySocialMode mode, const char* leaderboardID, long score)
{
ProtocolSocial* pSocial = NULL;
switch (mode)
{
case eNd91:
pSocial = _pNd91;
break;
default:
break;
}
if (NULL != pSocial)
{
pSocial->submitScore(leaderboardID, score);
}
}
void MySocialManager::showLeaderboard(MySocialMode mode, const char* leaderboardID)
{
ProtocolSocial* pSocial = NULL;
switch (mode)
{
case eNd91:
pSocial = _pNd91;
break;
default:
break;
}
if (NULL != pSocial)
{
pSocial->showLeaderboard(leaderboardID);
}
}
void MySocialManager::unlockAchievement(MySocialMode mode, TAchievementInfo info)
{
ProtocolSocial* pSocial = NULL;
switch (mode)
{
case eNd91:
pSocial = _pNd91;
break;
default:
break;
}
if (NULL != pSocial)
{
pSocial->unlockAchievement(info);
}
}
void MySocialManager::showAchievement(MySocialMode mode)
{
ProtocolSocial* pSocial = NULL;
switch (mode)
{
case eNd91:
pSocial = _pNd91;
break;
default:
break;
}
if (NULL != pSocial)
{
pSocial->showAchievements();
}
}
void MySocialManager::unloadPlugins()
{
if (_pNd91)
{
PluginManager::getInstance()->unloadPlugin("SocialNd91");
_pNd91 = NULL;
}
}
void MySocialManager::onSocialResult(SocialRetCode code, const char* msg)
{
char socialStatus[1024] = { 0 };
sprintf(socialStatus, "Social code %d", code);
MessageBox(msg, socialStatus);
}

View File

@ -0,0 +1,59 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#ifndef __MY_SOCIAL_MANAGER_H__
#define __MY_SOCIAL_MANAGER_H__
#include "ProtocolSocial.h"
class MySocialManager : public cocos2d::plugin::SocialListener
{
public:
static MySocialManager* sharedManager();
static void purgeManager();
typedef enum {
eNoneMode = 0,
eNd91,
} MySocialMode;
void unloadPlugins();
void loadPlugins();
void submitScore(MySocialMode mode, const char* leaderboardID, long score);
void showLeaderboard(MySocialMode mode, const char* leaderboardID);
void unlockAchievement(MySocialMode mode, cocos2d::plugin::TAchievementInfo info);
void showAchievement(MySocialMode mode);
virtual void onSocialResult(cocos2d::plugin::SocialRetCode code, const char* msg);
private:
MySocialManager();
virtual ~MySocialManager();
static MySocialManager* s_pManager;
cocos2d::plugin::ProtocolSocial* _pNd91;
};
#endif // __MY_SOCIAL_MANAGER_H__

View File

@ -0,0 +1,152 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "TestSocialScene.h"
#include "PluginManager.h"
#include "AppDelegate.h"
#include "MySocialManager.h"
#include "HelloWorldScene.h"
using namespace cocos2d;
using namespace cocos2d::plugin;
const std::string s_aTestCases[] = {
"Nd91",
};
Scene* TestSocial::scene()
{
// 'scene' is an autorelease object
Scene *scene = Scene::create();
// 'layer' is an autorelease object
TestSocial *layer = TestSocial::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool TestSocial::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
MySocialManager::sharedManager()->loadPlugins();
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
Point posMid = Point(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2);
Point posBR = Point(origin.x + visibleSize.width, origin.y);
MenuItemFont *pBackItem = MenuItemFont::create("Back", CC_CALLBACK_1(TestSocial::menuBackCallback, this));
Size backSize = pBackItem->getContentSize();
pBackItem->setPosition(posBR + Point(- backSize.width / 2, backSize.height / 2));
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition( Point::ZERO );
LabelTTF* label1 = LabelTTF::create("Submit Score", "Arial", 28);
MenuItemLabel* pItemSubmit = MenuItemLabel::create(label1, CC_CALLBACK_1(TestSocial::testSubmit, this));
pItemSubmit->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemSubmit, 0);
pItemSubmit->setPosition(posMid + Point(-140, -60));
LabelTTF* label2 = LabelTTF::create("Unlock Achievement", "Arial", 28);
MenuItemLabel* pItemUnlock = MenuItemLabel::create(label2, CC_CALLBACK_1(TestSocial::testUnlock, this));
pItemUnlock->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemUnlock, 0);
pItemUnlock->setPosition(posMid + Point(140, -60));
LabelTTF* label3 = LabelTTF::create("Show Leaderboard", "Arial", 28);
MenuItemLabel* pItemLeader = MenuItemLabel::create(label3, CC_CALLBACK_1(TestSocial::testLeaderboard, this));
pItemLeader->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemLeader, 0);
pItemLeader->setPosition(posMid + Point(-140, -120));
LabelTTF* label4 = LabelTTF::create("Show Achievement", "Arial", 28);
MenuItemLabel* pItemAchi = MenuItemLabel::create(label4, CC_CALLBACK_1(TestSocial::testAchievement, this));
pItemAchi->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemAchi, 0);
pItemAchi->setPosition(posMid + Point(140, -120));
// create optional menu
// cases item
_caseItem = MenuItemToggle::createWithCallback(NULL,
MenuItemFont::create( s_aTestCases[0].c_str() ),
NULL );
int caseLen = sizeof(s_aTestCases) / sizeof(std::string);
for (int i = 1; i < caseLen; ++i)
{
_caseItem->getSubItems()->addObject( MenuItemFont::create( s_aTestCases[i].c_str() ) );
}
_caseItem->setPosition(posMid + Point(0, 120));
pMenu->addChild(_caseItem);
this->addChild(pMenu, 1);
return true;
}
void TestSocial::testSubmit(Object* pSender)
{
int nIdx = _caseItem->getSelectedIndex();
MySocialManager::sharedManager()->submitScore((MySocialManager::MySocialMode)(nIdx + 1), "0", 30000);
}
void TestSocial::testUnlock(Object* pSender)
{
int nIdx = _caseItem->getSelectedIndex();
TAchievementInfo info;
info["AchievementID"] = "MyAchiID";
info["NDDisplayText"] = "Fighter";
info["NDScore"] = "100";
MySocialManager::sharedManager()->unlockAchievement((MySocialManager::MySocialMode)(nIdx + 1), info);
}
void TestSocial::testLeaderboard(Object* pSender)
{
int nIdx = _caseItem->getSelectedIndex();
MySocialManager::sharedManager()->showLeaderboard((MySocialManager::MySocialMode)(nIdx + 1), "0");
}
void TestSocial::testAchievement(Object* pSender)
{
int nIdx = _caseItem->getSelectedIndex();
MySocialManager::sharedManager()->showAchievement((MySocialManager::MySocialMode)(nIdx + 1));
}
void TestSocial::menuBackCallback(Object* pSender)
{
MySocialManager::purgeManager();
Scene* newScene = HelloWorld::scene();
Director::getInstance()->replaceScene(newScene);
}

View File

@ -0,0 +1,52 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#ifndef __TEST_SOCIAL_SCENE_H__
#define __TEST_SOCIAL_SCENE_H__
#include "cocos2d.h"
class TestSocial : public cocos2d::Layer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::Scene* scene();
// a selector callback
void menuBackCallback(Object* pSender);
void testSubmit(Object* pSender);
void testUnlock(Object* pSender);
void testLeaderboard(Object* pSender);
void testAchievement(Object* pSender);
// implement the "static node()" method manually
CREATE_FUNC(TestSocial);
private:
cocos2d::MenuItemToggle* _caseItem;
};
#endif // __TEST_SOCIAL_SCENE_H__

View File

@ -1,3 +1,26 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#include "TestUserScene.h"
#include "MyUserManager.h"
#include "HelloWorldScene.h"
@ -40,8 +63,8 @@ bool TestUser::init()
MyUserManager::sharedManager()->loadPlugin();
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
Point posMid = ccp(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2);
Point posBR = ccp(origin.x + visibleSize.width, origin.y);
Point posMid = Point(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2);
Point posBR = Point(origin.x + visibleSize.width, origin.y);
/////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
@ -50,23 +73,23 @@ bool TestUser::init()
// add a "close" icon to exit the progress. it's an autorelease object
MenuItemFont *pBackItem = MenuItemFont::create("Back", CC_CALLBACK_1(TestUser::menuBackCallback, this));
Size backSize = pBackItem->getContentSize();
pBackItem->setPosition(ccpAdd(posBR, ccp(- backSize.width / 2, backSize.height / 2)));
pBackItem->setPosition(posBR + Point(- backSize.width / 2, backSize.height / 2));
// create menu, it's an autorelease object
Menu* pMenu = Menu::create(pBackItem, NULL);
pMenu->setPosition(PointZero);
pMenu->setPosition(Point::ZERO);
LabelTTF* label1 = LabelTTF::create("Login", "Arial", 32);
MenuItemLabel* pItemLogin = MenuItemLabel::create(label1, CC_CALLBACK_1(TestUser::testLogin, this));
pItemLogin->setAnchorPoint(ccp(0.5f, 0));
pItemLogin->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemLogin, 0);
pItemLogin->setPosition(ccpAdd(posMid, ccp(-100, -120)));
pItemLogin->setPosition(posMid + Point(-100, -120));
LabelTTF* label2 = LabelTTF::create("Logout", "Arial", 32);
MenuItemLabel* pItemLogout = MenuItemLabel::create(label2, CC_CALLBACK_1(TestUser::testLogout, this));
pItemLogout->setAnchorPoint(ccp(0.5f, 0));
pItemLogout->setAnchorPoint(Point(0.5f, 0));
pMenu->addChild(pItemLogout, 0);
pItemLogout->setPosition(ccpAdd(posMid, ccp(100, -120)));
pItemLogout->setPosition(posMid + Point(100, -120));
// create optional menu
// cases item
@ -78,7 +101,7 @@ bool TestUser::init()
{
_caseItem->getSubItems()->addObject( MenuItemFont::create( s_aTestCases[i].c_str() ) );
}
_caseItem->setPosition(ccpAdd(posMid, ccp(0, 120)));
_caseItem->setPosition(posMid + Point(0, 120));
pMenu->addChild(_caseItem);
_selectedCase = 0;

View File

@ -1,3 +1,26 @@
/****************************************************************************
Copyright (c) 2013 cocos2d-x.org
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#ifndef __TEST_USER_SCENE_H__
#define __TEST_USER_SCENE_H__

View File

@ -18,7 +18,9 @@ LOCAL_SRC_FILES := hellocpp/main.cpp \
../../Classes/TestUser/TestUserScene.cpp \
../../Classes/TestUser/MyUserManager.cpp \
../../Classes/TestIAPOnline/TestIAPOnlineScene.cpp \
../../Classes/TestIAPOnline/MyIAPOLManager.cpp
../../Classes/TestIAPOnline/MyIAPOLManager.cpp \
../../Classes/TestSocial/TestSocialScene.cpp \
../../Classes/TestSocial/MySocialManager.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/TestAds \
@ -26,7 +28,8 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/TestIAP \
$(LOCAL_PATH)/../../Classes/TestShare \
$(LOCAL_PATH)/../../Classes/TestUser \
$(LOCAL_PATH)/../../Classes/TestIAPOnline
$(LOCAL_PATH)/../../Classes/TestIAPOnline \
$(LOCAL_PATH)/../../Classes/TestSocial
LOCAL_WHOLE_STATIC_LIBRARIES += cocos2dx_static \
PluginProtocolStatic

View File

@ -57,6 +57,8 @@
FAD55528177D2C2000968F54 /* BtnND91.png in Resources */ = {isa = PBXBuildFile; fileRef = FAD55524177D2C2000968F54 /* BtnND91.png */; };
FAD55529177D2C2000968F54 /* twitter.jpeg in Resources */ = {isa = PBXBuildFile; fileRef = FAD55525177D2C2000968F54 /* twitter.jpeg */; };
FAD5552A177D2C2000968F54 /* weibo.png in Resources */ = {isa = PBXBuildFile; fileRef = FAD55526177D2C2000968F54 /* weibo.png */; };
FADBF8A2179E559900F59B1D /* MySocialManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADBF89E179E559900F59B1D /* MySocialManager.cpp */; };
FADBF8A3179E559900F59B1D /* TestSocialScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FADBF8A0179E559900F59B1D /* TestSocialScene.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -236,6 +238,10 @@
FAD55524177D2C2000968F54 /* BtnND91.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = BtnND91.png; sourceTree = "<group>"; };
FAD55525177D2C2000968F54 /* twitter.jpeg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = twitter.jpeg; sourceTree = "<group>"; };
FAD55526177D2C2000968F54 /* weibo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = weibo.png; sourceTree = "<group>"; };
FADBF89E179E559900F59B1D /* MySocialManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MySocialManager.cpp; sourceTree = "<group>"; };
FADBF89F179E559900F59B1D /* MySocialManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MySocialManager.h; sourceTree = "<group>"; };
FADBF8A0179E559900F59B1D /* TestSocialScene.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestSocialScene.cpp; sourceTree = "<group>"; };
FADBF8A1179E559900F59B1D /* TestSocialScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSocialScene.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -289,6 +295,7 @@
15AA9C4015B7EC450033D6C2 /* Classes */ = {
isa = PBXGroup;
children = (
FADBF89D179E559900F59B1D /* TestSocial */,
FA3D264717867219009B234A /* TestIAPOnline */,
FAD5550E177D1EE900968F54 /* TestIAP */,
FAD55513177D1EE900968F54 /* TestUser */,
@ -464,6 +471,18 @@
path = ../Classes/TestUser;
sourceTree = "<group>";
};
FADBF89D179E559900F59B1D /* TestSocial */ = {
isa = PBXGroup;
children = (
FADBF89E179E559900F59B1D /* MySocialManager.cpp */,
FADBF89F179E559900F59B1D /* MySocialManager.h */,
FADBF8A0179E559900F59B1D /* TestSocialScene.cpp */,
FADBF8A1179E559900F59B1D /* TestSocialScene.h */,
);
name = TestSocial;
path = ../Classes/TestSocial;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -662,6 +681,8 @@
FAD5551B177D1EE900968F54 /* TestUserScene.cpp in Sources */,
FA3D264D17867219009B234A /* MyIAPOLManager.cpp in Sources */,
FA3D264E17867219009B234A /* TestIAPOnlineScene.cpp in Sources */,
FADBF8A2179E559900F59B1D /* MySocialManager.cpp in Sources */,
FADBF8A3179E559900F59B1D /* TestSocialScene.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};