当前位置: 首页 > news >正文

巩义网站建设模板如何建单页网站栏目

巩义网站建设模板,如何建单页网站栏目,郑州品牌策划设计公司,网站建设论文总结C 调用lua 基础调用 再来温习一下 myName “beauty girl” C想要获取myName的值#xff0c;根据规则#xff0c;它需要把myName压入栈中#xff0c;这样lua就能看到#xff1b;lua从堆栈中获取myName的值#xff0c;此时栈顶为空#xff1b;lua拿着myName去全局表中查…C 调用lua 基础调用 再来温习一下 myName “beauty girl” C想要获取myName的值根据规则它需要把myName压入栈中这样lua就能看到lua从堆栈中获取myName的值此时栈顶为空lua拿着myName去全局表中查找与之对应的字符串全局表找到并返回beauty girllua把beauty girl压入栈中C从栈中获取beauty girl 用代码来实现 //创建一个statelua_State *L luaL_newstate();// 重置栈顶索引 为了确认让栈顶的索引置为0 置0之后我们入栈的第一个元素的索引就是1lua_settop(L, 0);// 把myName放入栈中然后lua去全局表中查找找到对应的字段再放回栈中lua_getglobal(L, myName);// 判断栈顶的值的类型是否为String, 返回非0值代表成功int isstr lua_isstring(L, 1);//获取栈顶的值const char* str lua_tostring(L, 1);lua_close(L);C获取Lua的table helloTable {name “xxx”, sex “man”} 和上面一样要获取就先把helloTable放到栈顶让Lua知道C要获取这个值 //创建一个statelua_State *L luaL_newstate();// 重置栈顶索引 为了确认让栈顶的索引置为0 置0之后我们入栈的第一个元素的索引就是1lua_settop(L, 0);//获取helloTable的值 这个时候栈底 是 helloTablelua_getglobal(L, helloTable);//我们想要获取table中name的值那么就把name压入栈//这个时候栈中是 namehelloTable其中name是栈顶lua_pushstring(L, name);//lua api提供了一个获取table的函数 lua_gettable//该函数会从栈顶取得一个值然后根据这个值去table中寻找对应的值最后把找到的值放到栈顶 第二个参数是指table变量所在栈中的位置lua_gettable(L, -2); // -1永远是栈顶那么helloTable就是-2这里也可以用1//lua_gettable 会把值放到 栈顶 const char* sName lua_tostring(pL, -1);C调用Lua函数 function helloAdd(num1, num2)return (num1 num2) end这里有个新的函数 lua_call 第一个参数表示函数的参数个数第二个参数表示函数返回值个数 Lua会先去堆栈取出参数然后再取出函数对象开始执行函数 //创建一个statelua_State *L luaL_newstate();// 重置栈顶索引 为了确认让栈顶的索引置为0 置0之后我们入栈的第一个元素的索引就是1lua_settop(L, 0);//把helloAdd函数对象放到栈中lua_getglobal(L, helloAdd);//把函数所需要的参数入栈 lua_pushnumber(L, 10);lua_pushnumber(L, 5);//调用lua_calllua_call(L, 2, 1);int iResult lua_tonumber(L, -1);C调用Lua table的函数 lua中table有两种函数 mytable{} function mytable.StaticFunc()print(mytable.StaticFunc called.) end function mytable:Func()print(mytable:Func self:, self) end其中StaticFunc可以理解成table的静态函数Func为table的成员函数 // 调用mytable表的静态函数 lua_getglobal(L, mytable); // 将名为mytable的全局table变量的值压栈 lua_pushstring(L, StaticFunc); // 将函数名为StaticFunc压栈 lua_gettable(L, -2); // 从索引为-2处的表中读取key(在栈顶处)为StaticFunc的函数名 读取成功后将key出栈并将读取到的函数名入栈 lua_call(L, 0, 0); // 执行完后将StaticFunc弹出栈 注: 第一个0表示参数个数为0第二个0表示无返回值// 调用mytable表的成员函数 采用新方法获取函数名 lua_getfield(L, -1, Func);// 从索引为-1处的表中读取key为Func的函数名 成功后将读取到的函数名入栈 lua_pushvalue(L, -2); // 将索引为-2处的表复制一份并压入栈顶 lua_call(L, 1, 0); // 执行完后将Func弹出栈 注: 1表示参数个数即self指针为当前table第二个0表示无返回值唯一不同的是lua_call的时候需要注意第二个的值成员函数默认需要传递self。 这里获取的时候用到了函数lua_getfield 函数原型如下 void lua_getfield (lua_State *L, int index, const char *k);Pushes onto the stack the value t[k], where t is the value at the given valid index. As in Lua, this function may trigger a metamethod for the “index” event 大概意思将t[k]压入堆栈t由参数index指定在栈中的位置 Lua 调用C Lua调用C 函数 大概的步骤如下 将C的函数包装成Lua环境认可的Lua_CFunction格式将包装好的函数注册到Lua环境中像使用普通Lua函数那样使用注册函数 简单的C函数 int add(int a,int b) {return ab; }包装C函数 int add(lua_state *L) {int a lua_tonumber(-1);int b lua_tonumber(-2);int sum ab;// 将返回值压入栈中lua_pushnumber(L,sum);// 返回返回值个数return 1; }Lua脚本里会调用add(lua_state *L)调用add(lua_state *L)函数的时候会反过来进行之前的C调用luaLua调用add(lua_state *L)函数之后有一个返回值需要压入栈中最后return表示有多少个返回值Lua支持多个返回值 最关键的一步需要注册C的函数Lua才能调用 lua_register(L, add, add);Lua调用C类 这里有两种方式一个是用luaL_newlib方式 luaL_newlib方式 大概步骤如下 新建创建对象函数调用lua_newuserdata创建一个对象指针指向new出来的新的对象。新建成员方法调用lua_touserdata得到从lua中传入的对象指针调用成员方法。调用luaL_newlib将需要封装的C函数放入到一个lua表中压入栈里。将自定义模块注册到Lua环境中。在lua中会首先调用创建对象函数获得Student对象指针。通过Student对象指针调用成员方法 Student.h #pragma once#include iostream #include string using namespace std;class Student { public://构造/析构函数Student();~Student();//get/set函数string get_name();void set_name(string name);unsigned get_age();void set_age(unsigned age);//打印函数void print();private:string _name;unsigned _age; }; Student.cpp #include Student.h using namespace std;Student::Student():_name(Empty),_age(0) {cout Student Constructor endl; }Student::~Student() {cout Student Destructor endl; }string Student::get_name() {return _name; }void Student::set_name(string name) {_name name; }unsigned Student::get_age() {return _age; }void Student::set_age(unsigned age) {_age age; }void Student::print() {cout name : _name age : _age endl; }StudentRegFunc.h #pragma once#include Student.h extern C { #include lua.h #include lualib.h #include lauxlib.h }//------定义相关的全局函数------ //创建对象 int lua_create_new_student(lua_State* L);//get/set函数 int lua_get_name(lua_State* L); int lua_set_name(lua_State* L); int lua_get_age(lua_State* L); int lua_set_age(lua_State* L);//打印函数 int lua_print(lua_State* L);//------注册全局函数供Lua使用------ static const luaL_Reg lua_reg_student_funcs[] {{ create, lua_create_new_student },{ get_name, lua_get_name },{ set_name, lua_set_name },{ get_age, lua_get_age },{ set_age, lua_set_age },{ print, lua_print },{ NULL, NULL }, };int luaopen_student_libs(lua_State* L); StudentRegFunc.cpp #include StudentRegFunc.hint lua_create_new_student(lua_State* L) {//创建一个对象指针放到stack里返回给Lua中使用Student** s (Student**)lua_newuserdata(L, sizeof(Student*));*s new Student();return 1; }int lua_get_name(lua_State* L) {//得到第一个传入的对象参数在stack最底部Student** s (Student**)lua_touserdata(L, 1);luaL_argcheck(L, s ! NULL, 1, invalid user data);//清空stacklua_settop(L, 0);//将数据放入stack中供Lua使用lua_pushstring(L, (*s)-get_name().c_str());return 1; }int lua_set_name(lua_State* L) {//得到第一个传入的对象参数Student** s (Student**)lua_touserdata(L, 1);luaL_argcheck(L, s ! NULL, 1, invalid user data);luaL_checktype(L, -1, LUA_TSTRING);std::string name lua_tostring(L, -1);(*s)-set_name(name);return 0; }int lua_get_age(lua_State* L) {Student** s (Student**)lua_touserdata(L, 1);luaL_argcheck(L, s ! NULL, 1, invalid user data);lua_pushinteger(L, (*s)-get_age());return 1; }int lua_set_age(lua_State* L) {Student** s (Student**)lua_touserdata(L, 1);luaL_argcheck(L, s ! NULL, 1, invalid user data);luaL_checktype(L, -1, LUA_TNUMBER);(*s)-set_age((unsigned)lua_tointeger(L, -1));return 0; }int lua_print(lua_State* L) {Student** s (Student**)lua_touserdata(L, 1);luaL_argcheck(L, s ! NULL, 1, invalid user data);(*s)-print();return 0; }int luaopen_student_libs(lua_State* L) {// 创建一张新的表并把列表的函数注册进去luaL_newlib(L, lua_reg_student_funcs);return 1; }main.cpp #include iostream using namespace std;extern C { #include lua.h #include lualib.h #include lauxlib.h }#include Student.h #include StudentRegFunc.hstatic const luaL_Reg lua_reg_libs[] {{ base, luaopen_base }, //系统模块{ Student, luaopen_student_libs}, //模块名字Student注册函数luaopen_student_libs{ NULL, NULL } };int main(int argc, char* argv[]) {if (lua_State* L luaL_newstate()) {//注册让lua使用的库const luaL_Reg* lua_reg lua_reg_libs;for (; lua_reg-func; lua_reg) {luaL_requiref(L, lua_reg-name, lua_reg-func, 1);lua_pop(L, 1);}//加载脚本如果出错则打印错误if (luaL_dofile(L, lua4.lua)) {cout lua_tostring(L, -1) endl;}lua_close(L);}else {cout luaL_newstate error ! endl;}system(pause);return 0; }tolua 第二种方式是tolua也就是tolua 在cocos2dx中基本都是用这种方式 //.h class CMD_Data : public cocos2d::Ref { public:CMD_Data(unsigned short nlength);virtual ~CMD_Data(); public:void setMainCmdAndSubCmd(const unsigned short mainCmd, const unsigned short subCmd);unsigned short getMainCmd();unsigned short getSubCmd(); public:static CMD_Data *create(const int nLenth);//... }//.cppvoid CMD_Data::setMainCmdAndSubCmd(const unsigned short mainCmd, const unsigned short subCmd) {m_wMainCmd mainCmd;m_wSubCmd subCmd; }CMD_Data * CMD_Data::create(const int nLenth) {CMD_Data * pData new(std::nothrow) CMD_Data(nLenth);if (pData){//pData-autorelease();return pData;}CC_SAFE_DELETE(pData);return nullptr; }unsigned short CMD_Data::getMainCmd() {return m_wMainCmd; }unsigned short CMD_Data::getSubCmd() {return m_wSubCmd; }注册 .h #pragma once #include base/ccConfig.h #ifdef __cplusplus extern C { #endif #include tolua.h #ifdef __cplusplus } #endif int register_all_Cmd_Data();.cpp int register_all_Cmd_Data() {auto engine LuaEngine::getInstance();ScriptEngineManager::getInstance()-setScriptEngine(engine);lua_State* tolua_S engine-getLuaStack()-getLuaState();tolua_usertype(tolua_S, CMD_Data);tolua_cclass(tolua_S, CMD_Data, CMD_Data, cc.Node, nullptr);tolua_beginmodule(tolua_S, CMD_Data);tolua_function(tolua_S, create, tolua_Cmd_Data_create);tolua_function(tolua_S, setCmdInfo, tolua_Cmd_Data_setMainCmdAndSubCmd);tolua_function(tolua_S, getMainCmd, tolua_Cmd_Data_getMainCmd);tolua_function(tolua_S, getSubCmd, tolua_Cmd_Data_getSubCmd);tolua_function(tolua_S, getBufferLength, tolua_Cmd_Data_getBufferLength);tolua_function(tolua_S, getCurIndex, tolua_Cmd_Data_getCurIndex);tolua_function(tolua_S, setSendMessageLength, tolua_Cmd_Data_setSendMessageLength);tolua_endmodule(tolua_S);std::string typeName typeid(CMD_Data).name();g_luaType[typeName] CMD_Data;g_typeCast[CMD_Data] CMD_Data;return 1; }int tolua_Cmd_Data_create(lua_State* tolua_S) {int argc lua_gettop(tolua_S);CMD_Data *data nullptr;if (argc 2){int nLength lua_tointeger(tolua_S, 2);data CMD_Data::create(nLength);}else{CCLOG(error CMD_Data create);}int nID (data) ? data-_ID : -1;int *pLuaID (data) ? data-_luaID : nullptr;toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)data, Cmd_Data);return 1; }int tolua_Cmd_Data_setMainCmdAndSubCmd(lua_State* tolua_S) {CMD_Data *cobj (CMD_Data*)tolua_tousertype(tolua_S, 1, nullptr);if (cobj){int argc lua_gettop(tolua_S);if (argc 3){unsigned short mainCmd (unsigned short)lua_tointeger(tolua_S, 2);unsigned short subCmd (unsigned short)lua_tointeger(tolua_S, 3);cobj-setMainCmdAndSubCmd(mainCmd, subCmd);}}return 0; }int tolua_Cmd_Data_getMainCmd(lua_State* tolua_S) {CMD_Data *cobj (CMD_Data*)tolua_tousertype(tolua_S, 1, nullptr);if (cobj){lua_pushinteger(tolua_S, cobj-getMainCmd());return 1;}return 0; }int tolua_Cmd_Data_getSubCmd(lua_State* tolua_S) {CMD_Data *cobj (CMD_Data*)tolua_tousertype(tolua_S, 1, nullptr);if (cobj){lua_pushinteger(tolua_S, cobj-getSubCmd());return 1;}return 0; }cocos2dx 生成工具 方便的是cocos2dx提供了一套转换的工具。 在cocos2dx引擎目录下有个tools的目录里面有tolua的文件夹。 它里面的大概结构如下 可以看得出来cocos2dx本身的类都是用这个方法去实现的。 随便打开一个ini文件 [cocos2dx_ui] # the prefix to be added to the generated functions. You might or might not use this in your own # templates prefix cocos2dx_ui# create a target namespace (in javascript, this would create some code like the equiv. to ns ns || {}) # all classes will be embedded in that namespace target_namespace ccui# the native namespace in which this module locates, this parameter is used for avoid conflict of the same class name in different modules, as cocos2d::Label - cocos2d::ui::Label. cpp_namespace cocos2d::uiandroid_headers -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc/%(gnu_libstdc_version)s/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc/%(gnu_libstdc_version)s/include android_flags -D_SIZE_T_DEFINED_ clang_headers -I%(clangllvmdir)s/%(clang_lib_version)s/clang/%(clang_version)s/include clang_flags -nostdinc -x c -stdc11 -U __SSE__cocos_headers -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/androidcocos_flags -DANDROIDcxxgenerator_headers # extra arguments for clang extra_arguments %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s # what headers to parse headers %(cocosdir)s/cocos/ui/CocosGUI.h# what classes to produce code for. You can use regular expressions here. When testing the regular # expression, it will be enclosed in ^$, like this: ^Menu*$. classes Helper Widget Layout Button CheckBox ImageView Text TextAtlas TextBMFont LoadingBar Slider TextField ScrollView ListView PageView LayoutParameter LinearLayoutParameter RelativeLayoutParameter Rich.* HBox VBox RelativeBox Scale9Sprite EditBox LayoutComponent AbstractCheckButton RadioButton RadioButtonGroup TabControl TabHeader# what should we skip? in the format ClassName::[function function] # ClassName is a regular expression, but will be used like this: ^ClassName$ functions are also # regular expressions, they will not be surrounded by ^$. If you want to skip a whole class, just # add a single * as functions. See bellow for several examples. A special class name is *, which # will apply to all class names. This is a convenience wildcard to be able to skip similar named # functions from all classes.skip *::[^visit$ copyWith.* onEnter.* onExit.* ^description$ getObjectType .*HSV onTouch.* onAcc.* onKey.* onRegisterTouchListener ccTouch.* (g|s)etDelegate],Widget::[addTouchEventListener addClickEventListener addCCSEventListener],LayoutParameter::[(s|g)etMargin],RichText::[setTagDescription removeTagDescription setOpenUrlHandler]rename_functions rename_classes # for all class names, should we remove something when registering in the target VM? remove_prefix # classes for which there will be no parent lookup classes_have_no_parents Helper# base classes which will be skipped when their sub-classes found them. base_classes_to_skip # classes that create no constructor # Set is special and we will use a hand-written constructor abstract_classes Helper AbstractCheckButton# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are yes or no. script_control_cpp no prefix : 输出的前缀,会连接到tolua类型的函数名之前,例如 int cocos2dx_ui_xxx(lua_State* tolua_S); target_namespace : 所有生成的类都属于这个表下 例如这个里面的 ccui.xxx cpp_namespace : C中的命名空间自动生成的代码中会加上这个命名空间 android_headers : 这是安卓编译的一些指令,不需要修改,照抄就行 android_flags : 这是安卓编译的一些指令,不需要修改,照抄就行 clang_headers : 这是Clang的编译指令,不需要修改,照抄就行 cocos_flags : 这是Clang的编译指令,不需要修改,照抄就行 cocos_headers: cocos的头文件搜索目录 cocos_flags:照抄 cxxgenerator_headers : 不管 extra_arguments : 所有文件的搜索路径 headers:这是需要解析的头文件 会从这个文件中识别所有include的头文件,并解析其中的类, 可以填多个文件 比如自己的文件的需要引用的头文件 classes:需要生成哪些类的接口,这里支持正则表达式 skip:跳过哪些类和函数,支持正则表达式,可以借鉴cocos的配置文件 rename_functions:重命名函数 rename_classes:重命名类 abstract_classes:哪些类没有创建构造函数,需要手动重写构造函数 script_control_cpp:不管一般都是no 可以生成自己的一个配置文件。 然后看下同样目录下的genbindings.py文件 需要将自己的ini文件填入进去。 然后运行这个python文件便会自动生成。 一般如下 手写调用 有人会说为啥cocos里面还有类似 首先工具脚本不是万能的有些无法导出例如Lambda表达式例如某些回调函数。 void GameNetWorkManager::resumSocketByIp(const int socketMark, const std::string serverIp, const int serverPort, const std::functionvoid(bool) callback) {callback(m_socketManage-resumSocket(socketMark,serverIp,serverPort)); }比如这个方法。 无法生成我们就需要手写 int tolua_GameNetWorkManager_resumSocket(lua_State* tolua_S) {int argc 0;GameNetWorkManager* cobj nullptr;bool ok true;#if COCOS2D_DEBUG 1tolua_Error tolua_err; #endif#if COCOS2D_DEBUG 1if (!tolua_isusertype(tolua_S, 1, GameNetWorkManager, 0, tolua_err)) goto tolua_lerror; #endifcobj (GameNetWorkManager*)tolua_tousertype(tolua_S, 1, 0);#if COCOS2D_DEBUG 1if (!cobj){tolua_error(tolua_S, invalid cobj in function tolua_GameNetWorkManager_resumSocket, nullptr);return 0;} #endifargc lua_gettop(tolua_S) - 1;if (argc 2){int arg1;ok luaval_to_int32(tolua_S, 2, (int *)arg1, GameNetWorkManager:resumSocket); #if COCOS2D_DEBUG 1if (!toluafix_isfunction(tolua_S, 3, LUA_FUNCTION, 0, tolua_err)){goto tolua_lerror;} #endifint handler (toluafix_ref_function(tolua_S, 3, 0));if (!ok){tolua_error(tolua_S, invalid arguments in function tolua_GameNetWorkManager_resumSocket, nullptr);return 0;}cobj-resumSocket(arg1,[](bool resum){LuaStack* stack LuaEngine::getInstance()-getLuaStack();stack-pushBoolean(resum);stack-executeFunctionByHandler(handler, 1);stack-clean();return 0;});ScriptHandlerMgr::getInstance()-addCustomHandler((void*)cobj, handler);lua_settop(tolua_S, 1);return 1;}else if (argc 4){int arg1;std::string arg2;int arg3;ok luaval_to_int32(tolua_S, 2, (int *)arg1, GameNetWorkManager:resumSocket);ok luaval_to_std_string(tolua_S, 3, arg2, GameNetWorkManager:resumSocket);ok luaval_to_int32(tolua_S, 4, (int *)arg3, GameNetWorkManager:resumSocket); #if COCOS2D_DEBUG 1if (!toluafix_isfunction(tolua_S, 5, LUA_FUNCTION, 0, tolua_err)){goto tolua_lerror;} #endifint handler (toluafix_ref_function(tolua_S, 5, 0));if (!ok){tolua_error(tolua_S, invalid arguments in function tolua_GameNetWorkManager_resumSocket, nullptr);return 0;}cobj-resumSocketByIp(arg1, arg2, arg3, [](bool resum){LuaStack* stack LuaEngine::getInstance()-getLuaStack();stack-pushBoolean(resum);stack-executeFunctionByHandler(handler, 1);stack-clean();return 0;});ScriptHandlerMgr::getInstance()-addCustomHandler((void*)cobj, handler);lua_settop(tolua_S, 1);return 1;}return 0; #if COCOS2D_DEBUG 1tolua_lerror:tolua_error(tolua_S, #ferror in function tolua_GameNetWorkManager_resumSocket., tolua_err); #endifreturn 0; }最后 如果需要深入了解Lua强烈建议阅读《lua设计与实现》。
http://www.tj-hxxt.cn/news/223072.html

