针对Quickcocos2dx-Lua和V3.3R1学习笔记(十二)----使用CocosCodeIDE配合自带的PrebuiltRuntimeLua.apk进行真机调试这两个问题,本篇文章进行了详细
针对Quick cocos2dx-Lua和V3.3R1学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Cocos Code IDE执行效率太慢,Sublime+QuickXDev依然是最佳的cocos2d-x + Lua编辑器、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(一)、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(三)、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)等相关知识,希望可以帮助到你。
本文目录一览:- Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试
- Cocos Code IDE执行效率太慢,Sublime+QuickXDev依然是最佳的cocos2d-x + Lua编辑器
- Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(一)
- Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(三)
- Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)
Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试
cocos code ide出来很久,虽然用了各种问题,比如卡顿,比如打开库文件编码乱码什么的,但它的真机调试还是很不错的,比logcat少了很多不需要的信息,也少了调试的时候,还要打包的蛋疼东。
我们打开cocos code ide
确定,等待载入成功
出现一个让我们选择lua和quick路径,
我们填入路径
确定后,我们新建一个quick工程,写一个单点触摸,真机调试一下
我们在MainScene.lua一段代码
function MainScene:ctor() local sprite = display.newSprite("close.png") --自己随便找个图片资源吧 sprite:align(display.CENTER,display.cx,display.cy) sprite:addTo(self) sprite:setTouchEnabled(true) sprite:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE) sprite:addNodeEventListener(cc.NODE_TOUCH_EVENT,function (event) local x,y,prevX,prevY = event.x,event.y,event.prevX,event.prevY if event.name == "ended" then print("你正在使用cocos code ide 真机调试功能 ") end return true end) end
点击箭头指向的位置运行一下看看,是否能正常运行
然后点击右边的设置按钮,进行安卓真机调试设置
应用,调试
我们发现那个pc标志变成了手机标志,连上安卓设备,点击手机标志运行
我们会发现,PrebuiltRuntimeLua.apk打包进手机了,点击精灵测试
成功运行,是不是很方便,希望cocos code ide做的越来越好
Cocos Code IDE执行效率太慢,Sublime+QuickXDev依然是最佳的cocos2d-x + Lua编辑器
虽然cocos2d-x官方在不遗余力地推进Cocos Code IDE的发展,但基于Eclipse架构的它注定无论如何都不会像Sublime用起来那么爽,反应那么快,用Sublime写代码时敲击键盘就好像是用针在戳气球,每一下都能得到纳秒级的实时响应,你会觉得电脑是完全在你掌控之下的,那感觉非常爽。Sublime之所以流行这么多年,占据代码编辑器市场老大地位不可撼动,就是狠好地贯彻了“天下武功,唯快不破”的真理。用Sublime写代码就是快,就是爽,谁用谁知道。
而Cocos Code IDE呢?因为基于Java、基于Eclipse、又加入了太多的代码提示,总感觉写代码的时候有一种慢半拍的感觉,敲击键盘就好像是在拍皮球,总要等那么一下才行。这对于早年间一直在用vim、后来一直在用Sublime的的我来说,是完全不适应的。就好比一个骑了多年1000cc大排量摩托的人,突然转去开一辆百公里加速6.5秒的SUV,不管别人怎么说6.5秒的加速足够快了,对我来说就是慢,就是响应不行、操控不行、转向不行、各种不行。
于是果断转回Sublime来写cocos2d-x代码,Cocos Code IDE就只用来运行程序和调试,一个文件都不打开。这样有另外一个好处就是IDE里的日志窗口可以搞的狠大,不用担心侵占代码编辑器的空间,哈哈,因为根本就不用代码编辑器。
这样的方式狠爽,但是现在问题来了,挖掘机技术哪家……不对,是Sublime下写Lua哪个插件强?答案是4个,其中1个是系统自带。
1、Sublime自带的Lua。自动检查语法错误、常用语法snippet,这是必备插件:
2、FormatLua。使用Option+L快捷键自动格式化Lua代码,作者是中国人Deng,Lifeng,必须赞一个。FormatLua插件不太完善,也有多次格式化会让文件末尾的空行不断增长的小bug,但瑕不掩瑜,团队协作开发时还是狠有必要装一个的,毕竟谁都不喜欢看别人写出来的烂代码。
唯一问题是作者格式化出来的缩进是4个空格,我们团队喜欢用2个,所以要打开Sublime的插件目录,稍微改一下它的源代码文件~/Library/Application\ Support/Sublime\ Text\ 2/Packages/FormatLua/formatter.lua
,把4个空格改成2个就行了:
3、QuickXDev,这个插件要重点说。本来这个插件是quick-cocos2d-x做的,但是因为cocos2d-x + Lua并没有官方的插件,所以就只能凑合着用人家quick团队做的东西了。好在2.x版本的quick和3.x版本的cocos2d-x Lua API并没有狠大的差别,所以用起来没什么大问题。
唯一需要注意的是,QuickXDev最近升级了3.x版本,而3.x版本的quick在API方面的变动就太大了,变得几乎不能用作cocos2d-x + Lua的参考API了,所以安装QuickXDev插件后要去Sublime插件目录里把QuickXDev目录下的内容都删掉,手动下载QuickXDev 2.2.5版本的压缩包解压到QuickXDev目录下,强制只用2.x版本的插件才行
4、DashDoc。这个插件不仅限于写cocos2d-x + Lua,它用来在Sublime里Ctrl+H一键跳转至Dash文档。得益于Sublime的超快响应、Dash软件本身的高质量、以及Mac系统本身的狠好支持,Sublime和Dash之间的配合简直天衣无缝。比如你的光标目前在Sprite单词下,只要一按Ctrl+H,瞬间就会跳到Dash中的Sprite类文档中。
要让DashDoc支持cocos2d-x,需要小改一下它的配置文件,打开Sublime菜单,找到Lua的定义,把cocos2dx也写进去,就行了:
工欲善其事必先利其器,看一个程序员是不是把自己的电脑管理的狠好、平时使用的软件是什么品位的、是不是把自己的开发环境整理的井井有条、写代码的效率是不是最优化,也是侧面衡量这个程序员水平的重要参考。
BTW:虽然我主要用Sublime来写代码,但Cocos Code IDE和Dash两样依然缺一不可。Cocos Code IDE除了运行和调试,还能让我不看文档就学到一些API在Lua里的特殊写法,比如registerScriptHandler
这类跟C++不一样的API,虽然这类特殊的API不多,但第一次用的时候因为没经验就是不知道该怎么写,cocos2d-x的官方文档里也没说明(官方文档有多烂我就不说了),所以Cocos Code IDE对于新手是非常友好的,一旦度过了新手期,就可以考虑抛开转而去用Sublime了。Dash用来查cocos2d-x的C++ API,毕竟cocos2d-x是一个连background
和backGround
都不统一的奇葩框架,所以经常地查各种API是非常必要的。
Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(一)
在我们实际开发过程中,经常会遇到需要使用第三方SDK的情况。比如我们常用的:友盟,TalkingData之类的统计分析SDK;移动MM,电信爱游戏之类的计费SDK;个推,百度推送之类的推送SDK。诸如此类的在iOS平台也有一大堆。那么在使用Quick-Cocos2d-x的过程中怎么把它们接入到游戏中呢?我们这几篇文章就来介绍下。
- 引擎版本: Quick-Cocos2d-x 3.3
- 开发系统: Windows 7 64bit
目前接入方式
目前接入SDK的方式有很多种,我们这里只说下对Cocos2d-x常用的几种:
- 使用AnySDK来接入;
- 使用第三方SDK提供的Cocos2d-x版本来接入;
- 使用第三方SDK提供的Java或者OC版本。
AnySDK是Cocos2d-x官方提供的一套很完善的接入第三方SDK的工具。它接入简单、方便、快捷,而且支持众多的SDK,能够实现一键式的接入。官网请点击这里,另外它还有非常详尽的文档,请点击这里。如果是企业用户的话,推荐使用AnySDK,它本身已经支持了诸如斯凯、移动游戏基地、GooglePlay、91等渠道,也支持用户、支付、广告、分享、统计和推送的大量SDK。对于打包和加固也基本上是一次配置,全程通用了。因为企业渠道的打包往往是几十上百个包,如果使用AnySDK,在一次配置完成之后,每次都只需要轻轻一点就能够在旁边喝茶。这样无疑为企业节约了大量的开发时间和人力成本。
而对于个人或者小团队来说,往往支持的渠道有限,限于开发成本的原因,需要支持的SDK比较少,而且对包的限制也会比较大,这种时候使用2,3种方式相对来说显得更为经济和简单,并且也更为灵活和方便。难点在于需要自己编写集成代码。对于第2种方法,如果是使用C++语言的话来编写游戏的话使用会很方便,如果是使用Lua的话,需要自己写一层C++到Lua的封装。而目前很多的第三方SDK都提供了Cocos2d-x的版本。大部分时候我们都只需要下载一个第三方SDK的C++版本。然后简单的集成一下,就可以在C++代码中直接调用了。
但是又的情况下第三方SDK C++版本对接口的支持可能不如对原生平台版本(Java或者OC)支持的完善,那么这个时候我们更多的可能会使用原生平台版本,中间自己提供一层接口来供C++调用,这也就是我们这里的第3种方式。
接入示例
接下来我们以友盟为例来讲下怎么使用。AnySDK的讲解我们在这里先不讲,大家可以参考官方网站上的文档。
接入Cocos2d-x版本的友盟
首先我们来看下怎么接入友盟的Cocos2d-x版本。
-
注册账号
打开友盟官方网站:http://www.umeng.com/。注册账号并且申请一个应用,如果所示:
这里需要注意的是如果你是使用Cocos2d-x版本的话最好把那个“使用Cocos2dx插件”的选项勾上,避免产生不必要的错误。
信息填写完成后点击“提交并获取AppKey”,会显示一些创建出来的游戏的信息。
这里的信息就是我们需要在游戏里使用的appkey。
-
下载SDK
在账号注册完成后,我们打开友盟的SDK下载界面:http://dev.umeng.com/game_analytics/game-c2d/sdk-download,点击“SDK下载”,下载SDK到本地。
-
集成到C++里
-
Android
-
将libmobClickCpp文件夹复制到[COCOS2DX_ROOT]/external目录下,并且将mobclickcpphelper.jar复制到Android工程的libs目录中,
-
改你的工程Android.mk文件在LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static后添加LOCAL_WHOLE_STATIC_LIBRARIES += mobclickcpp_static,在$(call import-module,cocos2dx)后添加$(call import-module,libmobClickCpp)。如果你的工程没有使用libcurl库,还要在相应位置添加$(call import-module,cocos2dx/platform/third_party/android/prebuilt/libcurl)(cocos2d-x 3.0以上请替换为$(call import-module,curl/prebuilt/android))和LOCAL_WHOLE_STATIC_LIBRARIES += cocos_curl_static
- 添加权限
在AndroidMainfest.xml文件中添加以下权限
1234<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE"
></uses-permission>
<uses-permission android:name=
"android.permission.INTERNET"
></uses-permission>
<uses-permission android:name=
"android.permission.READ_PHONE_STATE"
></uses-permission>
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
></uses-permission>
- 添加Java代码
1MobClickCppHelper.init(
this
);
- 在游戏主main.cpp中加入如下代码:
4567891011#include "MobClickJniHelper.h"
...
extern
"C"
{
jint JNI_OnLoad(JavaVM *vm,
void
*reserved)
{
JniHelper::setJavaVM(vm);
umeng::MobClickJniHelper::setJavaVM(vm);
return
JNI_VERSION_1_4;
}
}
-
-
iOS
iOS的集成就简单很多了。
-
所需文件: libmobClickCpp.a(请查看C++ Standard Library的设置,xcode默认的Compiler Default是libstdc++,如果您的项目正在使用libc++编译请使用libmobClickCppWithLibCpp.a) MobClickCpp.h
- 请在你的工程目录结构中,右键选择Add->Existing Files…,选择这两个文件。或者将这两个文件拖入XCode工程目录结构中,在弹出的界面中勾选copy items into destination group's folder(if needed),并确保Add To Targets勾选相应的target。 如果你的工程没有使用libcurl库,还要把[COCOS2DX_ROOT]/external/curl/prebuilt/ios/libcurl.a)按照上面的方法加入到工程中。
-
集成到这里就算搞定了,接下来的就是使用了。使用的话可以直接参考官方的api文档。
-
好了,我们先说到这里,后面的章节我们将会将怎么把C++接口转成Lua接口,和怎么在Lua中直接调用Java版本的友盟。
Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(三)
在第一篇和第二篇文章中,我们介绍了,怎么集成友盟的Cocos2d-x版本SDK并且在Lua中使用。下面我们来看下怎样在Quick-Cocos2d-x中使用Java版本的友盟SDK。
引擎版本: Quick-Cocos2d-x 3.3 开发系统: Windows 7 64bit
集成友盟Java版本的SDK
我们要集成SDK,首先要从官网下载,点击打开官网,点击“SDK下载”按钮,将下载的SDK保存到本地。
打开工程的AndroidMainfest.xml文件,在标签内写入
1
2
|
<Meta-data android:value=
"5546df1a67e58eaf730008b7"
android:name=
"UMENG_APPKEY"
></Meta-data>
<Meta-data android:value=
"TestChannel"
android:name=
"UMENG_CHANNEL"
/>
|
上面两个参数是友盟的AppKey和渠道号,AppKey是我们在后台申请App时生成的,渠道号自己定义。
接着在外写入
<uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE"
></uses-permission>
<uses-permission android:name=
"android.permission.INTERNET"
></uses-permission>
<uses-permission android:name=
"android.permission.READ_PHONE_STATE"
></uses-permission>
<uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE"
></uses-permission>
|
解压下载回来的包,将里面的libs文件夹合并到android工程下的libs文件夹中。
接下来,打开AppActivity.java文件,在onCreate中加入:
UMGameAgent.setDebugMode(
true
);
//设置输出运行时日志
UMGameAgent.init(
this
);
|
在onResume()中加入:
UMGameAgent.onResume(
this
);
|
在onPause()中加入:
UMGameAgent.onPause(
this
);
LuaJavaBridge
为了我们在Lua中调用Java的接口,Quick-Cocos2d-x里面提供了一套名为LuaJavaBridge的中间件。它能够让我们非常方便的在Lua中调用静态的Java接口。
LuaJavaBridge在Lua中使用的接口为
luaj.callStaticmethod(className,methodName,args,sig)
这个函数有4个参数,它们的意义分别为:
参数 | 意义 |
---|---|
className | 类名 |
methodName | 方法名 |
args | 参数表 |
sig | 签名 |
- 类名参数是我们使用的静态方法所在的类名;
- 方法名是我们要是用的方法的名称;
- 参数表示我们要传入的参数,这个值是一个lua的table,它传入的内容必须和sig中的类型一致;
- 签名是我们要调用的函数的Java参数信息表。
所谓签名,就是指 Java 方法的参数类型和返回类型定义。关于 Java 方法签名的具体定义,可以参考:JNI Type Signatures。
由于签名写起来有点啰嗦,所以 luaj 可以根据调用参数自动猜测方法签名。注意 Lua function 是以整数的形式传入 Java 方法,所以 Java 方法的如果需要传入Lua function的话形参是 int 类型)。
但是 Lua 里没有办法准确判断一个数值是整数还是浮点数,所以 luaj 在猜测方法签名时,假定所有的数值都是浮点数。如果遇到这种情况的话就需要指定签名了。
通过LuaJavaBridge调用友盟
上面的描述有点不好理解,我们拿友盟作为例子来看下。
用EClipse打开我们刚才使用的android工程。
为了方便调用友盟的接口,我们新建一个类,取名为UMSDK。复制如下内容:
package org.cocos2dx.lua;
import org.cocos2dx.lib.Cocos2dxActivity;
import com.umeng.analytics.game.UMGameAgent;
public
class
UMSDK {
private
static
Cocos2dxActivity mContext = null;
static
void
init(Cocos2dxActivity activity){
mContext = activity;
}
void
startLevel(final String level){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.startLevel(level);
}
});
}
//关卡失败
void
failLevel(final String level){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.failLevel(level);
}
});
}
//过关
void
finishLevel(final String level){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.finishLevel(level);
}
});
}
//关卡失败
void
pay(final
float
money,final
float
coin,final
int
source){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.pay(money,coin,source);
}
});
}
final
int
number,final
int
source){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.pay(money,item,number,source);
}
});
}
void
buy(final String item,final
int
number,final
float
price){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.buy(item,price);
}
});
}
void
use(final String item,final
float
price){
mContext.runOnGLThread(
new
Runnable() {
@Override
void
run() {
// Todo Auto-generated method stub
UMGameAgent.buy(item,price);
}
});
}
}
|
我们在Java文件中封装了友盟几个常用的接口。这些接口基本上都是游戏中要用到的,写好上面的类之后,在AppActivity的onCreate中加入
UMSDK.init(
接下来,我们转回到Lua层来调用我们刚刚封装好的Java层的接口。先把原来友盟的接口全都去掉。
新建一个Analytics.lua文件,写入以下内容:
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
--
-- Author: wangshuai
-- Date: 2015-05-05 14:56:41
--
local Analytics =
class
(
"Analytics"
)
function Analytics.startLevel(level)
local args = {
toslevel or
"1"
,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"startLevel"
,args)
end
end
function Analytics.failLevel(level)
local args = {
level or
"1"
,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"failLevel"
,args)
end
end
function Analytics.finishLevel(level)
local args = {
level or
"1"
,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"finishLevel"
,args)
end
end
function Analytics.payCoin(params)
local args = {
params.money or 0.0,
params.coin or 0.0,
params.source or 1,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"pay"
,
"(FFI)V"
)
end
end
function Analytics.payItem(params)
local args = {
params.money or 0.0,
params.item or
"null"
,
params.number or 1,
params.coin or 0.0,
params.source or 1,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"(FLjava/lang/String;IFI)V"
)
end
end
function Analytics.buy(params)
local args = {
params.item or
"null"
,
params.number or 1,
params.coin or 1,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"buy"
,
"(Ljava/lang/String;IF)V"
)
end
end
function Analytics.use(params)
local args = {
params.item or
"null"
,
params.number or 1,
params.coin or 1,
}
if
device.platform ==
"android"
then
-- Java 类的名称
local className =
"com/cocos2dx/demos/umeng/UMSDK"
-- 调用 Java 方法
luaj.callStaticmethod(className,
"use"
,
"(Ljava/lang/String;IF)V"
)
end
end
return
Analytics
|
上面的就是我们在Lua中调用Java中编写的函数,args是传给Java接口的参数,className是要调用的类的名称。组织好之后就可以调用luaj.callStaticmethod调用Java接口了。
关于LuaJavaBridge的详细介绍可以参考廖大的这篇文章
好了,关于第三方SDK的集成就暂时介绍到这里,有什么问题或者不足的地方欢迎大家指出。
Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)
在上一篇文章中,我们介绍了,怎么集成友盟的Cocos2d-x版本SDK,接下来我们来说下怎么将友盟的C++接口导出到Lua中使用。
引擎版本: Quick-Cocos2d-x 3.3 开发系统: Windows 7 64bit
编写.tolua文件
我们打开libmobClickCpp\include文件夹可以看到里面有两个文件,分别是:
1
2
|
MobClickCpp.h
MobClickJniHelper.h
|
打开这两个文件看他们的内容可以发现,MobClickJniHelper.h的内容中只有一个
static
void
setJavaVM(JavaVM *javaVM);
|
而在MobClickCpp.h中包含了我们基本上能使用的所有的umeng的接口,所以我们需要导出的接口其实就是MobClickCpp中的接口。
新建一个MobClickLua.tolua文件,将下面的内容复制进去,我们再来详细分析下:
$#include
"MobClickCpp.h"
$
using
namespace
umeng;
class
MobClickCpp {
public
:
void
setLogEnabled(
bool
value);
void
setProxy(
const
char
* host,
int
port);
void
setSessionIdleLimit(
int
seconds);
void
startWithAppkey(
const
char
* appKey,
const
char
* channelId = NULL);
void
end();
void
mainloop(
float
dt);
void
event(
const
char
* eventId,153)!important; background:none!important">const
char
* label = NULL);
void
beginLogPageView(
const
char
*pageName);
void
endLogPageView(
const
char
*pageName);
void
setUserLevel(
const
char
*level);
enum
Sex{
Unkonwn = 0,
Male = 1,
Female = 2,
};
void
setUserInfo(
const
char
* userId,Sex sex,
int
age,153)!important; background:none!important">const
char
* platform);
void
startLevel(
const
char
* level);
void
finishLevel(
const
char
* level);
void
failLevel(
const
char
* level);
void
pay(
double
cash,
int
source,
double
coin);
const
char
* item,
int
amount,
double
price);
void
buy(
const
char
*item,
double
price);
void
use(
double
price);
void
bonus(
double
coin,
int
source);
void
bonus(
double
price,
int
source);
};
|
我们可以看到上面的内容基本上都是MobClickCpp.h文件中的接口。我们现在来详细说下这几个部分的意思。
第一部分的代码是:
$#include
"MobClickCpp.h"
这里的代码是引用代码,需要包含的头文件可以填到这里。
第二部分是这一句:
$
namespace
umeng;
我们打开MobClickCpp.h的内容可以看到里面定义了一个命名空间为
namespace
umeng{
}
|
为了能在转出来的.cpp文件中使用umeng的接口,我们需要把命名空间引用过去。所以这里加了这一句话方便在.cpp文件中使用umeng命名空间。
第三部分就是我们具体的类的定义了,这里最好是直接拷贝.h文件中的类的声明。当然,你想自己定义一个类来作为中间层,也可以声明为自定义的层。这个时候记得要修改第一部分和第二部分的代码。
将.tolua文件转为luabinding c++代码
在Quick-Cocos2d-x 3.3中自带了tolua++工具,位置在[QUICK_V3_ROOT]/quick/bin下面的win32或者是mac下,我们最好将它们都添加到系统的PATH环境变量中,方便下次使用。
在命令行下直接输入:
tolua++
可以看到tolua++的帮助信息
usage: tolua++ [options] input_file
Command line options are:
-v : print version information.
-o file : set output file;
default
is stdout.
-H file : create include file.
-n name : set package name;
default
is input file root name.
-p : parse only.
-P : parse and print structure information (
for
debug).
-S : disable support
for
c++ strings.
-1 : substract 1 to operator[] index (
for
compatibility with tolua5).
-L file : run lua file (with dofile()) before doing anything.
-D : disable automatic exporting of destructors
for
classes that have
constructors (
for
compatibility with tolua5)
-W : disable warnings
for
unsupported features (
for
compatibility
with tolua5)
-C : disable cleanup of included lua code (
for
easier debugging)
-E value[=value] : add extra values to the luastate
-t : export a list of types asociates with the C++
typeid
name
-q : don't print warnings to the console
-h : print
this
message.
Should the input file be omitted,stdin is assumed;
in that
case
,the package name must be explicitly set.
aaaaaa
|
了解上面这些信息后,我们执行命令:
tolua++ -o lua_binding_MobClickCpp.cpp -H lua_binding_MobClickCpp.h MobClickCpp.tolua
|
执行完成后将会生成两个文件:
lua_binding_MobClickCpp.cpp
lua_binding_MobClickCpp.h
生成的两个文件就是我们将.tolua的描述信息转为lua_binding的接口之后的.cpp和.h文件,这两个文件既可以放到引擎的目录下也可以放到工程目录下,这里为了描述方面我就把它们放到工程目录下了。
添加C++代码到工程中
拷贝上面的两个文件到工程下的umeng\frameworks\runtime-src\Classes
目录,然后打开proj.android_no_anysdk\jni下的Android.mk文件,给LOCAL_SRC_FILES
加上../../Classes/lua_binding_MobClickCpp.cpp \
,加上之后的LOCAL_SRC_FILES
内容如下:
LOCAL_SRC_FILES := hellolua/main.cpp \
../../Classes/VisibleRect.cpp \
../../Classes/AppDelegate.cpp \
../../Classes/ConfigParser.cpp \
../../Classes/lua_binding_MobClickCpp.cpp \
|
添加Java代码(仅限Android)
打开proj.android工程中的AppActivity.java文件,在函数onCreate
中添加下面的语句:
MobClickCppHelper.init(
this
);
添加C++代码
打开AppDelegate.cpp文件,添加头文件
#include "MobClickCpp.h"
#include "lua_binding_MobClickCpp.h"
然后再在函数bool AppDelegate::applicationDidFinishLaunching()
中添加以下代码:
tolua_MobClickCpp_open(L);
注意上面这一句添加的位置必须要在获取到lua_State之后。
接着分别在AppDelegate::applicationDidEnterBackground
和AppDelegate::applicationWillEnterForeground
中分别添加
umeng::MobClickCpp::applicationDidEnterBackground();
和
umeng::MobClickCpp::applicationWillEnterForeground();
改完C++代码后,build_native
编译C++代码。稍等片刻,我们等待C++编译完。
在Lua代码中使用umeng
我们打开Quick-Cocos2d-x工程中的MyApp.lua代码文件,修改function MyApp:run()
的内容为:
function MyApp:run()
cc.FileUtils:getInstance():addSearchPath(
"res/"
)
self:enterScene(
"MainScene"
)
MobClickCpp:startWithAppkey(
"5539bb6767e58e62eb000288"
,
"GooglePlay"
)
end
|
这里的5539bb6767e58e62eb000288
是我们在umeng官网上创建APP的时候所给的AppKey。GooglePlay
为我们所使用的渠道。
打开Eclipse,在手机上运行工程,我们可以在后台看到umeng的数据
打开应用的详细页面,点击渠道分析,里面有一个渠道列表的子选项,点击之后我们可以看到我们上传的渠道用户数量:
好了,友盟的C++版本在Lua的使用就介绍到这里,其他umeng的接口大家可以看下MobClickCpp.h文件中查看接口说明。
下一篇我们看在Lua里直接使用Java版本的umeng接口。
关于Quick cocos2dx-Lua和V3.3R1学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Cocos Code IDE执行效率太慢,Sublime+QuickXDev依然是最佳的cocos2d-x + Lua编辑器、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(一)、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(三)、Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(二)的相关信息,请在本站寻找。
本文标签: