最近cocos2d-x官网放出了plugin-x的官方指南,不过官网为了国际化,都是用英文写的,既然cocos2d-x的主要使用群体是中国人,而且是中国人主导的开发项目,为什么不考虑实际情况同步放出中文的指南呢?不得不说他们全英文的做法一下子就让B格提升了。下面开始正文
由于我的目的不是单纯地翻译官方的文章,所以请读者不要用原文翻译的标准来要求我,不喜勿看,欢迎来喷。
我的系统:mac osx Mountain Lion v10.8.2
cocos2d-x 2.1.3 路径为:/Users/yangdongbo/cocos2dx/cocos2d-x-2.1.3(下文用$COD_ROOT来代替)
原文地址:www.cocos2d-x.org/projects/cocos2d-x/wiki/Plugin-X_Integration_Guide_for_Android
系统要求
1.python 2.7 www.python.org/
2.Apache Ant build tool ant.apache.org/
3.如果你的系统是Windows,你还要已经安装好了Cygwin.
编译Plugin-X工程
1运行位于plugin/tools/publish.sh下的publish.sh脚本,(这个脚本的路径在我的电脑上和官方说的不太一样,官方说的是plugin-x/tools/publish.sh)据说这个脚本在Mac OSX Mountain Lion v10.8.2 和Cygwin on Windows 7上测试过运行良好.脚本运行之后会要求你填入一些环境变量的值,这些变量包括:
android-ndk path ,adnroid-sdk path, ant tool path,如果不清楚路径的可以用which来查找,例如在终端输入:which ant
来个截图会比较直观点:
初次运行这个脚本会要求你输入android-ndk,adnroid-sdk ant 的系统路径,然后就编译插件所需要的文件,如果是再次运行的话就不用再次输入这些环境变量,因为它会自动把你输入的这些值保存到一个叫cocos2d-x-2.1.3/plugin/tools/toolsForPublish/environment.sh的文件里面。请大家把我输入的值自觉替换成自己系统变量的值,完全照输是一定会出错的。我这个路径是linux风格的,如果你使用的是windows系统的话,你应该输入像这样的路径C:/adt-bundle-windows/sdk而不是 C:\adt-bundle-windows\sdk
2,等编译完成之后你会发现多了一个叫publish的文件夹出现在plugin文件夹下面,如图:
3.publish文件夹包括:
插件的头文件(*.h)
C++静态库(*.a)
android的makefiles(*.mk)
android 工程所需要的一些插件
想使用插件的话要先修改你的游戏工程
要做些什么操作呢?
游戏开发者的指导工具
我们有一个叫做gameDevGuide.sh的脚本,位于plugin/tools/gameDevGuide.sh。它会帮助你修改你的game project
1.在终端下运行这个脚本,然后它会弹出一个图形界面:
在输入框中输入你的android工程的路径,输入中不要带有空格,然后点'next'按钮
2,选择你所需要的插件,界面如下:
选择好插件之后,点击‘Finish'按钮。然后脚本会自动地修改你的工程的相关配置文件。下面的配置文件会被修改:
修改指导
1.修改ndk编译命令参数:增加publish文件夹参数到NDK_MODULE_PATH,可以这样写:
2.在JNI_Onload方法中加入代码,这样写:
1
2
3
4
5
6
7
8
9
|
#include "PluginJniHelper.h"
jint JNI_OnLoad(JavaVM *vm,
void
*reserved)
{
JniHelper::setJavaVM(vm);
PluginJniHelper::setJavaVM(vm);
// for plugins
return
JNI_VERSION_1_4;
}
|
3.当游戏的main activity创建的时候调用PluginWrapper.init()方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
org.cocos2dx.plugin.PluginWrapper;
import
org.cocos2dx.lib.Cocos2dxGLSurfaceView;
public
class
HelloIAP
extends
Cocos2dxActivity{
protected
void
onCreate(Bundle savedState){
super
.onCreate(savedState);
PluginWrapper.init(
this
);
// for plugins
// If you want your callback function can be invoked in GL thread, add this line:
PluginWrapper.setGLSurfaceView(Cocos2dxGLSurfaceView.getInstance());
}
static
{
System.loadLibrary(
"game"
);
}
}
|
4.个别特殊插件的修改
如果你的游戏用到下面的插件,那么你需要一些特殊的修改。
我们(官方)打算把这紫地修改加入到开发者指导工具中去。
1.在eclipse中导入91SDK_LibProject_completep这个工程,这个工程的路径在cocos2d-x-2.1.3/plugin/publish/plugins/nd91/android/DependProject
2.让你的工程依赖91SDK_LibProject_complete工程,如下图所示:
在你的C++代码中使用plugin-x插件
加载和卸载插件
所有的插件都是PluginManager这个类托管的,你可以用插件名加载或是卸载一个插件,代码例子:
1
2
3
4
5
6
7
|
// load plugin IAPNd91
s_pNd91 =
dynamic_cast
<IAPNd91*>
(PluginManager::getInstance()->loadPlugin(
"IAPNd91"
));
// unload plugin IAPNd91
PluginManager::getInstance()->unloadPlugin(
"IAPNd91"
);
s_pNd91 = NULL;
|
建议:在游戏开始的时候加载,在游戏结束的时候卸载
使用IAP插件
你可以调用插件的接口,在使用接口之前,你最好查看一下插件头文件的定义,代码例子:
1
2
3
4
|
// enable the debug mode
s_pNd91->setDebugMode(
true
);
// pay for the product
s_pNd91->payForProduct(info);
|
参考文件
1.plugin-x的HelloIAP工程中的代码
发现一个问题,当你运行gameDevGuide.sh脚本之后,它会删除jni文件夹下面Android.mk和Application.mk中的内容。这个做法本身是有问题的吧?官方并没有出来说明。但是经过我的试验和调试之后发现问题是因为mac os默认没有安装gawk这个命令,而上面说的工具中依赖于这个命令去对相关的配置文件操作。所以导致用一个空白的文件把原来的配置文件覆盖了,而原先的文件也没有备份。所以就产生了这种情况。只要安装了gawk这个工具就可以解决,我使用了如下命令来安装
port install gawk
如果你没有安装prot这个工具的话推荐你安装,具体的安装方法请自己搜索
2013-5-25我在使用官方的工具修改相应的工程配置的时候出现如下错误:
Traceback (most recent call last):
File "/Users/yangdongbo/cocos2dx/cocos2d-x-2.1.3/plugin/tools/toolsForGame/modifyProject.py", line 32, in <module>
tempText = locNode.text
AttributeError: 'NoneType' object has no attribute 'text'
估计这个错误的原因正如上面的出错信息所说,locNode没有一个名为text的属性,我确定了相关的文件.project里的内容是没有modifyProject.py里的32行开始那一段的要判断的内容之后我把它删除了,然后再执行就运行正常了。
好吧。下面遇到的问题就变成在eclipse里编译工程的时候出现的错误了:
Android NDK: /Users/yangdongbo/cocos2dx/cocos2d-x-2.1.3/test/proj.android/../../external/chipmunk/Android.mk: Cannot find module with tag 'protocols/android' in import path
jni/Android.mk:27: *** Android NDK: Aborting. . Stop.