cocos3.2 tolua报错求助

cocos3.2 tolua报错求助,第1张

使用cocos2dx-lua开发,免不了自己定义类,但是如何使用自定义的类的?

先了解下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”参数。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11443614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存