本平台仅支持上架对游戏体验有助益的良性辅助或绿色插件,恶意破坏游戏平衡和体验的插件将不予通过审核。
看到此文档的时候,说明您已经是或潜在是《会玩》插件开发者。公开版《会玩》,是不支持在手机上开发及调试插件的,您需要安装开发版《会玩》(附件1.tools/GameBox.apk)。
安装完开发版《会玩》后,您将可以在《会玩》的“关于我们”页面上看到《会玩》的版本信息,与公开《会玩》相比,开发版《会玩》会在版本信息里面显示“Dev”字眼(图1. . . 显示全部
看到此文档的时候,说明您已经是或潜在是《会玩》插件开发者。公开版《会玩》,是不支持在手机上开发及调试插件的,您需要安装开发版《会玩》(附件1.tools/GameBox.apk)。
安装完开发版《会玩》后,您将可以在《会玩》的“关于我们”页面上看到《会玩》的版本信息,与公开《会玩》相比,开发版《会玩》会在版本信息里面显示“Dev”字眼(图1. . .
但此时,您的设备仍在“锁定”状态,您仍不能在您的手机上开发及调试插件。您需要对您的设备进行“解锁”。
在《会玩》的“更多”版面里,您将看到“申请解锁设备”按钮(图2)。点击进去,输入您的联系方式(建议使用QQ邮箱), 然后点击“提交申请”按钮(图3)。接着,请您耐心等待,我方工作人员会在1-2个工作日内对您的信息 进行审核。
审核通过后,我们将为您的设备专门编译一份针对您的设备解锁的开发版《会玩》。使用该版本《会玩》,您就可以 在您的手机上开发和调试插件了。(但请注意:您不能更换手机、不能更换登录的QQ帐号,否则解锁机制将失效, 直到切换回原手机、原QQ号为止)。
现阶段,插件是一个zip包,由一个so(必选)、一个内含classes.dex文件的jar包(可选)、若干个资源文件(可选)组成。
其中,so文件是该插件的主逻辑模块,需实现插件平台指定的接口ITPGBoxPlugin并导出InitPlugin函数(后文将详细描述);jar包是插件的悬浮UI界;资源文件会由插件平台框架负责释放放手机硬盘供插件自己使用。
附件例子见examples目录。
插件由游戏主动加载,目前,我们仅开放了《天天酷跑》和《王者荣耀》两个游戏的插件加载功能。请下载并安装 最新版《天天酷跑》或《王者荣耀》然后在《会玩》中根据提示完成插件系统初始化工作。
只有从《会玩》中开启游戏,游戏才会加载插件。在开启游戏后,游戏将在第一时间把需要同步的文件同步到游戏 目录下。文件同步完毕后,游戏将逐个dlopen每一个插件so,并调用该so实现的InitPlugin函数。对于插件的UI界面, 则由游戏的插件加载器通过询问插件so实现的ITPGBoxPlugin接口获知需要加载的jar包名称、类名和初始化方法,然后 进行加载(信息不全时不加载)。
开发插件,需要实现插件平台指定的接口。为了方便开发,我们提供了一个代码生成器(附件2)。解压tools/gen_ plugin_src.zip,将看到template文件夹和gen_src.py脚本,template是最简插件模版,不要动,我们只需关注 gen_src.py文件。使用gen_src.py,可以轻松生成一个标准的空插件:
编辑gen_src.py,找到调用run函数的地方,修改第一个参数,改为您的插件的命名空间,比如”crazy.plane”,修改第二个参数,改为您的插件的中文名比如“疯狂战机”。然后运行gen_src.py脚本。接着,您将得到一个叫crazy. plane的文件夹。打开crazy.plane文件夹,其中,.java文件是插件的UI代码,build_ui.py是编译插件UI jar包的脚本, .cpp文件是插件so代码,Android.mk是cpp文件的工程文件(请根据实际情况进行更改)。
运行build_ui.py(请根据自己机子上的Android SDK及Android NDK配置进行适配),将得到out文件夹,out文件夹中的jar包,就是插件UI jar包。
运行build_so.py(请根据自己机子上的Android SDK及Android NDK配置进行适配),将得到libs文件夹。往里找,将得到插件so文件。
最后,手工将插件jar包和so文件打包成zip文件,该zip文件即为标准插件。
之后,您可以选择直接运行auto_build.py脚本,效果和手工打包一样:在手机上创建/sdcard/sdk目录, 保证手机和电脑间adb连接正常。然后运行auto_build.py脚本,auto_build.py将负责您的插件的编译及打包, 并通过手机usb数据线将插件传到手机上。然后,您在《会玩》中的“插件”界面或“MOD”界面上开启游戏。 进入游戏后,游戏将把您编写的插件加载起来。
插件的so代码实现的InitPlugin函数,即为插件的main函数。请注意:插件框架是以阻塞的形式加载插件的,所以,实现插件InitPlugin函数时,请勿长时间阻塞,如需阻塞,请开线程处理。
对于插件的UI,我们不为之提供main函数,但是,当用户在游戏中点击插件APP悬浮图标, 并选中具体插件的时候,我们将调用对应插件的“主类”的“show”方法。如何识别主类? ——插件so代码实现的ITPGBoxPlugin中的GetPluginUIDexMainDlgClsName方法,返回的就是主类的名称。同时需注意:主类必须实现“show”方法 (可参考生成的代码)。
插件so代码实现的ITPGBoxPlugin接口的GetPluginDexName函数,返回NULL即可。
需要使用纯java进行界面开发,为了简便开发,我们在代码生成器中封装了常用控件的生成(一行代码搞定“开关”、“滑动条”的界面生成), 见代码生成器的WpeMainDialog.java文件的doGetDlgView函数,见《插件UI编写指南.doc》
使用插件模版生成的插件源码,java端将有一个叫“XXX”UIMgr的类,内有sendCmd函数, native端则有一个“XXX”plugin_imp.cpp的文件,内有HandlePluginCmd方法。您可以在插件UI中调用该sendCmd方法, 传入的字符串将被托传到native端的HandlePluginCmd方法中进行处理。而Native端代码,则可以通过ITPGBoxPluginHost2 的SendMsg2UI(同步,只能在Native端处理UI发送过来的命令的函数里使用)及SendMsg2UIAsync(异步,随时可用)和UI界面进行交互。
我们为MOD开发了一个专用的加载过程,为了用户体验,我们不能让用户在进游戏的过程中感觉到阻塞(或者说, 实在没办法的时候,要让阻塞的过程越短越好)。对于酷跑这个MOD,它的资源支持从SD卡上加载,所以,我们把释放 资源的过程放到我们的插件APP中,在启动游戏前,由插件APP负责调用MOD的PreInit函数。PreInit函数在使用我们最 新的插件框架代码生成器(gen_src.py)的时候,会默认生成好,是一个空的函数,我们只需往这个函数里,填入我们的 资源释放代码就可以。当然,我们也可以在这个函数中对MOD的资源进行校验,校验成功的话,返回0,并往ticket填入 一些标识,否则返回-1。进入游戏后,插件加载框架会在第一时间加载MOD的so,调用InitPlugin函数,并把之前的ticket 作为参数传入给InitPlugin函数。
编辑您的插件源码的debug_plugin.ini,可将插件类型指定为MOD。
传给我们的官方人员,会有我们的官方人员对您的插件进行审核,如果审核通过,您的插件就可以在《会玩》平台上上架了。接着,外网玩家就可以在《会玩》APP中下载并使用您的插件了。
(详见上传插件)
收起《会玩》支持在游戏中加载一个或多个插件。每个插件都可以有自己的界面。《会玩》会通过“菜单”的方式将各个插件整合在一起。
用户经《会玩》进入游戏后,用户将看到游戏界面上显示的《会玩》悬浮图标(如图1),点击《会玩》悬浮图标后,以下是几个典型的界面整合场景. . . 显示全部
《会玩》支持在游戏中加载一个或多个插件。每个插件都可以有自己的界面。《会玩》会通过“菜单”的方式将各个插件整合在一起。
用户经《会玩》进入游戏后,用户将看到游戏界面上显示的《会玩》悬浮图标(如图1),点击《会玩》悬浮图标后,以下是几个典型的界面整合场景:
a.当用户只开启了一个插件的时候,比如玩家只开启了一个叫“fps”的插件,《会玩》会直接显示该插件的主界面(如图2)。
b.当用户同时又开启了一个叫“UIDemo”的插件后,《会玩》显示的是一个菜单,第一项显示“UIDemo”、第二项显示“fps”(如图3)。然后,用户点击具体插件后,显示的才是这个插件的主界面。
c.在用户点击《会玩》悬浮图标后,悬浮图标将消失,不会再出现, 为了保证用户在操作完具体插件界面后悬浮图标能够重新出现,则插件必须保证在自己的界面被关闭后显示调用《会玩》框架提供的“showIcon”函数, 用于将悬浮图标重新显示出来(实际情况是我们把这部分操作在代码生成器生成的代码 中完成了,见WpeUIMgr.java的removeDialog函数)。
d.有这么一个场景:插件在一次点击悬浮图标后,进入了某种操作状态(比如“UIDemo”,在进行“初值搜索”后), (见图4、图5), 并且期望在这种操作状态未完成前,在用户再次点击悬浮图标后,能够继续进入到该插件进行界面操作 (比如“UIDemo”,此时希望能够进入“数值过滤”界面,以便保证用户操作流畅),(见图6)。 这时候,插件可以调用《会玩》框架提供的acquireControl函数来完成此动作。待该中操作状态完成后 (比如“UIDemo”,用户成功完成了一轮完整的搜索及内存编辑后),插件再调用《会玩》框架提供的releaseControl函数, 声明这种状态已结束,那么,下次用户再重新点击《会玩》悬浮图标时,《会玩》将重新显示插件列表。
e.还有这么一个场景:插件在自己的界面被关闭后,希望《会玩》不显示悬浮图标,而是重新显示“主菜单”,那这时候插件可以调用《会玩》框架提供的showMainMenu函数来完成此动作。
总之,为了更好的用户体验,插件开发者请务必熟练运用《会玩》框架提供的UI协调函数,对自己的插件界面反复琢磨,确保插件界面美观、和谐、易用。
为了简便开发,请务必使用我们提供的插件框架代码生成器生成插件框架。框架代码中,WpeUIMgr.java的show函数, 即为插件界面的主入口。在用户点击《会玩》的悬浮图标时,show方法会被调用。这时候,插件就可以在show函数 里显示自己的界面了。比如加载WpeMainDialog,这是一个对话框,上面有两三个设置控件,有“确定”和“取消”两个 按钮。点击WpeMainDialog上面的开关,会触发onSwitchClicked回调,拖动WpeMainDialog上面的滑动条,会触发 onSlided回调。回调函数的第一个参数pos,表示用户选中的是哪一行的控件。然后,我们就可以在回调函数,或者在用户 点击“确定”按钮后,发送命令给Native端的代码进行处理了(在Native端,我们几乎可以做任何事情)。
a.showIcon —— 用于告诉《会玩》框架显示悬浮图标
b.showMainMenu —— 用于告诉《会玩》框架显示插件主菜单(只有一个插件时不做任何操作)
c.sendCmd —— 发送命令给Native端代码,触发Native端继承了ITPGBoxPlugin接口的HandlePluginCmd函数
d.acquireControl —— 请求下次用户点击《会玩》悬浮图标时,显示的不是插件主菜单,而是发起请求的插件的界面
e.releaseControl —— 告诉《会玩》,acquireControl模式结束,下次用户点击《会玩》悬浮图标时,显示的是插件
主菜单,而不是发起请求的插件的界面
a. 开关 —— 请见WpeMainDialog.java的第36、37行,用于在WpeMainDialog对话框上添加一个“开关”控件。 用户点击开关后,将触发onSwitchClicked回调。
b. 拖动条 —— 请见WpeMainDialog.java的第38行,用于在WpeMainDialog对话框上添加一个“拖动条”控件。用户拖动“拖动条”后,将触发onSlided回调
c. 自定义UI,如显示一个文本框,显示一个键盘 —— 见WpeMainDialog.java的第42行, 可尝试打开注释后看看效果更多复杂的UI界面,可按照Android界面开发标准进行编写(不支持xml,需使用纯java代码编写)。为此, 我们提供了一个叫《UI Demo》的开源插件,演示如何编写复杂UI界面。
a. 《fps》(附件3,UI开关及全局悬浮窗例子)
b. 《UIDemo》(附件4,相对复杂的UI界面编写例子)
收起会玩插件开发工具包.zip(Android版)下载
包含以下内容:
附件1:开发版App安装包,路径(tools/GameBox.apk)
附件2:代码生成器,路径(tools/gen_plugin_src.zip)
附件3:开源代码《fps》,路径(examples/fps.zip)
附件4:开源代码《UIDemo》,路径(examples/ui_demo.zip)