先了解下lua如何调用c++的:
lua脚本代码->通过coocs2dx中间解析层代码->将其转换并调用cocos2dx c++的前端代码
coocs2dx中间解析层代码都在libs/lua/cocos2dx_support/LuaCocos2d.cpp 这个文件中,想了解的可以自己去看下这个文件。
也就是说,你自己定义了一个类,lua能够调用你自己定义的类,你的自定义类就必须在LuaCocos2d.cpp这个中间解析文件中申明。
看了LuaCocos2d.cpp这个文件,可能有的同学都晕了,不知道怎么在LuaCocos2d.cpp中申明自己的定义的类。不过,不用担心,cocos2dx已经提供了tolua++这个工具自动编译生成新的LuaCocos2d.cpp文件。
下面开始进入正题。
一、创建一个coocs2dx-lua 的Demo工程,然后在class中自己定义个类。
SNSprite.h
[/cpp]
//
// SNSprite.h
// LuaDemo
//
// Created by LiuYanghui on 13-4-8.
//
//
#ifndef __LuaDemo__SNSprite__
#define __LuaDemo__SNSprite__
#include “cocos2d.h”
USING_NS_CC
class SNSprite : public CCSprite{
public:
static SNSprite* create(const char* name)
private:
void initData()
}
#endif /* defined(__LuaDemo__SNSprite__) */
[/cpp]
SNSprite.cpp
C++
local function createSunnyLayer()
local layerSunny = CCLayer:create()
local labTips = CCLabelTTF:create("这个icon图标就是使用的自定义类", "Arial", 18)
labTips:setPosition(ccp(240,280))
layerSunny:addChild(labTips)
local sp = SNSprite:create("Icon.png")
sp:setPosition(ccp(100,100))
layerSunny:addChild(sp)
return layerSunny
end
-- play background music, preload effec t
添加到scene中:
C++
-- run
local sceneGame = CCScene:create() -- 创建场景
--sceneGame:addChild(createLayerFarm()) -- 将农场层加入场景
--sceneGame:addChild(createLayerMenu()) -- 将菜单界面层加入场景
sceneGame:addChild(createSunnyLayer())
CCDirector:sharedDirector():runWithScene(sceneGame)
OK,xcode编译运行,就看到效果了。
更新LUa其实也是更新资源。 Lua被看作一个资源么。Lua代码都是运行时才编译的,不运行的时候就如同一张图片、一段音频一样,都是文件资源;所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”。运行效率由于使用反射,所以成为它与生俱来的诟病。目前有对他的改进,像C#ToLua、Slua。但是Ulua是很成熟的,这个对于项目开发我认为暂时比性能重要!很多人在用,很多坑都已经被人采完。个人比较看好Slua的发展。当然了还有李总的L#走的就不是Lua的路。网上还有说nLua的,我是新手不了解。 看看权威的解释:
ulua包含两种c模式(luajit版+原生luavm版),加之tolua c#提供了直接访问渠道。所以追求效率的,请选用ulua。但是ulua因为底层使用luajit,而luajit目前不能在WP使用,所以如果ulua支持WP需要第二种原生luavm的底层库。
nlua包含2种模式(KeraLua c版本)(KopiLuac#版本),它支持全,因为c版本底层用的原始的luavm(非luajit)。但是缺少tolua c#的支持,因此效率略低于ulua,但是支持WP(其他也支持)。
两种方法可以将C++类/成员函数绑定至Lua。编写.pkg文件然后使用tolua++创建.h/.cpp文件如LuaCocos2d.h/.cpp
.pkg文件跟.h文件一样会列出所有类和函数,格式请参见“$cocos2dDir/tools/tolua++/”中的文件。
处理写.h/.cpp文件
为什么不使用pkg和tolua++?
如果你想控制所有进程,就要自己编辑Lua绑定函数。
有一个“MyClass”类,该类包含三个成员函数。
static MyClass * createWithSize(CCSize s)
CCSize getSize()
void setSize(CCSize s)
在“tolua_MyClass.cpp”中编写这些函数:
extern "C" {
#include "tolua++.h"
#include "tolua_fix.h"
}
#include "MyClass.h"
int tolua_MyClass_createWithSize(lua_State *L){
CCSize *s = (CCSize *)tolua_tousertype(L, 2, NULL)
MyClass *o = MyClass::createWithSize(s? s : CCSizeZero)
tolua_pushusertype(L, o, "MyClass")
return 1
}
int tolua_MyClass_getSize(lua_State *L){
MyClass *o = (MyClass *)tolua_tousertype(L, 1, NULL)
if(o){tolua_pushusertype(L, Mtolua_new((CCSize)(o->getSize())), "CCSize")
return 1
}
int tolua_MyClass_setSize(lua_State *L){
MyClass *o = (MyClass *)tolua_tousertype(L, 1, NULL)
CCSize *s = (CCSize *)tolua_tousertype(L, 2, NULL)
if(o &&s){ o->setSize(s)}
return 1
}
TOLUA_API int tolua_MyClass_open(lua_State* L){
tolua_open(L)
tolua_usertype(L, "MyClass")
tolua_model(L, NULL, 0)
tolua_cclass(L, , "MyClass", "", NULL)
tolua_beginmodule(L, "MyClass")
tolua_function(L, "createWithSize", tolua_MyClass_createWithSize)
tolua_function(L, "getSize", tolua_MyClass_getSize)
tolua_function(L, "setSize", tolua_MyClass_setSize)
tolua_endmodule(L)
tolua_endmodule(L)
return 1
}
调用“AppDelegate.cpp”中的“tolua_MyClass_open(L)”,传递“lua_State”参数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)