cocos2dx tolua传递参数分析

cocos2dx tolua传递参数分析:
tolua_Cocos2d_CCNode_addChild00  == void CCNode::addChild(CCNode *child)
tolua_Cocos2d_CCNode_addChild01  == void CCNode::addChild(CCNode *child, int zOrder)
tolua_Cocos2d_CCNode_addChild02  == void CCNode::addChild(CCNode *child, int zOrder, int tag)

上面是使用tolua把C++转到lua。上面三个分别相应不同的參数个数。

我们这里分析一下最后一个:
/* method: addChild of class  CCNode */
#ifndef TOLUA_DISABLE_tolua_Cocos2d_CCNode_addChild02
static int tolua_Cocos2d_CCNode_addChild02(lua_State* tolua_S)
{
 tolua_Error tolua_err;
 //这里推断參数是否合法,仅仅能推断參数类型是否合法。假设參数类型检查不通过,就会报错
 if (
     !tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||
     !tolua_isusertype(tolua_S,2,"CCNode",0,&tolua_err) ||
     !tolua_isnumber(tolua_S,3,0,&tolua_err) ||
     !tolua_isnumber(tolua_S,4,0,&tolua_err) ||
     !tolua_isnoobj(tolua_S,5,&tolua_err)
 )
  goto tolua_lerror;
 else
 {
  //比如:middleBg:addChild(testSprite, Z_ORDER_1, 200)
  //我们传递进来的參数和以下的一一相应
  //这里能够清楚的看到传入參数的次序,第一是middleBg ...
  CCNode* self = (CCNode*)  tolua_tousertype(tolua_S,1,0);    --  middleBg   -- 1
  CCNode* child = ((CCNode*)  tolua_tousertype(tolua_S,2,0)); --  testSprite -- 2
  int zOrder = ((int)  tolua_tonumber(tolua_S,3,0));          --  Z_ORDER_1  -- 3
  int tag = ((int)  tolua_tonumber(tolua_S,4,0));             --  200        -- 4
#ifndef TOLUA_RELEASE
  if (!self) tolua_error(tolua_S,"invalid 'self' in function 'addChild'", NULL);
#endif
  {
   //这里就把testSprite加到了middleBg
   self->addChild(child,zOrder,tag);
  }
 }
 return 0;
tolua_lerror:
 return tolua_Cocos2d_CCNode_addChild01(tolua_S);
}
#endif //#ifndef TOLUA_DISABLE

样例:
//middleBg:addChild(testSprite, Z_ORDER_1, 200) 在传递參数中,我们没有对Z_ORDER_1赋值,即为nil,则就
//出现了以下的错误。看下这里argument #3 ,表明是第三个參数错误,而这里我们明明是第二个參数。看下上面的分析
//我想大家应该明确了。通过这样的方法,我们以后查找这类问题。就会方便非常多。

03-31 10:09:50.499: D/cocos2d-x debug info(3169): LUA ERROR: [string "xxxxxxxxxxxxx..."]:171: error in function 'addChild'.
03-31 10:09:50.499: D/cocos2d-x debug info(3169):      argument #3 is 'nil'; '[no object]' expected.
03-31 10:09:50.499: D/cocos2d-x debug info(3169): stack traceback:
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[C]: in function 'addChild'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx..."]:171: in function 'initMiddle'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx..."]:35: in function 'initUI'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx..."]:27: in function 'ctor'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx"]:34: in function 'create'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx"]:38: in function 'new'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx"]:44: in function 'pushScene'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx"]:309: in function 'callBack'
03-31 10:09:50.499: D/cocos2d-x debug info(3169): 	[string "xxxxxxxxxxxxx"]:653: in function <[string "xxxxxxxxxxxxx"]:651>

版权声明:原创文章,转载请注明出处。

时间: 2024-10-08 21:55:25

cocos2dx tolua传递参数分析的相关文章

arm上的参数列表传递的分析(以android为例)

