.h
#ifndef _PLATFORM_DELEGATE_HANDLER_H_
#define _PLATFORM_DELEGATE_HANDLER_H_
#include "include/sdkdelegate.h"
#include "include/platforms.h"
#include "cocos2d.h"
static const char* kInitResult = "InitResult";
static const char* kCheckVersionResult = "CheckVersionResult";
static const char* kLoginResult = "LoginResult";
static const char* kLogoutResult = "LogoutResult";
static const char* kLoginPlatformResult = "LoginPlatformResult";
static const char* kBindResult = "BindResult";
static const char* kPayResult = "PayResult";
static const char* kExitResult = "ExitResult";
static const char* kJaveCallStringResult = "JaveCallStringResult";
static const char* kJaveCallVoidResult = "JaveCallVoidResult";
struct ParamObject : public cocos2d::CCObject { //相当于观察者
ParamObject()
: platform_(PlatformDefault)
, ret_(-1)
, intParam_(0) {
eventName_.clear();
}
ParamObject(const char* eventName, PlatformEnum platform, unsigned int ret,
const char* param)
: platform_(platform)
, ret_(ret)
, intParam_(0)
{
if (eventName)
eventName_ = eventName;
if (param)
param_ = param;
}
static ParamObject* create(const char* eventName, PlatformEnum platform, int ret,
const char* param) {
ParamObject* obj = new ParamObject(eventName, platform, ret, param);
obj->autorelease();
return obj;
}
void printParam(const char* tag);
void excuteCallback();
// {
// cocos2d::CCNotificationCenter::sharedNotificationCenter()->postNotification(eventName_.c_str(),
// this);
// }
std::string eventName_; //消息名
PlatformEnum platform_;
int ret_;
std::string param_; //
int intParam_;
std::string strParam_;
};
class PlatformDelegateImplement : public SdkKit::SdkDelegate, public cocos2d::CCObject {
public:
PlatformDelegateImplement();
virtual ~PlatformDelegateImplement();
//下面这些函数执行后会往callbackList_里 add 观察者
virtual void onInit(PlatformEnum platform, int ret,
const char* param);
virtual void onCheckVersion(PlatformEnum platform, int ret,
const char* param);
virtual void onLogin(PlatformEnum platform, int ret,
const char* param, bool isFastLogin);
virtual void onLogout(PlatformEnum platform, int ret,
const char* param);
virtual void onLoginPlatform(PlatformEnum platform, int ret,
const char* param);
virtual void onBind(PlatformEnum platform, int ret,
const char* param);
virtual void onPay(PlatformEnum platform, int ret,
const char* param);
virtual std::string onJavaCallStringMethod(PlatformEnum platform,
const char* funcName, const char* paramConfig);
virtual void onJavaCallVoidMethod(PlatformEnum platform,
const char* funcName, const char* paramConfig);
virtual void onExitGame(PlatformEnum platform, int ret,
const char* param);
protected:
virtual void update(float delta); //update会每帧执行excuteCallbackEvent
void addCallbackEvent(ParamObject* obj); //相当于addobserve
void excuteCallbackEvent(); //相当于postnotice 但无需参数 因为内部调用ParamObject 的excuteCallback
private:
cocos2d::CCArray* callbackList_; //相当于观察者数组
};
#endif // !_PLATFORM_HANDLER_H_
.cpp
#include "PlatformDelegateImplement.h"
#include "cocos2d.h"
USING_NS_CC;
void ParamObject::printParam(const char* tag) {
if (tag == NULL)
tag = "NullTag";
cocos2d::CCLog("[%s] platformId:%d, ret:%d, param:%s, intParam:%d", tag, platform_, ret_, param_.c_str(), intParam_);
}
void ParamObject::excuteCallback() {
cocos2d::CCNotificationCenter::sharedNotificationCenter()->postNotification(eventName_.c_str(),
this);
}
PlatformDelegateImplement::PlatformDelegateImplement() {
callbackList_ = cocos2d::CCArray::create();
callbackList_->retain();
cocos2d::CCDirector::sharedDirector()->getScheduler()->scheduleUpdateForTarget(this, 0, false);
}
PlatformDelegateImplement::~PlatformDelegateImplement() {
cocos2d::CCDirector::sharedDirector()->getScheduler()->unscheduleUpdateForTarget(this);
callbackList_->release();
callbackList_ = NULL;
}
void PlatformDelegateImplement::onInit(PlatformEnum platform, int ret,
const char* param) {
cocos2d::CCLog("PlatformDelegateImplement::onInit");
addCallbackEvent(ParamObject::create(kInitResult, platform, ret, param));
}
void PlatformDelegateImplement::onCheckVersion(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kCheckVersionResult, platform, ret, param));
}
void PlatformDelegateImplement::onLogin(PlatformEnum platform, int ret,
const char* param, bool isFastLogin) {
ParamObject* obj = ParamObject::create(kLoginResult, platform, ret, param);
obj->intParam_ = isFastLogin ? 1 : 0;
addCallbackEvent(obj);
CCLOG("进入onLogin。。。。。。。。。。");
}
void PlatformDelegateImplement::onLogout(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kLogoutResult, platform, ret, param));
}
void PlatformDelegateImplement::onLoginPlatform(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kLoginPlatformResult, platform, ret, param));
}
void PlatformDelegateImplement::onBind(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kBindResult, platform, ret, param));
}
void PlatformDelegateImplement::onPay(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kPayResult, platform, ret, param));
}
std::string PlatformDelegateImplement::onJavaCallStringMethod(PlatformEnum platform,
const char* funcName, const char* paramConfig) {
std::string result("result:");
if (funcName != NULL) {
result.append(" func(");
result.append(funcName);
result.append(")");
}
if (paramConfig != NULL) {
result.append(" param(");
result.append(paramConfig);
result.append(")");
}
cocos2d::CCLog("PlatformDelegateImplement::onJavaCallStringMethod: called! funcname=%s, param=%s",
funcName, paramConfig);
return result.c_str();
}
void PlatformDelegateImplement::onJavaCallVoidMethod(PlatformEnum platform,
const char* funcName, const char* paramConfig) {
ParamObject* obj = ParamObject::create(kJaveCallVoidResult, platform, 0, paramConfig);
obj->strParam_ = funcName;
addCallbackEvent(obj);
cocos2d::CCLog("PlatformDelegateImplement::onJavaCallVoidMethod: called! funcname=%s, param=%s",
funcName, paramConfig);
}
void PlatformDelegateImplement::onExitGame(PlatformEnum platform, int ret,
const char* param) {
addCallbackEvent(ParamObject::create(kExitResult, platform, ret, param));
}
void PlatformDelegateImplement::update(float delta) {
cocos2d::CCObject::update(delta);
excuteCallbackEvent();
}
void PlatformDelegateImplement::addCallbackEvent(ParamObject* obj) {
if (callbackList_ == NULL || obj == NULL)
return ;
callbackList_->addObject(obj);
}
void PlatformDelegateImplement::excuteCallbackEvent() {
if (callbackList_ == NULL ||
callbackList_->count() < 1)
return ;
cocos2d::CCObject* obj = NULL;
CCARRAY_FOREACH(callbackList_, obj) {
ParamObject* paramObj = dynamic_cast<ParamObject*>(obj);
if (paramObj != NULL) {
paramObj->excuteCallback();
}
}
callbackList_->removeAllObjects();
}