您的位置:首页 > 移动开发

houmee实习日记4.2-4.9<2>

2015-04-15 00:00 246 查看
摘要: 实战IOS游戏接入App Store ----- store kit的游戏内置支付功能<2> 接入原理与流程------Object-C

这个参考很不错:http://blog.csdn.net/wanghexu09008126/article/details/17232395

这边我们来上c++跟oc桥接部分的代码,然后传给lua端

(noticeSender.h/noticeSender.cpp)

这两个是用来传给lua的,c++,与lua交互

//
//  NoticeSenter.h
//  HeroWar
//
//  Created by huale_mac on 15-1-21.
//
//

#ifndef __HeroWar__NoticeSenter__
#define __HeroWar__NoticeSenter__

enum {
DO_LOGIN_SUCCEED = 1001,   //登陆成功
DO_LOGIN_FAIL,      //登陆失败
DO_LOGOUT_SUCCEED,  //登出游戏成功
DO_PAY_SUCCEED,    //支付成功
};

#include <stdio.h>
#include "cocos2d.h"
#include "string.h"

using namespace cocos2d;

class NoticeSenderToLua :public cocos2d::CCObject{
public:
static NoticeSenderToLua* sharedNotification();
void SendMsgToLua(int eventId , void* obj);
};

#endif /* defined(__HeroWar__NoticeSenter__) */

//
//  NoticeSenter.cpp
//  HeroWar
//
//  Created by huale_mac on 15-1-21.
//
//

#include "NoticeSender.h"

static NoticeSenderToLua* _notification = NULL;

NoticeSenderToLua* NoticeSenderToLua::sharedNotification()
{
if(!_notification)
{
_notification = new NoticeSenderToLua();
}
return _notification;
}

void NoticeSenderToLua::SendMsgToLua(int eventId , void* obj)
{
char temp[10] = {0};
std::sprintf(temp, "%d",eventId);
cocos2d::CCNotificationCenter::sharedNotificationCenter()->postNotification(temp, (cocos2d::CCObject*)obj );
}

继续,到(SDKlmpBridge.h/SDKlmpBridge.mm)、.mm是c++跟OC混编文件(我oc就学了几天,就被逼着写了,在公司跟在学校就是不同。哎。。。在学校就是撸)

//
//  SDKImplBridge.h
//  HeroWar
//
//  Created by huale_mac on 15-1-21.
//
//

#ifndef HeroWar_SDKImplBridge_h
#define HeroWar_SDKImplBridge_h
#include "cocos2d.h"
//#include "ThepayTest.h"
class SDKImplBridge : public cocos2d::CCObject
{
public:
static SDKImplBridge* sharedInstance();
void end();
void isSDKLogin();
void doInit();
void doLogin( int loginHandler );
void doLogout();
bool showUserCenter();
void reCharge(int gold,int parambillId, char* parambillName,int paramserverId,int paramroleId,int paramgoodId, char* customParam);
//    CC_SYNTHESIZE( int, m_loginHandler, LoginHandler );
static int m_loginHandler;
static std::string m_sid;
void executeLoginCallback( void* sid, bool bLogin  );

};

#endif

//
//  SDKImplBridge.cpp
//  HeroWar
//
//  Created by huale_mac on 15-1-21.
//
//

#include <stdio.h>
#include "SDKImplBridge.h"
#include "SDKImpl.h"
#include "cocos2d.h"
#include "CCLuaEngine.h"

USING_NS_CC;

static SDKImplBridge* instance = NULL;
int SDKImplBridge::m_loginHandler = 0;
std::string SDKImplBridge::m_sid = "";
SDKImplBridge* SDKImplBridge::sharedInstance()
{
if (! instance)
{
instance = new SDKImplBridge();
m_loginHandler = 0;
}

return instance;
}

void SDKImplBridge::executeLoginCallback( void* sid, bool bLogin )
{
if (SDKImplBridge::m_loginHandler) {
CCLuaEngine* pEngine = (CCLuaEngine*)(CCScriptEngineManager::sharedManager()->getScriptEngine());
cocos2d::CCLog("C++层打印= %s",(const char*)sid);
pEngine->getLuaStack()->pushString( (const char*) sid );
pEngine->getLuaStack()->pushBoolean( bLogin );
pEngine->getLuaStack()->executeFunctionByHandler(SDKImplBridge::m_loginHandler, 2);
pEngine->getLuaStack()->removeScriptHandler(SDKImplBridge::m_loginHandler);
SDKImplBridge::m_loginHandler = 0;
}
}

void SDKImplBridge::end()
{
if (instance)
{
delete instance;
instance = NULL;
}

}

void SDKImplBridge::isSDKLogin()
{
[[SDKImpl instance ]isSDKLogin ];
}

void SDKImplBridge::doInit()
{
[[SDKImpl instance]doInit];
}

