GVKun编程网logo

Quick cocos2dx-Lua(V3.3R1)学习笔记(十二)----使用Cocos Code IDE 配合自带的PrebuiltRuntimeLua.apk进行真机调试

11

针对Quickcocos2dx-Lua和V3.3R1学习笔记(十二)----使用CocosCodeIDE配合自带的PrebuiltRuntimeLua.apk进行真机调试这两个问题,本篇文章进行了详细

针对Quick cocos2dx-LuaV3.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进行真机调试

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编辑器

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是一个连backgroundbackGround都不统一的奇葩框架,所以经常地查各种API是非常必要的。

Cocos2d-Lua(Quick-Cocos2d-x)集成第三方SDK(一)

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常用的几种:

  1. 使用AnySDK来接入;
  2. 使用第三方SDK提供的Cocos2d-x版本来接入;
  3. 使用第三方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版本。

  1. 注册账号

    打开友盟官方网站:http://www.umeng.com/。注册账号并且申请一个应用,如果所示:

    这里需要注意的是如果你是使用Cocos2d-x版本的话最好把那个“使用Cocos2dx插件”的选项勾上,避免产生不必要的错误。

    信息填写完成后点击“提交并获取AppKey”,会显示一些创建出来的游戏的信息。

    这里的信息就是我们需要在游戏里使用的appkey。

  2. 下载SDK

    在账号注册完成后,我们打开友盟的SDK下载界面:http://dev.umeng.com/game_analytics/game-c2d/sdk-download,点击“SDK下载”,下载SDK到本地。

  3. 集成到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文件中添加以下权限

      1
      2
      3
      4
      <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代码
      1
      MobClickCppHelper.init( this );
      • 在游戏主main.cpp中加入如下代码:
      4
      5
      6
      7
      8
      9
      10
      11
      #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-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时生成的,渠道号自己定义。

接着在外写入

2
3
4
<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中加入:

2
UMGameAgent.setDebugMode( true ); //设置输出运行时日志
UMGameAgent.init( this );

在onResume()中加入:

1
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。复制如下内容:

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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);
}
});
}
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:inherit!important; color:rgb(0,final String item,
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-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的内容中只有一个

1
static void setJavaVM(JavaVM *javaVM);

而在MobClickCpp.h中包含了我们基本上能使用的所有的umeng的接口,所以我们需要导出的接口其实就是MobClickCpp中的接口。

新建一个MobClickLua.tolua文件,将下面的内容复制进去,我们再来详细分析下:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$#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( ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:inherit!important; color:rgb(0, double price);
void bonus( double coin, int source);
void bonus( ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:inherit!important; color:rgb(0, double price, int source);
};

我们可以看到上面的内容基本上都是MobClickCpp.h文件中的接口。我们现在来详细说下这几个部分的意思。

第一部分的代码是:

$#include "MobClickCpp.h"

这里的代码是引用代码,需要包含的头文件可以填到这里。

第二部分是这一句:

$ namespace umeng;

我们打开MobClickCpp.h的内容可以看到里面定义了一个命名空间为

3
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++的帮助信息

25
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&#039;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

了解上面这些信息后,我们执行命令:

1
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内容如下:

5
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::applicationDidEnterBackgroundAppDelegate::applicationWillEnterForeground中分别添加

umeng::MobClickCpp::applicationDidEnterBackground();

umeng::MobClickCpp::applicationWillEnterForeground();

改完C++代码后,build_native编译C++代码。稍等片刻,我们等待C++编译完。

在Lua代码中使用umeng

我们打开Quick-Cocos2d-x工程中的MyApp.lua代码文件,修改function MyApp:run()的内容为:

7
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-LuaV3.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(二)的相关信息,请在本站寻找。

本文标签: