Cocos2d-x   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了U8SDK——Cocos2dx游戏快速渠道SDK接入大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

最近抽了点时间,折腾了下cocos2dx中接入U8SDK的Demo。同时,简单封装了下,使得在cocos2dx中能够快速地接入U8SDK。

先说下大体的思路。和之前说的在Unity中接入U8SDK一样,在Cocos2dx中接入U8SDK,我们也分为两步,一个Android中的部分,另 一个是Coccos2dx中的部分。同时,我们希望尽可能地封装不同平台之间数据的传递,以及接口的调用。使得大部分游戏基于这个封装,都可以最快地 速度来完成U8SDK的接入。

  1. 新建一个Android工程,作为U8SDK和Cocos2dx的一个中间工程(U8SDK_Cocos2dx),主要负责U8SDK的接口调用封装,参数传递和解析等。这个工程,对于所有游戏都试用。
  2. 在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_675_25@pSender) { CCLOG("Btn Login Clicked...U8 Login..."@H_675_25@); U8SDKInterface::geTinstance@H_675_25@()->@H_675_25@login(); } void@H_675_25@ HelloWorld::payClickCallBACk@H_675_25@(Ref *@H_675_25@pSender) { CCLOG("Btn Pay Clicked...U8 Pay..."@H_675_25@); U8PayParams*@H_675_25@ params@H_675_25@ =@H_675_25@ U8PayParams::create@H_675_25@(); params@H_675_25@->@H_675_25@productId =@H_675_25@ "1"@H_675_25@; params@H_675_25@->@H_675_25@productName =@H_675_25@ "元宝"@H_675_25@; params@H_675_25@->@H_675_25@productDesc =@H_675_25@ "购买100元宝,赠送20元宝"@H_675_25@; params@H_675_25@->@H_675_25@price =@H_675_25@ 100@H_675_25@; params@H_675_25@->@H_675_25@buyNum =@H_675_25@ 1@H_675_25@; params@H_675_25@->@H_675_25@coinNum =@H_675_25@ 300@H_675_25@; params@H_675_25@->@H_675_25@serverId =@H_675_25@ "10"@H_675_25@; params@H_675_25@->@H_675_25@serverName =@H_675_25@ "地狱之恋"@H_675_25@; params@H_675_25@->@H_675_25@rolEID =@H_675_25@ "u8_24532452"@H_675_25@; params@H_675_25@->@H_675_25@rolename =@H_675_25@ "麻利麻利吼"@H_675_25@; params@H_675_25@->@H_675_25@roleLevel =@H_675_25@ 15@H_675_25@; params@H_675_25@->@H_675_25@vip =@H_675_25@ "v15"@H_675_25@; //去服务器获取游戏中商品的订单号以及扩展数据,这里测试@H_675_25@ params@H_675_25@->@H_675_25@orderID =@H_675_25@ "345435634534"@H_675_25@; params@H_675_25@->@H_675_25@extension =@H_675_25@ "test111"@H_675_25@; U8SDKInterface::geTinstance@H_675_25@()->@H_675_25@pay(params@H_675_25@); } void@H_675_25@ HelloWorld::menuCloseCallBACk@H_675_25@(Ref*@H_675_25@ pSender) { Director::geTinstance@H_675_25@()->@H_675_25@end(); #if@H_675_25@ (CC_TARGET_PLATFORM ==@H_675_25@ CC_PLATFORM_IOS) exit(0@H_675_25@); #endif@H_675_25@ }

4、 将HelloCocos生成proj.android导入到eclipse中,然后将u8SDK2和U8SDK_Cocos2dx工程生成的jar包(分 别是u8sdk2.jar和u8sdk_cocos2dx.jar)拷贝到HelloCocos安卓工程的libs目录下。然后,将生成的 AppActivity.java,本来是继承Cocos2dxActivity的,改为继承U8CocosActivity。
同时,将AndroidManifest.xml中的application节点中,加上android:name=”com.u8.sdk.U8Application”

最后,为了能够在Android中编译并运行,我们还需要将u8SDK包含的这些Cpp文件,添加到Android.mk中,最终的文件如下:

@H_801_23@LOCAL_PATH := $(call@H_675_25@ my-dir) include $(CLEAR_VARS) $(call@H_675_25@ import-add@H_675_25@-path,$(LOCAL_PATH)/../../cocos2d) $(call@H_675_25@ import-add@H_675_25@-path,$(LOCAL_PATH)/../../cocos2d/external) $(call@H_675_25@ import-add@H_675_25@-path,$(LOCAL_PATH)/../../cocos2d/cocos) $(call@H_675_25@ import-add@H_675_25@-path,$(LOCAL_PATH)/../../Classes/jansson) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILename := libcocos2dcpp LOCAL_SRC_FILES := Hellocpp/main.cpp@H_675_25@ \ ../../Classes/AppDelegate.cpp@H_675_25@ \ ../../Classes/HelloWorldScene.cpp@H_675_25@ \ ../../Classes/jansson/value.c@H_675_25@ \ ../../Classes/jansson/utf.c@H_675_25@ \ ../../Classes/jansson/strconv.c@H_675_25@ \ ../../Classes/jansson/strbuffer.c@H_675_25@ \ ../../Classes/jansson/pack_unpack.c@H_675_25@ \ ../../Classes/jansson/memory.c@H_675_25@ \ ../../Classes/jansson/load.c@H_675_25@ \ ../../Classes/jansson/hashtable.c@H_675_25@ \ ../../Classes/jansson/error.c@H_675_25@ \ ../../Classes/jansson/dump.c@H_675_25@ \ ../../Classes/NDKHelper/CallFuncNV.cpp@H_675_25@ \ ../../Classes/NDKHelper/NDKCallBACkNode.cpp@H_675_25@ \ ../../Classes/NDKHelper/NDKHelper.cpp@H_675_25@ \ ../../Classes/u8sdk/U8SDKData.cpp@H_675_25@ \ ../../Classes/u8sdk/U8SDKNativeCallBACk.cpp@H_675_25@ \ ../../Classes/u8sdk/U8SDKInterface.cpp@H_675_25@ \ LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \ $(LOCAL_PATH)/../../cocos2d/cocos/ui # _COCOS_HEADER_ANDROID_BEGIN@H_675_25@ # _COCOS_HEADER_ANDROID_END@H_675_25@ LOCAL_STATIC_LIBRARIES := cocos2dx_static LOCAL_STATIC_LIBRARIES += cocos_ui_static # _COCOS_LIB_ANDROID_BEGIN@H_675_25@ # _COCOS_LIB_ANDROID_END@H_675_25@ include $(BUILD_SHARED_LIBRARY) $(call@H_675_25@ import-module,.) $(call@H_675_25@ import-module,ui) # _COCOS_LIB_IMPORT_ANDROID_BEGIN@H_675_25@ # _COCOS_LIB_IMPORT_ANDROID_END@H_675_25@

到这里,接入就算完成了。我们可以使用COcos compile -p android 命令来编译Android平台,之前的操作如果稍有不慎,这里编译的过程中,也许会遇到一些错误,不过,看着啥错误,一一解决即可。

编译成功之后,在proj.android的bin目录下会生成一些apk文件,将HeroCocos-debug.apk拷贝到U8SDK打包工具目录下,替换原来的u8.apk
然后,运行package.bat,选择需要打包的渠道,然后就开始打包了,打包完成之后,在output目录下生成当前渠道SDK的渠道包,比如最终UC的包:



大佬总结

以上是大佬教程为你收集整理的U8SDK——Cocos2dx游戏快速渠道SDK接入全部内容,希望文章能够帮你解决U8SDK——Cocos2dx游戏快速渠道SDK接入所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。