对于pc上的可变参数列表,比较容易理解:参数全部存储在栈上.所以:va_list p定义一个指针,va_start(p, arg_a)获取参数列表地址,该地址就是va_start第二个参数对应数据之后的地址,,在栈上表现为:arg_a+sizeof(arg_a). 此后根据参数类型,使用va_arg依次从指定的参数列表地址取数据. 但时对于arm上,一个会使用寄存器传递参数的平台,又回怎样处理的呢? 通过写一个简单的示例程序: int test(int a, ...){ va_list p; v

【Cocos2d-x】源码分析之 2d/ui/Widget

从今天开始 咱也模仿 红孩儿这些大牛分析源码 ,由于水平有限 不对之处欢迎狂喷.哈哈. #ifndef __UIWIDGET_H__ #define __UIWIDGET_H__ #include "ui/CCProtectedNode.h" #include "ui/UILayoutDefine.h" #include "ui/UILayoutParameter.h" #include "ui/GUIDefine.h" NS

js与php传递参数

http://jingyan.baidu.com/article/0aa22375b722ba88cd0d6446.html 这个问题在网页开发时经常遇到,其实解决办法非常简单,就是几行代码的事,不过各种js.php书上都没有,百度下来也乱七八糟的,有的能用,有的不能用.小编遇到这问题时认认真真研究了一上午,研究出一点心得,希望可以帮到你! 方法/步骤 第一种情况: 两个不在同一页面(js一个页面,php在另一个页面) 第一种方法: 通过url传参.js传过去,php接收,或者php传过去,js

【Cocos2d-x】源码分析之 2d/ui/UILayout

#ifndef __LAYOUT_H__ #define __LAYOUT_H__ #include "ui/UIWidget.h" NS_CC_BEGIN namespace ui { typedef enum { LAYOUT_COLOR_NONE,//空 LAYOUT_COLOR_SOLID,//单一固定颜色的 LAYOUT_COLOR_GRADIENT//有梯度变化的 }LayoutBackGroundColorType;//容器背景颜色类型 typedef enum { LA

SpringMVC源代码学习外传(二)如何在重定向时传递参数&amp;FlashMap

以下内容基于书:<看透SpringMVC-源代码分析与实践> 基本照搬...用于自己查阅备忘. 加上外传关键字的是讨论一些SpringMVC的特定类的使用方法, 非外传的是对启动流程/请求处理流程,我们可以看作主线剧情. 什么是FlashMap? flashmap的作用是在redirect中传递参数.大家都知道转发 request是不变的,重定向会生成新的request,那传递参数就不能直接用request进行传递. spring提供了相应的方法解决这个问题,两种方法: //1.得到一个Fla

Jenkins结合ant传递参数

需求: 使用Jenkins的「参数化构建过程」,由用户手动输入参数.通过ant脚本接收这个参数,并输出(当然,中间也可以进行复杂的处理,这里为了说明问题,仅做简单的输出). 1.基础环境 Jenkins1.509.4(现在Jenkins已经升级到2.x,版本差异不是很大) apache-ant-1.9.6 apache-tomcat-7.0.6(注:Jenkins放在tomcat中,可参考我写的 <Jenkins默认工作空间及更改默认工作空间> 一文) 前提是已经有jdk的支持并配置好了相关的

js获取url传递参数

js获取url传递参数 这里是一个获取URL带QUESTRING参数的JAVASCRIPT客户端解决方案,相当于asp的request.querystring,PHP的$_GET函数: <Script language="javascript"> function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = new Object(); if (ur

Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT

对线程等待函数pthread_join二级指针参数分析

分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地址.一级指针承接的话就是这个地址. 那既然二级指针保存了,我们如何访问那?开始我觉得直接来个二级指针,然后*访问算了,但是下面的东西.让你不能那么干了!其实非要那样也可以 malloc呗! 线程创建函数pthread_create的函数原型如下: int pthread_create(pthread