在家看看以下代码就明白了.
TNpc = class
l: p_lua_state
FileName : string;
public
constructor Create(sName:string);
destructor Destroy;
procedure Initialize();
procedure run();
function a(x:integer):String
end;
function TNpc.a(x:integer):String
begin
showmessage('avc')
end;
function lua_Num(l: p_lua_state): integer
cdecl;
begin
--要在此调用TNPC类的函数a ,如何调用??
lua_pushnumber(l,30)
//返回值30压栈
result := 1
//定义返回参数的数量并不是具体值,此时为1 个
end;
constructor TNpc.Create(sName:string)
begin
FileName := sName;
l := lua_open()
lua_baselibopen(l);// LUA 内嵌 BASE 库
end;
destructor TNpc.Destroy;
begin
lua_close(l);
end;
procedure TNpc.Initialize();
begin
lua_register(l, 'Num', lua_Num)
//将主程序中的lua_Num函数注册到引擎中,让脚本用Num来调用
luaL_loadfile(l, Pchar(FileName))
//加载脚本
end;
procedure TNpc.run();
begin
lua_resume(L,0)
//脚本使用luaL_loadfile加载时要用lua_resume来返回运行.
lua_getglobal(L, 'add')
//掉用脚本中函数的名称
lua_pushnumber(L, 100)
//将脚本中add函数使用的参数压栈
lua_pcall(L, 1, 1,0)
//调用函数,有一个参数,一个返回值
Form1.Memo1.Lines.Add(lua_tostring(L,1));//返回的参数
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if npc1 <> nil then npc1.Destroy
//防止内存占用
npc1 := TNpc.Create('npc1.lua')
//创建时传入脚本文件名
npc1.Initialize
//初始化
npc1.run
//运行
end;
function a(x:integer):String
begin
这里如何访问b方法,未创建Ta类的实例前
end;