大佬教程收集整理的这篇文章主要介绍了U8SDK——Cocos2dx游戏快速渠道SDK接入,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最近抽了点时间,折腾了下cocos2dx中接入U8SDK的Demo。同时,简单封装了下,使得在cocos2dx中能够快速地接入U8SDK。
先说下大体的思路。和之前说的在Unity中接入U8SDK一样,在Cocos2dx中接入U8SDK,我们也分为两步,一个Android中的部分,另 一个是Coccos2dx中的部分。同时,我们希望尽可能地封装不同平台之间数据的传递,以及接口的调用。使得大部分游戏基于这个封装,都可以最快地 速度来完成U8SDK的接入。
在Cocos2dx中封装JNI调用,以及和Android中交互的数据格式等的定义和解析。同样地,这部分对于所有游戏也都适用。游戏中只需要调用这里提供的相关接口,以及实现相应的回调即可完成接入。
这篇文章,我们先来总体看看,对于一个新的Cocos2dx的开发的游戏,怎么根据我们的封装,快速完成U8SDK的抽象层的接入,从而直接打出母包,再通过一键打包工具,打出最终的多个渠道包。
首先, 我们使用COcos new 新建一个Cocos2dx(我这里使用的是Cocos2dx 3.x版本)工程,名为HelloCocos。
然后,解压u8sdk_cocos2dx.zip文件到HelloCocos/Classes目录下:
紧接着,我们新建两个按钮,一个登录,一个支付。 再新建一个Label,显示当前的登录状态。
@H_801_23@this->@H_675_25@labelUsername =@H_675_25@ Label::createWithTTF@H_675_25@("U8SDK"@H_675_25@,"fonts/Marker Felt.ttf"@H_675_25@,24@H_675_25@); // position the label on the center of the screen@H_675_25@ this->@H_675_25@labelUsername->@H_675_25@setPosition(Vec2(origin.@H_675_25@x +@H_675_25@ visibleSize.@H_675_25@width /@H_675_25@ 2@H_675_25@,origin.@H_675_25@y +@H_675_25@ visibleSize.@H_675_25@height -@H_675_25@ this->@H_675_25@labelUsername->@H_675_25@getContentSize().@H_675_25@height)); // add the label as a child to this layer@H_675_25@ this->@H_675_25@addChild(this->@H_675_25@labelUsername,1@H_675_25@); ui::Button@H_675_25@*@H_675_25@ btnLogin =@H_675_25@ ui::Button@H_675_25@::create@H_675_25@("login_normal.png"@H_675_25@,"login_SELEcted.png"@H_675_25@); btnLogin->@H_675_25@setPosition(Vec2(visibleSize.@H_675_25@width /@H_675_25@ 2@H_675_25@ +@H_675_25@ origin.@H_675_25@x,visibleSize.@H_675_25@height /@H_675_25@ 2@H_675_25@ +@H_675_25@ origin.@H_675_25@y +@H_675_25@ 30@H_675_25@)); btnLogin->@H_675_25@addClickEventListener(CC_CALLBACK_1(HelloWorld::loginClickCallBACk@H_675_25@,this)); // add the sprite as a child to this layer@H_675_25@ this->@H_675_25@addChild(btnLogin,0@H_675_25@); ui::Button@H_675_25@*@H_675_25@ btnPay =@H_675_25@ ui::Button@H_675_25@::create@H_675_25@("pay_normal.png"@H_675_25@,"pay_SELEcted.png"@H_675_25@); btnPay->@H_675_25@setPosition(Vec2(visibleSize.@H_675_25@width /@H_675_25@ 2@H_675_25@ +@H_675_25@ origin.@H_675_25@x,visibleSize.@H_675_25@height /@H_675_25@ 2@H_675_25@ +@H_675_25@ origin.@H_675_25@y -@H_675_25@ 30@H_675_25@)); btnPay->@H_675_25@addClickEventListener(CC_CALLBACK_1(HelloWorld::payClickCallBACk@H_675_25@,this)); // add the sprite as a child to this layer@H_675_25@ this->@H_675_25@addChild(btnPay,0@H_675_25@);然后,我们就可以开始U8SDK的接入了。
1、HelloWorldScene.h中的HelloWorld类,继承U8SDKCallBACk抽象类,实现该类中的几个回调接口,代码 如下:
@H_801_23@#ifndef __HelLOWORLD_SCENE_H__@H_675_25@ #define@H_675_25@ __HelLOWORLD_SCENE_H__@H_675_25@ #include "cocos2d.h"@H_675_25@ #include "ui/CocosGUI.h"@H_675_25@ #include "u8sdk/U8SDKInterface.h"@H_675_25@ class HelloWorld : public@H_675_25@ cocos2d::Layer,U8SDKCallBACk { private@H_675_25@: cocos2d::Label* labelUsername; public@H_675_25@: // there's no 'id' in@H_675_25@ cpp,so we recommend returning the class@H_675_25@ instance pointer static@H_675_25@ cocos2d::Scene* createScene@H_675_25@(); // Here's a difference. Method 'init' in cocos2d-x returns bool,instead of returning 'id' in cocos2d-iphone@H_675_25@ virtual@H_675_25@ bool@H_675_25@ init(); void@H_675_25@ loginClickCallBACk(cocos2d::ref* pSender); void@H_675_25@ payClickCallBACk(cocos2d::ref* pSender); // a SELEctor callBACk@H_675_25@ void@H_675_25@ menuCloseCallBACk(cocos2d::ref* pSender); virtual@H_675_25@ void@H_675_25@ OnInitSuc(); virtual@H_675_25@ void@H_675_25@ OnLoginSuc(U8LoginResult* result); virtual@H_675_25@ void@H_675_25@ OnSwitchLogin(); virtual@H_675_25@ void@H_675_25@ OnLogout(); // implement the "static create()" method manually@H_675_25@ CREATE_FUNC(HelloWorld); }; #endif@H_675_25@ // __HelLOWORLD_SCENE_H__@H_675_25@2、HelloWorldScene.cpp中init方法的最后,我们调用U8SDK的初始化方法:
U8SDKInterface::geTinstance()->initSDK(this);
同时,这里要实现第一步中添加的U8SDKCallBACk中的回调
@H_801_23@void@H_675_25@ HelloWorld::OnInitSuc@H_675_25@() { CCLOG("SDK初始化成功..."@H_675_25@); //一般不需要做什么处理@H_675_25@ } void@H_675_25@ HelloWorld::OnLoginSuc@H_675_25@(U8LoginResult*@H_675_25@ result) { CCLOG("SDK登录并认证成功...%s"@H_675_25@,result->@H_675_25@userId.@H_675_25@c_str()); this->@H_675_25@labelUsername->@H_675_25@setString(result->@H_675_25@sdkUserName); if@H_675_25@ (result->@H_675_25@isSwitchAccount) { //TODO:这里退回到登录界面,并且SDK是已经登录成功状态,不用再弹出SDK的登录界面@H_675_25@ } else@H_675_25@ { //TODO:登录认证成功,获取服务器列表,进入游戏服...@H_675_25@ } } void@H_675_25@ HelloWorld::OnSwitchLogin@H_675_25@() { CCLOG("切换帐号成功..."@H_675_25@); //TODO:退回到登录界面,并弹出SDK登录界面(调用U8SDKInterface::geTinstance()->login())@H_675_25@ } void@H_675_25@ HelloWorld::OnLogout@H_675_25@() { CCLOG("SDK帐号退出成功..."@H_675_25@); this->@H_675_25@labelUsername->@H_675_25@setString("U8SDK"@H_675_25@); //TODO:退回到登录界面,并弹出SDK登录界面(调用U8SDKInterface::geTinstance()->login())@H_675_25@ }3、定义登录按钮和支付按钮的点击事件,登录点击的时候,触发登录;U8SDKInterface::geTinstance()->login();支付按钮点击的时候,触发支付:U8SDKInterface::geTinstance()->pay(params);完整的代码,如下:
@H_801_23@#include@H_675_25@ "HelloWorldScene.h"@H_675_25@ USING_NS_Cc; Scene*@H_675_25@ HelloWorld::createScene@H_675_25@() { // 'scene' is an autorelease object@H_675_25@ auto scene =@H_675_25@ Scene::create@H_675_25@(); // 'layer' is an autorelease object@H_675_25@ auto layer =@H_675_25@ HelloWorld::create@H_675_25@(); // add layer as a child to scene@H_675_25@ scene->@H_675_25@addChild(layer); // return the scene@H_675_25@ return@H_675_25@ scene; } // on "init" you need to initialize your instance@H_675_25@ bool HelloWorld::init@H_675_25@() { //////////////////////////////@H_675_25@ // 1. super init first@H_675_25@ if@H_675_25@ ( !@H_675_25@Layer::init@H_675_25@() ) { return@H_675_25@ false@H_675_25@; } Size visibleSize =@H_675_25@ Director::geTinstance@H_675_25@()->@H_675_25@getVisibleSize(); Vec2 origin =@H_675_25@ Director::geTinstance@H_675_25@()->@H_675_25@getVisibLeorigin(); /////////////////////////////@H_675_25@ // 2. add a menu item with "X" image,which is clicked to quit the program@H_675_25@ // you may modify it.@H_675_25@ // add a "close" icon to exit the progress. it's an autorelease object@H_675_25@ auto closeItem =@H_675_25@ MenuItemImage::create@H_675_25@( "CloseNormal.png"@H_675_25@,"CloseSELEcted.png"@H_675_25@,CC_CALLBACK_1(HelloWorld::menuCloseCallBACk@H_675_25@,this)); closeItem->@H_675_25@setPosition(Vec2(origin.@H_675_25@x +@H_675_25@ visibleSize.@H_675_25@width -@H_675_25@ closeItem->@H_675_25@getContentSize().@H_675_25@width/2@H_675_25@,origin.@H_675_25@y +@H_675_25@ closeItem->@H_675_25@getContentSize().@H_675_25@height/2@H_675_25@)); // create menu,it's an autorelease object@H_675_25@ auto menu =@H_675_25@ Menu::create@H_675_25@(closeItem,NULL@H_675_25@); menu->@H_675_25@setPosition(Vec2::ZERO@H_675_25@); this->@H_675_25@addChild(menu,1@H_675_25@); /////////////////////////////@H_675_25@ // 3. add your codes below...@H_675_25@ // add a label shows "Hello World"@H_675_25@ // create and initialize a label@H_675_25@ this->@H_675_25@labelUsername =@H_675_25@ Label::createWithTTF@H_675_25@("U8SDK"@H_675_25@,24@H_675_25@); // position the label on the center of the screen@H_675_25@ this->@H_675_25@labelUsername->@H_675_25@setPosition(Vec2(origin.@H_675_25@x +@H_675_25@ visibleSize.@H_675_25@width /@H_675_25@ 2@H_675_25@,0@H_675_25@); //NDKHelper::addSELEctor("U8SELEctors","onU8LoginResult",CC_CALLBACK_2(HelloWorld::onU8LoginResult,this),this);@H_675_25@ U8SDKInterface::geTinstance@H_675_25@()->@H_675_25@initSDK(this); return@H_675_25@ true@H_675_25@; } void@H_675_25@ HelloWorld::OnInitSuc@H_675_25@() { CCLOG("SDK初始化成功..."@H_675_25@); //一般不需要做什么处理@H_675_25@ } void@H_675_25@ HelloWorld::OnLoginSuc@H_675_25@(U8LoginResult*@H_675_25@ result) { CCLOG("SDK登录并认证成功...%s"@H_675_25@,result->@H_675_25@userId.@H_675_25@c_str()); this->@H_675_25@labelUsername->@H_675_25@setString(result->@H_675_25@sdkUserName); if@H_675_25@ (result->@H_675_25@isSwitchAccount) { //TODO:这里退回到登录界面,并且SDK是已经登录成功状态,不用再弹出SDK的登录界面@H_675_25@ } else@H_675_25@ { //TODO:登录认证成功,获取服务器列表,进入游戏服...@H_675_25@ } } void@H_675_25@ HelloWorld::OnSwitchLogin@H_675_25@() { CCLOG("切换帐号成功..."@H_675_25@); //TODO:退回到登录界面,并弹出SDK登录界面(调用U8SDKInterface::geTinstance()->login())@H_675_25@ } void@H_675_25@ HelloWorld::OnLogout@H_675_25@() { CCLOG("SDK帐号退出成功..."@H_675_25@); this->@H_675_25@labelUsername->@H_675_25@setString("U8SDK"@H_675_25@); //TODO:退回到登录界面,并弹出SDK登录界面(调用U8SDKInterface::geTinstance()->login())@H_675_25@ } void@H_675_25@ HelloWorld::loginClickCallBACk@H_675_25@(Ref *@H_