void SDKImplBridge::doLogin(int loginHandler )
{
SDKImplBridge::m_loginHandler = loginHandler;
[[SDKImpl instance]doLogin];
}

void SDKImplBridge::doLogout()
{
[[SDKImpl instance]doLogout];
}

bool SDKImplBridge::showUserCenter()
{
return[[SDKImpl instance]showUserCenter];
}

void SDKImplBridge::reCharge(int gold,int parambillId, char* parambillName,int paramserverId,int paramroleId,int paramgoodId, char* customParam)
{
[[SDKImpl instance]exchangeGoods:gold billId:parambillId billName:parambillName serverId:paramserverId roleId:paramroleId goodId:paramgoodId extraParam:customParam];
}

接着:------------------(SDKlmpl.h/SDKlmpl.mm)----------------在这里我们来调用之前<1>里面写过的(ThepayTest.h/m /MyStoreObserver.h/m)里面的调用

//
//  SDKImpl.h
//  moshou
//
//  Created by DT on 14-9-23.
//
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <NdComPlatform/NdComPlatform.h>//delete
#import <StoreKit/StoreKit.h>
#import "ThepayTest.h"
#import "MyStoreObserver.h"

@interface SDKImpl : NSObject
{

}

+(SDKImpl *) instance;
-(void) doInit;  //had change
-(bool) isSDKLogin;
-(void) doLogin;  //had change
-(void) doLogout;
-(bool) showUserCenter;
-(void) exchangeGoods:(int)gold      //had change
billId:(int)parambillId
billName:(const char *)parambillName
serverId:(int)paramserverId
roleId:(int)paramroleId
goodId:(int)paramgoodId
extraParam:(const char* )customParam;

@property(readwrite,assign) bool bLogin;
@property(readwrite,assign) bool bInit;
@end

//
//  SDKImpl.m
//  moshou
//
//  Created by DT on 14-9-23.
//
//

#import "SDKImpl.h"
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include "cocos2d.h"
#include "NoticeSender.h"
#include "SDKImplBridge.h"
#import <NdComPlatform/NdComPlatform.h>
#import <NdComPlatform/NdCPNotifications.h>
#import <NdComPlatform/NdComPlatformError.h>

//
//static int const APP_ID = 116277;
//static NSString *const APP_KEY = @"c28c0f2a464d65e39591e419dfdfbe5049aacf8df26b6502";

static SDKImpl *instance;                    //静态类对象,作用于全局
@implementation SDKImpl

@synthesize bLogin = _bLogin;
@synthesize bInit = _bInit;
+(SDKImpl *) instance                        //静态类方法+
{
if(!instance)
instance = [[SDKImpl alloc] init];   //如果这个对象不存在,初始化他  instance = [[SDKImpl alloc] init]; return instance;返回instance
return instance;
}

#pragma mark - < 调用接口 > -
- (void) doInit
{
NSLog(@"初始化开始");
[self setBLogin:false];
[self setBInit:false];
NSLog(@"初始化结束");

}

-(bool) isSDKLogin
{
return false;
}

- (void)doLogin
{
printf("sdkimpl dologin");
//    if ( !self.bInit ) {
//        [self doInit];
//    }
//    //注册监听消息
//
//    [[NdComPlatform defaultPlatform] NdLogin:0];

}

- (void)doLogout
{
[[NdComPlatform defaultPlatform] NdLogout:0];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

-(bool) showUserCenter
{
[[NdComPlatform defaultPlatform] NdEnterAppCenter:0];
return true;
}

//ios storekit  paymentCallBack
- (void) exchangeGoods:(int)gold            //is here
billId:(int)parambillId
billName:(const char *)parambillName
serverId:(int)paramserverId
roleId:(int)paramroleId
goodId:(int)paramgoodId
extraParam:(const char* )customParam
{
NSLog(@"enter recharge!!!!");  //请求产品信息
ThepayTest * requestbuy1 = [[ThepayTest alloc] init];
[requestbuy1 requestProductData];
NSLog(@"exchangeGoods 's gold is %d" , gold);
NSLog(@"print paramgoodID, %d" ,paramgoodId);// 这个1-7
NSLog(@"parambillName,%s",parambillName);
//    NSLog(@"给我打印一下parambillID, %s" ,parambillName);
ThepayTest * requestbuy2 = [[ThepayTest alloc] init];  //必须要用第二个对象来进行购买参数传递
[requestbuy2 buy:gold goldnum:paramgoodId];

NSLog(@"payment success!"); //

//2改    MyStoreObserver * myPayment = [[MyStoreObserver alloc] init];
//1改  [myPayment paymentQueue:payment updatedTransactions:payment];利用SKPaymentQueue里面的单例方法来调用然后添加列队
[[SKPaymentQueue defaultQueue] addTransactionObserver:[MyStoreObserver instance]];

}

@end
到此storekit接入的代码基本完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息