ゲーム内のインターフェイスはLUAで書かれていて、これはWOWと全く同じです。年末だし。
lua言語ルール:
lua_State *L = lua_open(); //LUAステートマシンの作成
luaopen_base(L); //
const char *buf = "print('hello, world!')";
lua_dostring(buf); //例)bufをluaに書き込んで実行する。
lua_close(L); // Lを閉じる
lua_pushstring(L, "var"); //スタックに変数名を置く]
lua_getglobal(L, "var"); //変数の値はスタックの一番上にある。
int var = lua_tonumber(L, -1); //スタックの一番上の要素を取得する
lua_tostring( ls, -1 ); //取得栈顶的的元素, 一般用于参数传递
lua_pushstring( ls, s_szPlayer ); //例:文字列要素をスタックに押し込む。
lua_pushnumber(L, 200); //ある数値要素をスタックに押し込む。
lua_register(L, "foo", foo);
// ++Luaで書かれた関数fooは、Luaスクリプトで呼び出せるようにLuaに登録されている。
Luaでは、関数は変数と等価なので、この方法で関数を取得できます:
lua_getglobal(L, "main");//この関数はスタックの一番上にある。
これで、この関数を呼び出し、正しい引数を渡すことができます:
lua_pushnumber(L, 100); //引数を積み重ねる
lua_pcall(L, 1, 1, 0); //调用函数,有一个参数,一个返回值 //返回值现在栈顶
int result = lua_tonumber(L, -1);
例
#include " 例.h"
#include "lauxlib.h"
#include " 例lib.h"
int foo( 例_State *L)
{
例: // まず、スクリプトがこの関数を実行したときにスタックに押された引数を取り出す。
// この関数は1つの引数を取り、2つの戻り値を持つとする。
//get the first parameter
const char *par = 例_tostring(L, -1);
例: printf(")%s
", par);
//push the first result
例_pushnumber(L, 100);
//push the second result
例_pushnumber(L, 200);
//return 2 result
return 2;
}
int main(int argc, char *argv[]){
lua_State *L = lua_open();
例_base(L);
例_io(L);
lua_register(L, "foo", foo);
const char *buf = "r1, r2 = foo("hello") print(r1..r2)";
lua_dostring(L, buf);
lua_close(L);
return 0;
}