相关文章:

  • 制作游戏的网站wordpress激活码
  • 河南网站建设37518织梦网站下载地址
  • seo 成功网站企业网站建设推广含义
  • wordpress多语言模板锦州网站seo
  • 营销型网站建设申请域名时公司类型的域名后缀一般是国家信息企业公示网查询官网
  • 网站建设背景图片163网站源码
  • 学做网站论坛第六节谷歌google play官网
  • 邢台网站建设信息沂水做网站
  • 郴州网站制作公司电话手机网站 排版
  • 手机网站制作建设做团购网站多少钱
  • 自己做的视频可以传别的网站去吗工业设计公司名字
  • 网站建设基本流程包括比较不同类型网站栏目设置区别
  • 网站搜索引擎提交网站开发 开票
  • 盈利的网站哪家网络公司比较好
  • 怀化网站建设设计免费建立一个个人网站
  • 免费建材网站模板指数计算器
  • 揭阳制作公司网站网站单个页面做301
  • 湛江seo网站推广怎么做带后台的网站
  • 创建网站投资多少钱赶集网的二级域名网站怎么做
  • 电商数据网站如何下载js做的网站
  • 网站建设公司广告词大邯郸网站
  • 内蒙古网站建设网页版微信二维码不出来
  • 网站分为哪几个部分外包 网站开发公司
  • 彩票黑网站是怎么做的公司做网站需要准备什么条件
  • ps网站怎么做超链接做网站要学什么语言
  • 丰和园林建设集团网站wordpress熊掌号插件
  • 深圳如何搭建制作网站昆明网站建设建站模板
  • 乐陵人力资源网站学校网站代码模板
  • 好单库网站是怎么做的镇江关键词优化如何
  • 网站首页设计大赛国外网站建设软件