cocos2dx v3.x lua绑定分析
打算新项目转到cocos2dx v3上了,下载代码浏览过后发现改动真是非常大,结构性调整很多。
比如tolua绑定这一块,就几乎全翻新了。
胶水代码的生成,改成了全自动式的,通过clang来分析c++代码,可以准确的知道每一个类、函数、参数的信息,再也不用手动写pkg文件了。
运行期对象管理这块,似乎也有了不少改动,至少我原来的一些扩展代码运行不了了,还没来得及细看,待看完再一一录下。
先记录一下目前已看清楚的【类名表、类元表、对象实例】之间的关系:
1、类元表:最核心的表,在lua代码里是不可见的。这是在注册每个类的第一步时建立的:
tolua_usertype(tolua_S,"cc.Application");
但其实类元表也就是一个普通的table,只不过它挂在lua registry上,所以说一般的逻辑代码是不会用到它的。类的所有函数、与父类的关系,也都记在这个核心的元表里。
2、类名表:这就是lua代码里要使用该类时所用的名字,也就是:
local app=cc.Application:getInstance()
里cc.Application这个变量对应的表。它是注册类的第二步中建立的:
tolua_cclass(tolua_S,"Application","cc.Application","",nullptr);
【类名表】的元表就是【类元表】。
3、对象实例:每个c++ object被push到lua里,是以一个userdata表示。它的元表被设成【类元表】,所对它调用的各种方法都会索引到相应的c++函数上。它的生成是在以下函数中完成:
void tolua_pushusertype_internal (lua_State* L, void* value, const char* type, int addToRoot)
其实在这里我不是太清楚每个类为什么要有两个表来表示,从功能上说,完全可以合为一个,也就是【类元表】上的所有功能都可以放在【类名表】里实现。也许是因为作者担心类名表存在于普通变量空间里,可能会被无意中修改覆写吧!但分开之后,也明显导致了一些后续处理上的麻烦:比如在给【模块】注册函数时,就要判断当前【模块】是一个【普通模块】(对应于c++里的名字空间)还是一个【类名表】,如果是后者,那函数不能直接挂在它上面,而是要转挂到【类元表】上去,这是在下面函数中处理的:
/* Begin module
* It pushes the module (or class) table on the stack
*/
TOLUA_API void tolua_beginmodule (lua_State* L, const char* name)
{
if (name) { // ... module
//---- now module[name] is a table, get it's metatable to store keys
// get module[name]
lua_pushstring(L,name); // ... module name
lua_rawget(L,-2); // ... module module[name]
// Is module[name] a class table?
lua_pushliteral(L, ".isclass");
lua_rawget(L, -2); // stack: ... module module[name] class_flag
if (lua_isnil(L, -1)) {
lua_pop(L, 1); // stack: ... module module[name]
return; // not a class table, use origin table
}
lua_pop(L, 1); // stack: ... module class_table
// get metatable
if (lua_getmetatable(L, -1)) { // ... module class_table mt
lua_remove(L, -2); // ... module mt
}
//---- by SunLightJuly, 2014.6.5
} else {
lua_pushvalue(L,LUA_GLOBALSINDEX);
}
}
同时这个修改也导致了我之前的一些代码运行失效。因为我会给一些类添加扩展函数,如:
rawset(ccui.Widget,"set_enable", function(self, v)
self:setTouchEnabled(v)
self:setBright(v)
end
按上述逻辑,实例对象的元表直接指向类元表,也就是说完全绕过了类名表(类名表实际只在创建对象时起个提供类变量的引子作用),而rawset在类名表上的扩展函数自然也被忽略了。
修改办法也很简单,去掉rawset,直接往类名表上写就行了,这会导致其通过元表上的class_newindex_event函数,把数据改记到类元表上,从而符合了实例对象的属性访问流程。
至于之前为什么用一个rawset多此一举?那也是无奈之法,因为上一版本的cocos2dx在lua绑定实现上就是有点问题,不用rawset的话直接就挂了。所以说它现在又改好了,也算是回归自然吧。
cocos2dx v3.x lua绑定分析的更多相关文章
- Cocos2d-x v3.3 lua绑定c++类方法总结
网上有很多cocos2d-x lua绑定c++类的接口教程,这篇文章也是总结他们的经验. 其中重点参考了 http://cn.cocos2d-x.org/tutorial/show?id=1295, ...
- 使用cocos2d-x v3.1开发小游戏(基本框架)
小游戏的组成 欢迎界面 在游戏资源未全部加载完之前就需要载入,避免进入游戏会有一段黑屏时间. 可以用来展示游戏名称或者开发者logo. 开始菜单界面 一般用于显示游戏名称和关卡选择(或者称游戏难度选择 ...
- cocos2dx的lua绑定
一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...
- cocos2d-x lua绑定解析
花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...
- cocos2dx lua 绑定之二:手动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...
- cocos2dx lua 绑定之一:自动绑定自定义类中的函数
cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...
- 开源基于lua gc管理c++对象的cocos2dx lua绑定方案
cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...
- Cocos2d-x v3.6制作射箭游戏(二)
原文 Cocos2d-x v3.6制作射箭游戏(二) 六 24, 2015by RENSHANin COCOS2D-X 上章我们创建并加载了游戏地图,接下来的两章我们将实现如下的效果. 在开始之前,先 ...
- Cocos2D-X v3.0 alpha1环境搭建
周末看了下Cocos2D,感觉用起来还是挺爽的样子,跨平台,支持Windows, Linux, Mac, IOS, Android,WP...N多平台..还是C++开源滴,果断下下来研究下.. 最新版 ...
随机推荐
- socket通信——通过Udp传输方式,将一段文字数据发送出去
需求:通过Udp传输方式,将一段文字数据发送出去 定义一个Udp发送端 思路: 1.建立updsocket服务 2.提供数据,并将数据封装到数据包中. 3.通过socket服务的发送功能,将数据包发出 ...
- 纯CSS3实现关闭按钮
在线演示 本地下载
- RabbitMQ事务确认机制(生产者)
消息确认机制 生产者 消费者 消费者如何确保消息一定消费成功 队列和消费者建立长连接,推送或者拉取形式. 消费者通过自动应答或者手动应答,队列服务器等待应答结果,如果没有应答结果那么保留给下一个消费者 ...
- 如何在unigui中用代码展开一棵树?
procedure expandtree(tree:tunitreeview);begin UniSession.AddJS('setTimeout("' + Tree1.JSName ...
- 《thinking in java》 接口与内部类
书本上的例子 改编后的. package test2; class A{ interface B{void f();} public class BImp implements B{public vo ...
- mvc购物车项目
第一个mvc项目--购物车. 1.购物车需求 a.用户可以登录 b.用户可以购买商品 c.用户可以对购物车的商品进行修改和删除 d.用户可以下订单 e.系统可以发送电子邮件给用户 uml图 2.界面设 ...
- Linux课程---10、权限管理(权限有哪几种)
Linux课程---10.权限管理(权限有哪几种) 一.总结 一句话总结: r 读 w 写 x 执行 1.drwxr-x--- 2 root root 4096 Jan 20 19:39 mnt ...
- asp.net中关于《%=》《%#》《%》 的用法——(转帖)
1:在.aspx页面,<% %>标签相当于在.cs页面的代码,也就是说你在.cs文件里面怎样写,就可以在.aspx文件里面的<% %>标签里面怎样写. 2:在.aspx页面,& ...
- 从信用卡欺诈模型看不平衡数据分类(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制。过采样后模型选择RF、xgboost、神经网络能够取得非常不错的效果。(2)模型层面:使用模型集成,样本不做处理,将各个模型进行特征选择、参数调优后进行集成,通常也能够取得不错的结果。(3)其他方法:偶尔可以使用异常检测技术,IF为主
总结:不平衡数据的分类,(1)数据层面:使用过采样是主流,过采样通常使用smote,或者少数使用数据复制.过采样后模型选择RF.xgboost.神经网络能够取得非常不错的效果.(2)模型层面:使用模型 ...
- 【leetcode刷题笔记】Binary Tree Level Order Traversal II
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...