Vytvoříme Lua skript funkci
int K3d_GetSphere(const char* _strName)
která bude volat fukci herního enginu
int K3dSphereBuild::FindSphereId(const char* _strName)
Funkce vrátí index koule podle jména
_strName
class K3dVM{static K3dLua *ms_pLua;static K3dGameData *ms_pGameData; ///< Global game data, data centered game systemstatic K3dScene *ms_pScene;static K3dSphereBuild *ms_pSphereBuild; ///< Pointer to sphere build object for find sphere index from sphere namestaticvoid *ms_pObject; ///< Pointer to some voidstaticint K3d_GetSphere(lua_State *_pState);int GetSphere(constchar* _strName); public: K3dVM(K3dGameData *_pGameData, K3dScene *_pScene); K3dVM(){} ~K3dVM();void RegisterFunctions();void LoadScript(K3dString _strFilename);void LF_Init();void LF_Update();void LF_Delete();};
3. V konstruktoru této třídy
K3dVM::K3dVM(K3dGameData *_pGameData, K3dScene *_pScene){ ms_pGameData = _pGameData; ms_pScene = _pScene; ms_pLua = new K3dLua(); ms_pSphereBuild = new K3dSphereBuild(_pGameData); RegisterFunctions();}
3.1 Připojíme Lua skriptovací jazyk ms_pLua = new K3dLua();
(volá se konstruktor třídy K3dLua)
4.1 Jednoduchý Lua skript uložíme jako soubor test_script.lua
5. Pokud je naše funkce zaregistrovaná, bude se automaticky volat stejná statická funkce VM (virtual machine) třídy
///\briefScriptfunctioncallingGetSpherefunctionint K3dVM::K3d_GetSphere(lua_State *_pState){// Cast the void pointer K3dVM *pSomeClass = (K3dVM*)ms_pObject;// Get function parameterconstchar* strParam = (constchar*) lua_tostring(_pState, 1); // Try call non static functionint iResult = pSomeClass->GetSphere(strParam);// Push result into script function lua_pushnumber(_pState, iResult);// Return number of resultsreturn1;}
5.1 Protože je funkce statická a budeme volat nestatickou funkci, přetypujeme ukazatel void na třídu K3dVM
K3dVM *pSomeClass = (K3dVM*)ms_pObject;
5.2 Získáme první parametr skriptovací funkce, což je název koule
5.3 Voláme nestatickou funkci GetSphere přetypované třídy K3dVM s parametrem názvu koule.
int iResult = pSomeClass->GetSphere(strParam);
5.3.1 Funkce GetSphere najde a vrací index koule podle názvu koule. Pokud název nesouhlasí funkce vrací index -1
///\briefGetsphereindexfromgamedata///\param_strName Sphere name///\retvalint Sphere index. If return -1, then doesn`t exist current sphereint K3dVM::GetSphere(constchar* _strName){// Find sphere index by sphere nameint iId = ms_pSphereBuild->FindSphereId(_strName);return iId;}
int error = ms_pLua->LuaLoadFile( _strFilename.GetString().c_str());
///\briefLoadluascriptfile///\param_strFilename Filename string///\retvalint Positive value, if file correctly loaded int K3dLua::LuaLoadFile(constchar *_strFilename){return luaL_loadfile(m_pLua, _strFilename);}
6.2 Pokud se soubor podaří otevřít, spustíme skript voláním funkce
LuaPCall
s nulovými parametry
error = ms_pLua->LuaPCall(0, 0, 0);
///\briefCallluascript///\param_iNumArgs Number of arguments///\param_iNumResults Number of results///\param_iErrFunc Error function indexint K3dLua::LuaPCall(constint _iNumArgs,constint _iNumResults,constint _iErrFunc){return lua_pcall(m_pLua, _iNumArgs, _iNumResults, _iErrFunc);}