ããã«ã¡ã¯ãHabrahabrïŒ
ã¹ã¯ãªããã§ãã®ãããã¯ãæžãããšã«ããŸãã

äœãç¥ãå¿
èŠããããŸããïŒ
- é©åãªã¬ãã«ã®C ++ïŒã¬ãã¹ã³ã«ã¯ãã³ãã¬ãŒãããããŸã-ãã³ãã¬ãŒãïŒ
- Luaãéåžžã«è»œéãªã¹ã¯ãªããèšèªã ãã®ã¬ãã¹ã³ããå§ãããŸãã
ã²ãŒã ãã€ã¢ãã°ã.cppãã¡ã€ã«ã«èšè¿°ããããšã倧ããªééãã ã£ãçç±
倧èŠæš¡ãªãããžã§ã¯ãïŒããšãã°ã倧èŠæš¡ãªã²ãŒã ïŒãéçºããå Žåãæ°ãã100è¡ã®ã³ãŒãããšã«ã³ã³ãã€ã«ãé
ããªãããšã«æ°ã¥ããŸãããïŒ
ã²ãŒã ã¯ããå€ãã®æŠåšãããå€ãã®ãã€ã¢ãã°ãããå€ãã®ã¡ãã¥ãŒãªã©ãäœæããŸãã
ã€ãããŒã·ã§ã³ã«é¢é£ããŠçºçããæãéèŠãªåé¡ã®1ã€ã¯ãç¡æ°ã®æŠåšãšãããžãšããããªãé£ããã¿ã¹ã¯ããµããŒãããããšã§ãã
äŒè©±ãå€æŽããããæ°ããã¿ã€ãã®æŠåšãè¿œå ãããããããã«å人/äžåž/ããŒãããŒããã®èŠæ±ã«æéãããããããç¶æ³ã§ã¯ãããã€ãã®æ段ã«é Œããªããã°ãªããŸãããããšãã°ããã®ãã¹ãŠã®ãŽããå¥ã
ã®ããã¹ããã¡ã€ã«ã«èšé²ããŸãã
ã»ãšãã©ãã¹ãŠã®ã²ãŒã éçºè
ã¯ãåå¥ã®ããã¹ããã¡ã€ã«ã§ã¬ãã«ããããŸãã¯ãã€ã¢ãã°ãäœæããããããèªã¿åããŸããã å°ãªããšãæãåçŽãªãªãã·ã§ã³-å
¥åãã¡ã€ã«ã䜿çšããã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®ãªãªã³ãã¢ãŒãã¿ã¹ã¯
ããããäžèšã®æ¹æ³-ã¹ã¯ãªããã䜿çšããæ¹æ³ããããŸãã
åé¡è§£æ±º
ãããããŸããããã®ãããªããšã«ã€ããŠã¯ããã¬ãŒã€ãŒã®ç¹æ§ã®èª¬æãå«ãéåžžã®ãã¡ã€ã«ã§ååã§ãã ããããæ¥éã«çºå±ããŠãããããžã§ã¯ãã§ã»ãŒæ¯æ¥ãã¡ã€ã³ãã¬ãŒã€ãŒã®ããžãã¯ããããã«å€æŽããå¿
èŠãããå Žåãã©ãããã°ãããžã§ã¯ããäœåºŠãã³ã³ãã€ã«ããå¿
èŠããããŸããïŒã
ãã質åã§ãã ãã®å Žåãã²ãŒã ã®ãã¹ãŠã®ç¹æ§ãŸãã¯ãã®ä»ã®éšåã§ãã¬ã€ã€ãŒã®ããžãã¯ããµããŒãããã¹ã¯ãªãããç§ãã¡ã®å©ãã«ãªããŸãã
åœç¶ããã¬ãŒã€ãŒã®ããžãã¯ãäœããã®ããã°ã©ãã³ã°èšèªã®ã³ãŒãã®åœ¢åŒã§ä¿æããã®ãæã䟿å©ã§ãã
æåã®èãã¯ãã¹ã¯ãªããèšèªã®ç¬èªã®ã€ã³ã¿ãŒããªã¿ãŒãäœæããŠãæ°ç§ã§è³ããæé€ããããšã§ãã ãã¬ãŒã€ãŒã®ããžãã¯ã¯ããã®ãããªæãããã³ã¹ãã®äŸ¡å€ã¯ãããŸããã
幞ããªããšã«ãããã¹ããã¡ã€ã«ãåãå
¥ããŠå®è¡ããC ++çšã®ç¹å¥ãªã¹ã¯ãªããèšèªã©ã€ãã©ãªããããŸãã
ãã®ãããªã¹ã¯ãªããèšèªLuaã®1ã€ã«ã€ããŠèª¬æããŸãã
ã©ã®ããã«æ©èœããŸããïŒ
å§ããåã«ãã¹ã¯ãªããèšèªã®ä»çµã¿ãç解ããããšãéèŠã§ãã å®éã®ãšãããforãwhileãifãããã³ãã®ä»ã®æ§é ãååšããå Žåãã¹ã¯ãªããèšèªã«ã¯ã»ãšãã©æ©èœããããŸããã
ãããã¯äž»ã«ãã³ã³ãœãŒã«ã«ããã¹ããåºåããããã®é¢æ°ãæ°åŠé¢æ°ãããã³ãã¡ã€ã«ãæäœããããã®é¢æ°ã§ãã
ã¹ã¯ãªããã䜿çšããŠãã¬ãŒã€ãŒãå¶åŸ¡ããã«ã¯ã©ãããã°ããã§ããïŒ
ç§ãã¡ã¯C ++ã§-ããã°ã©ã ã¯ããã€ãã®æ©èœãå®è¡ããã¹ã¯ãªããå
ã®äœããã®ååã§ãããããç»é²ãããã¹ã¯ãªããå
ã§åŒã³åºããŸãã ã€ãŸããSetPosïŒxãyïŒé¢æ°ãç»é²ããŠC ++ããã°ã©ã ã§ã®ãã¬ãŒã€ãŒã®äœçœ®ã決å®ããå Žåãã¹ã¯ãªããã§ãã®é¢æ°ã«ééãããšãã¹ã¯ãªããèšèªã©ã€ãã©ãªã®ãã€ã³ã¿ãŒããªã¿ãŒãã¯ãã¡ããC ++ããã°ã©ã ã§ãã®é¢æ°ãåŒã³åºããŸãããã¹ãŠã®ã¡ãœããã転éããŸãã
ãããã :)
UPDïŒæ³šæïŒ 1人ã®ãŠãŒã¶ãŒããã³ãŒããã¢ããããŒããããšãã«ãã¹ãŠã®ãšã©ãŒãå®å
šã«æé€ã§ããªãã£ããšããã¡ãŒã«ã§ç§ã«é£çµ¡ããŸãã
-habrahabr.ru/post/196272/#comment_6850016ãã°ã¯Habrã®èš±å¯ãåŸãŠã³ãŒãã«äŸµå
¥ããŸãã
次ã®ãããªã³ãŒãã®ã»ã¯ã·ã§ã³ã眮ãæããŸã
template<class t> T MethodName();
ã«
template<class T> T MethodName();
ãããŠãlua_CFunctionã®ä»£ããã«ãlua_cfunctionã¯ã¹ãããããŸã
ãããããé¡ãããŸãïŒ
æºåãã§ããŸããïŒ
ã¹ã¯ãªããããã°ã©ãã³ã°èšèªã®å©ç¹ãç解ããããå§ããŸãããïŒ
libãšincud LuaãgithubïŒãããã¯ã®äžéšïŒã®ãªããžããªããããŠã³ããŒãããããå
¬åŒWebãµã€ãã§å
¥æããŠãã ããã
Visual Studioã§ã³ã³ãœãŒã«ãããžã§ã¯ããŸãã¯Win32ïŒéèŠã§ã¯ãããŸããïŒãäœæããŸãïŒããŒãžã§ã³2012ããããŸãïŒ
[ãããžã§ã¯ã]-> [ããããã£]-> [æ§æããããã£]-> [VC ++ãã£ã¬ã¯ããª]ã«ç§»åãããã€ã³ã¯ã«ãŒããã£ã¬ã¯ããªãããã³ãã©ã€ãã©ãªãã£ã¬ã¯ããªãã«ããããããªããžããªããIncludeããã³Libãã©ã«ããŒãè¿œå ããŸãã
次ã«ãmain.cppãã¡ã€ã«ãäœæããŠæžã蟌ã¿ãŸãã
int main() { return 0; }
ãæ³åã®ãšãããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ããããŸãã
ä»ãã³ãŒãã£ã³ã°ã«è¡ããŸã
ãã¹ãŠã®ç¬éã泚ææ·±ã説æããããšãçŽæããŸã
ã¹ã¯ãªããã¯ãã¹ã¯ãªããã¯ã©ã¹ãæ
åœããŸãã Script.h / .cppã§é¢æ°ãåæã«å®£èšããã³å®è£
ããŸã
Script.cppãäœæããŠæžã蟌ã¿ãŸã
#include "Script.h"
Script.hãäœæããŠæžã蟌ã¿ãŸã
#ifndef _SCRIPT_H_ #define _SCRIPT_H_ #endif
2è¡åŸãïŒendifã®åã«ã¹ã¯ãªããã®ã¯ã©ã¹ãå®çŸ©ããŸã
ãã®ã³ãŒãã¯ããã¡ã€ã«ã®çžäºã€ã³ã¯ã«ãŒããé²ãããã«æžãããŠããŸãã Game.hãã¡ã€ã«ã«ã¯Script.hãå«ãŸããŠãããScript.hãã¡ã€ã«ã«ã¯Game.hãå«ãŸããŠãããšããŸãããã ãã®ã³ãŒãã§ã¯ãã€ã³ã¯ã«ãŒãã¯1åã®ã¿å®è¡ãããŸã
ãã®ã³ãŒãå
ã«æ¬¡ã®ããã«èšè¿°ããŸã
#pragma comment(lib,"lua.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> }
æåã®è¡ã¯ãlua.libèªäœãã¢ãŒã«ã€ãããæ¥ç¶ããŸãã
externâ Câãšã¯äœã§ããïŒ å®éã®ãšãããluaã¯Cã§èšè¿°ãããŠãããããã©ã€ãã©ãªãæ¥ç¶ããã«ã¯ãã®ãããªã³ãŒããå¿
èŠã§ãã
次ã¯ãã³ã³ãœãŒã«ãæäœããããã®å€ãã®ãã¡ã€ã«ãžã®æ¢ç¥ã®æ¥ç¶ã§ã
#include <stdio.h> #include <iostream> #include <sstream> using namespace std;
ããã§ã¯ã¯ã©ã¹å®çŸ©ã«åãããããŸããã
class Script {
C ++ã®Luaã©ã€ãã©ãªã®æãéèŠãªãªããžã§ã¯ãã¯lua_Stateã§ãã¹ã¯ãªããã®å®è¡ã«å¿
èŠã§ã
private: lua_State *lua_state;
次ã¯ãããªãã¯é¢æ°ã§ã
public: void Create();
ãã®é¢æ°ã¯lua_StateãåæåããŸã
äœæïŒïŒScript.cppã§ã®ãã®å®çŸ©
void Script::Create() { lua_state = luaL_newstate(); static const luaL_Reg lualibs[] = { {"base", luaopen_base}, {"io", luaopen_io}, {NULL, NULL} }; for(const luaL_Reg *lib = lualibs; lib->func != NULL; lib++) { luaL_requiref(lua_state, lib->name, lib->func, 1); lua_settop(lua_state, 0); } }
lua_Stateãåæåããæåã®è¡ã
次ã«ããæ¥ç¶ã©ã€ãã©ãªãã®ãªã¹ãã宣èšããŸãã å®éã®ãšãããluaã®ãçŽç²ãªã圢åŒã«ã¯printïŒïŒé¢æ°ãããããŸããã æ°åŠããã³ãã®ä»ã®é¢æ°ã®å Žåãç¹å¥ãªã©ã€ãã©ãªãæ¥ç¶ããŠãããããããmath.fooãbase.fooãio.fooãšããŠåŒã³åºãå¿
èŠããããŸãã ä»ã®ã©ã€ãã©ãªãæ¥ç¶ããã«ã¯ãããšãã°ã "math"ãluaopen_math}ããªã©ã®lualibsãè¿œå ããŸãã ãã¹ãŠã®ã©ã€ãã©ãªåã¯luaopen _...ã§å§ãŸããlialibsã®æåŸã¯{NULLãNULL}ã§ãªããã°ãªããŸãã
void Close();
ãã®æ©èœã«ãããLuaãªãœãŒã¹ã解æŸãããŸãã
éããïŒïŒåœŒå¥³ã®å®çŸ©
void Script::Close() { lua_close(lua_state); }
lua_closeïŒïŒã䜿çšããã ãã§ã
int DoFile(char* ScriptFileName);
ãããŠããã®é¢æ°ã¯ãã¡ã€ã«ãå®è¡ããŸãã å
¥åã§ã¯ããã¡ã€ã«ã®ååïŒããšãã°ããCïŒ\\ script.luaãïŒã䜿çšããŸãã
ãªãintãè¿ãã®ã§ããïŒ äžéšã®ã¹ã¯ãªããã«ã¯returnãå«ãŸããŠããå Žåããããã¹ã¯ãªãããäžæããŠå€ãè¿ããŸãã
DofileïŒïŒåœŒå¥³ã®å®çŸ©
int Script::DoFile(char* ScriptFileName) { luaL_dofile(lua_state,ScriptFileName); return lua_tointeger(lua_state, lua_gettop(lua_state)); }
ã芧ã®ãšãããã¹ã¯ãªãããå®è¡ããŠintãè¿ããŸãã ããããé¢æ°ã¯intã ãã§ãªãboolãšchar *ãè¿ãããšãã§ããŸããç§ã¯åžžã«æ°åãè¿ãã ãã§ãïŒlua_tobooleanãlua_tostringïŒ
次ã«ãå®æ°ïŒæ°å€ãæååãé¢æ°ïŒãç»é²ããé¢æ°ãäœæããŸã
template<class t> void RegisterConstant(T value, char* constantname);
RegisterConstantïŒïŒãã¿ãŒã³ãéããŠè¡åããŸãã é¢æ°åŒã³åºãã®äŸïŒ
RegisterConstant<int>(13,"goodvalue");
圌女ã®å®çŸ©
template<> void Script::RegisterConstant<int>(int value, char* constantname) { lua_pushinteger(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<double>(double value, char* constantname) { lua_pushnumber(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<char>(char* value, char* constantname) { lua_pushstring(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<bool>(bool value, char* constantname) { lua_pushboolean(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<lua_cfunction>(lua_CFunction value, char* constantname) { lua_pushcfunction(lua_state, value); lua_setglobal(lua_state,constantname); }
ã¯ã©ã¹Tã®å¯èœãªå€ããšã«ãã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãã
*ãã£ããã³*æçµå®çŸ©-é¢æ°ç»é²
ç»é²ã«é©ããæ©èœã¯æ¬¡ã®ãšããã§ãã
int Foo(lua_State*) {
ããã§ãnã¯è¿ãããå€ã®æ°ã§ãã n = 2ã®å ŽåãLuaã§ã¯æ¬¡ã®ããšãã§ããŸãã
a, b = Foo()
1ã€ã®é¢æ°ãè€æ°ã®å€ãè¿ãããšã«é©ããå Žåã¯ãLuaã®ããã¥ã¢ã«ãèªãã§ãã ãã
次ã®é¢æ°ã¯ãLuaã®
ããŒãã«ãäœæã
ãŸã ã ãããäœãæå³ããã®ãæ確ã§ãªãå Žåãããã«ããããŒãã«ã¯é
åã®ãããªãã®
void Array();
é
åïŒïŒåœŒå¥³ã®èª¬æ
void Script::Array() { lua_createtable(lua_state, 2, 0); }
次ã®é¢æ°ã¯ãã¢ã€ãã ãããŒãã«ã«ç»é²ããŸãã
template<class t> void RegisterConstantArray(T value, int index);
RegisterConstantArrayïŒïŒåœŒå¥³ã®èª¬æ
template void Script::RegisterConstantArray<int>(int value, int index) { lua_pushnumber(lua_state, index); lua_pushinteger(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<double>(double value, int index) { lua_pushnumber(lua_state, index); lua_pushnumber(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<char>(char* value, int index) { lua_pushnumber(lua_state, index); lua_pushstring(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<bool>(bool value, int index) { lua_pushnumber(lua_state, index); lua_pushboolean(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<lua_cfunction>(lua_CFunction value, int index) { lua_pushnumber(lua_state, index); lua_pushcfunction(lua_state, value); lua_settable(lua_state, -3); }
Luaãããããªãå Žåãéåžžã«å€ãã®åã1ã€ã®é
åã«åãŸãããšã«é©ãã§ãããã :)
å®éãããŒãã«èŠçŽ ã«ã¯ããŒãã«ãå«ãŸããå ŽåããããŸãããç§ã¯ãããè¡ããŸããã
æåŸã«ãå®æããããŒãã«ãç»é²ããå¿
èŠããããŸã
void RegisterArray(char* arrayname);
RegisterArrayïŒïŒåœŒå¥³ã®èª¬æ
void Script::RegisterArray(char* arrayname) { lua_setglobal(lua_state, arrayname); }
ç¹å¥ãªããšã¯äœããªã
以äžã®é¢æ°ã¯äž»ã«ãLuaã§ã®ç»é²ã«å¿
èŠãªint fooïŒlua_State *ïŒãªã©ã®é¢æ°ã®ã¿ã察象ãšããŠããŸãã
ãããã®æå-åŒæ°ã®æ°ãååŸããŸã
int GetArgumentCount();
äœæïŒïŒåœŒå¥³ã®èª¬æ
int Script::GetArgumentCount() { return lua_gettop(lua_state); }
ãã®é¢æ°ã¯ãããšãã°ãWriteïŒïŒé¢æ°ã®å Žåã«å¿
èŠã§ãããã®é¢æ°ã§ã¯ã1ã€ã®åŒæ°ã§ã¯ãªãã奜ããªã ãåŒæ°ãè©°ããããšãã§ããŸã
åæ§ã®æ©èœãåŸã§å®è£
ããŸãã
次ã®é¢æ°ã¯ãã¹ã¯ãªããå
ã®é¢æ°ã«æž¡ãããåŒæ°ãåãåããŸã
template<class t> T GetArgument(int index);
GetArgumentïŒïŒåœŒå¥³ã®èª¬æ
template int Script::GetArgument<int>(int index) { return lua_tointeger(lua_state,index); } template double Script::GetArgument<double>(int index) { return lua_tonumber(lua_state,index); } template char* Script::GetArgument<char>(int index) { return (char*)lua_tostring(lua_state,index); } template bool Script::GetArgument<bool>(int index) { return lua_toboolean(lua_state,index); }
ããŒãã«ãšé¢æ°ãé€ããåè¿°ã®ãã¹ãŠã®ã¿ã€ããååŸã§ããŸã
indexã¯åŒæ°ã®çªå·ã§ãã ãããŠãæåã®åŒæ°ã¯1ããå§ãŸããŸãã
æåŸã«ãã¹ã¯ãªããã«å€ãè¿ãæåŸã®é¢æ°
template<class t> void Return(T value);
æ»ãïŒïŒåœŒå¥³ã®èª¬æ
template<> void Script::Return<int>(int value) { lua_pushinteger(lua_state,value); } template<> void Script::Return<double>(double value) { lua_pushnumber(lua_state,value); } template<> void Script::Return<char>(char* value) { lua_pushstring(lua_state,value); } template<> void Script::Return<bool>(bool value) { lua_pushboolean(lua_state,value); }
ããã«ã³ãŒã
ããã¯äœããããæéã§ãïŒ
main.cppãå€æŽãã
#include "Script.h" int main() { return 0; }
ã³ã³ãã€ã«ããŸãã ããã§ã¯ã©ã¹ã®ãã¹ããéå§ã§ããŸã
èŠããŠãããŠãç§ã¯æžã蟌ã¿æ©èœãäœæãããšçŽæããŸãããïŒ :)
main.cppãå€æŽããŸã
#include "Script.h"
ãããŠããããžã§ã¯ãã®ãããã©ã«ããŒã§ãscript.luaãã¡ã€ã«ãäœæããŸã
Write(1,2,3,4)

ãããžã§ã¯ããã³ã³ãã€ã«ããŠå®è¡ããŸãã

次ã«ãscript.luaãå€æŽããŸã
for i = 1, 4 do Write(i, "\n", "Hier kommt die Sonne", "\n") end
ããã§ãããã°ã©ã ã¯ãããã2è¡ãåºåãïŒ "\ n"-æ°ããè¡ãäœæïŒãEnterãæŒãããã®ãåŸ
ã£ãŠãåã³è¡ãåºåããŸãã

ã¹ã¯ãªãããè©ŠããŠãã ããïŒ
次ã«ãé¢æ°ãå«ãmain.cppã®äŸãšscript.luaã®äŸã瀺ããŸãã
#include "Script.h" #include <conio.h> #include <Windows.h> #include <time.h> Script script; int Write(lua_State*) { // for(int i = 1; i < script.GetArgumentCount()+1; i++) cout << script.GetArgument<char*>(i); cout << "\n"; return 0; } int GetString(lua_State*) { // cin , Script char* str = ""; cin >> str; script.Return<char*>(str); // ! 1 -> return 1 return 1; } int Message(lua_State*) { // MessageBox Windows.h // , - :) char* msg = script.GetArgument<char*>(1); MessageBox(0,msg,"",MB_OK); return 0; } int GetTwoRandomNumbers(lua_State*) { // 1000 srand(time(NULL)); for(int i = 0; i < 2; i++) script.Return<int>(rand()%1000); // 2 return 2; } int GetLotOfRandomNumbers(lua_State*) { // 1000 srand(time(NULL)); for(int i = 0; i < script.GetArgument<int>(1); i++) script.Return<int>(rand()%1000); // , return script.GetArgument<int>(1); } int main() { script.Create(); script.RegisterConstant<lua_CFunction>(Write,"Write"); script.RegisterConstant<lua_CFunction>(GetString,"GetString"); script.RegisterConstant<lua_CFunction>(Message,"Message"); script.RegisterConstant<lua_CFunction>(GetTwoRandomNumbers,"Rand1"); script.RegisterConstant<lua_CFunction>(GetLotOfRandomNumbers,"Rand2"); script.Array(); script.RegisterConstantArray<int>(1,1); script.RegisterConstantArray<int>(2,2); script.RegisterConstantArray<int>(3,3); script.RegisterConstantArray<int>(4,4); script.RegisterArray("mass"); script.DoFile("script.lua"); script.Close(); // _getch(); }
for i = 1, 4 do Write(i, "\n", "Hier kommt die Sonne", "\n") end Write(2*100-1) Message("!") a, b = Rand1() Write(a, "\n", b, "\n") Write(Rand1(), "\n") a, b, c, d = Rand2(4) Write(a, "\n", b, "\n", c, "\n", d, "\n") return 1
圹ã«ç«ã€ãã³ã
- ã¹ã¯ãªããã¯ã©ã¹ã®å Žåãã¹ã¯ãªãããã©ã®æ¡åŒµåã«ãããã¯é¢ä¿ãããŸãããå°ãªããšã.txtã.luaã.bmpã§ããã.luaã¯YaP Luaã®å€ãã®ãšãã£ã¿ãŒã«ãã£ãŠéãããŸãã
- Luaã³ãŒããšãã£ã¿ã䜿çšããŸããã³ãŒããæžãã®ã¯éåžžã«å°é£ã§ããendãdoããŸãã¯ãã®ä»ã®ããšãæžãã®ãå¿ããããšããããŸãã luaã¹ã¯ãªããã®ãšã©ãŒã«ããããã°ã©ã ã¯ã¯ã©ãã·ã¥ããŸããããåã«ã³ãŒããå®è¡ããŸãã
- Luaã¯ãæã£ãŠãããããã¯ããã«æè»ã§ãã ããšãã°ãæ°å€ã¯èªç±ã«æååã«å€æãããåæå®ãããŠããŸããã é¢æ°ã«100åã®ãã©ã¡ãŒã¿ãŒãæž¡ããC ++ã®æåã®2ã€ã ããèªã¿åãå Žåãããã°ã©ã ã¯ã¯ã©ãã·ã¥ããŸããã ããã«å€ãã®ãã®ãããªä»®å®ããããŸãã
質çå¿ç
- 質åïŒåæ§ã®åé¢æ°ãæã€luaç¶æ
-int fooïŒlua_State * LïŒã䜿çšããªãã®ã¯ãªãã§ããïŒ
åçïŒããã°ã©ã å
šäœã§ã¯ãã¹ã¯ãªããã§ç¶æ
ã1ã€ã ã䜿çšããŸãããã®ç¶æ
ã§ã¯ãé¢æ°ãç»é²ããåæåããä»ã®ããšãè¡ããŸãã ããã«ãã¯ã©ã¹å
šäœãèšè¿°ããåã³lua_pushbooleanããã³ãã®ä»ã®é¢æ°ã䜿çšããŠlua_Stateãæ£çŽã«åç
§ããããšã¯ãåã«å©çããããŸããã
Script.hããã³Script.cppã®å®å
šãªãªã¹ã
Script.h #ifndef _SCRIPT_H_ #define _SCRIPT_H_ #pragma comment(lib,"lua.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } class Script { private: lua_State *lua_state; public: void Create(); void Close(); int DoFile(char* ScriptFileName); template<class t> void RegisterConstant(T value, char* constantname); void Array(); template<class t> void RegisterConstantArray(T value, int index); void RegisterArray(char* arrayname); int GetArgumentCount(); template<class t> T GetArgument(int index); template<class t> void Return(T value); }; #endif
ã³ã³ãœãŒã«ãæäœããããã®ã€ã³ã¯ã«ãŒããåé€ããŸãã
Script.cpp #include "Script.h" void Script::Create() { lua_state = luaL_newstate(); static const luaL_Reg lualibs[] = { {"base", luaopen_base}, {"io", luaopen_io}, {NULL, NULL} }; for(const luaL_Reg *lib = lualibs; lib->func != NULL; lib++) { luaL_requiref(lua_state, lib->name, lib->func, 1); lua_settop(lua_state, 0); } } void Script::Close() { lua_close(lua_state); } int Script::DoFile(char* ScriptFileName) { luaL_dofile(lua_state,ScriptFileName); return lua_tointeger(lua_state, lua_gettop(lua_state)); } template<> void Script::RegisterConstant<int>(int value, char* constantname) { lua_pushinteger(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<double>(double value, char* constantname) { lua_pushnumber(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<char>(char* value, char* constantname) { lua_pushstring(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<bool>(bool value, char* constantname) { lua_pushboolean(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<lua_cfunction>(int(*value)(lua_State*), char* constantname) { lua_pushcfunction(lua_state, value); lua_setglobal(lua_state,constantname); } void Script::Array() { lua_createtable(lua_state, 2, 0); } template<> void Script::RegisterConstantArray<int>(int value, int index) { lua_pushnumber(lua_state, index); lua_pushinteger(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<double>(double value, int index) { lua_pushnumber(lua_state, index); lua_pushnumber(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<char>(char* value, int index) { lua_pushnumber(lua_state, index); lua_pushstring(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<bool>(bool value, int index) { lua_pushnumber(lua_state, index); lua_pushboolean(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<lua_cfunction>(lua_CFunction value, int index) { lua_pushnumber(lua_state, index); lua_pushcfunction(lua_state, value); lua_settable(lua_state, -3); } void Script::RegisterArray(char* arrayname) { lua_setglobal(lua_state, arrayname); } int Script::GetArgumentCount() { return lua_gettop(lua_state); } template<> int Script::GetArgument<int>(int index) { return lua_tointeger(lua_state,index); } template<> double Script::GetArgument<double>(int index) { return lua_tonumber(lua_state,index); } template<> char* Script::GetArgument<char>(int index) { return (char*)lua_tostring(lua_state,index); } template<> bool Script::GetArgument<bool>(int index) { return lua_toboolean(lua_state,index); } template<> void Script::Return<int>(int value) { lua_pushinteger(lua_state,value); } template<> void Script::Return<double>(double value) { lua_pushnumber(lua_state,value); } template<> void Script::Return<char>(char* value) { lua_pushstring(lua_state,value); } template<> void Script::Return<bool>(bool value) { lua_pushboolean(lua_state,value); }
libãšincludãå«ããªããžããªïŒ
https :
//github.com/Izaron/LuaForHabrãã¹ãŠã®è³ªåãPMã«éä¿¡ãããããã®ãããã¯ã«éä¿¡ããããHabréã«ç»é²ã§ããªãå Žåã¯ãã¡ãŒã«izarizar@mail.ruã«éä¿¡ããŠãã ããã