## 17.1 Lua与C++交互 sol2特性 lua可以对cpp class添加函数 不能覆盖函数 setfunction加lambda在vs下面会有一大堆提示信息,加上overload就不会有了……,github上新版本已经修复等release。 调用cpp的构造函数是需要调用new的。 可选两种构造函数方式,直接带() ,或者使用.new() 默认就是.new() 这种在lua的Component需要也添加.new() 函数,才能和cpp component行为一致。 主动指定构造函数为sol::callconstructor,使用call metafunction。 这种在lua的Component需要也添加 call,才能和cpp component行为一致。
sol2特性
lua可以对cpp class添加函数
不能覆盖函数
set_function加lambda在vs下面会有一大堆提示信息,加上overload就不会有了……,github上新版本已经修复等release。
调用cpp的构造函数是需要调用new的。
sol::table engine_table=sol_state["Engine"]; sol::table player_table=engine_table["Player"]; sol::protected_function player_new_function=player_table["new"]; auto result=player_new_function(); if(result.valid()==false){ sol::error err=result; std::cerr<<err.what()<<std::endl; } sol::table player_instance_table=result; player_instance_table["hp_"]=4; Player* player_create_from_lua=player_instance_table.as<Player*>(); int hp=player_create_from_lua->hp_;
可选两种构造函数方式,直接带() ,或者使用.new()
默认就是.new()
sol_state.new_usertype<Player>("Player",sol::constructors<Player(),Player(int)>());
这种在lua的Component需要也添加.new() 函数,才能和cpp component行为一致。
setmetatable(LoginScene,{["new"]=function(table,param) local instance=setmetatable({},{__index=table}) return instance end})
主动指定构造函数为sol::call_constructor,使用__call metafunction。
sol_state.new_usertype<Player>("Player",sol::call_constructor,sol::constructors<Player(),Player(int)>())
这种在lua的Component需要也添加 __call,才能和cpp component行为一致。
setmetatable(LoginScene,{["__call"]=function(table,param) local instance=setmetatable({},{__index=table}) return instance end})