
访问全局变量表
arg就知道了
你带进去的参数true 是arg[1]
但是要注意的一点 这里是字符串true而不是booleantrue
还有一些其他参数也会有用 比如arg[0]就是你的lua文件所在路径什么的
Lua 与 delphi 的互动,通常是在 delphi 中加载 Lua 的库,比如 Lua for delphi 等。
假设用 Lua 编写了一个函数(保存在 lua_GetColorlua 文件中):
function nogi_GetColor(nR,nG,nB)if nR <= 25 and nG <= 25 and nB <= 25 then -- 取出25以下黑色
return 1;
end;
return 0;
end
那么调用上面 Lua 函数的代码:
uses LUA, LUALIB; //引入LUA库function lua_CheckColor(r,g,b:Integer):Boolean;
var
Lua : TLua;
begin
Lua := TLuaCreate;
luaopen_debug(LuaInstance); //如果要使用debug库
luaopen_math(LuaInstance);// 如果要使用math库 不然就会attempt to index global 'math' (a nil value)
luaopen_os(LuaInstance);
luaopen_string(LuaInstance);
luaopen_table(LuaInstance);
LuaDoFile('lua_GetColorlua');
lua_getglobal(LuaLuaInstance,'nogi_GetColor');
lua_pushnumber(LuaLuaInstance, r); //将脚本中add函数使用的参数压栈
lua_pushnumber(LuaLuaInstance, g); //将脚本中add函数使用的参数压栈
lua_pushnumber(LuaLuaInstance, b); //将脚本中add函数使用的参数压栈
lua_pcall(LuaLuaInstance, 3, 1,0) ;
Result := (lua_toInteger(LuaLuaInstance,-1) = 1);
LuaFree;
end;
--移除文件
function MkidrremoveFile(path)
iowritefile(path, "")
osremove(path)
end
--读取文件
function MkidrreadFile(path)
local file = ioopen(path, "rb")
if file then
local content = file:read("all")
ioclose(file)
return content
end
return nil
end
-- Lua lfs 库的使用
lfsattributes(filepath [, aname]) 获取路径指定属性
lfschdir(path) 改变当前工作目录,成功返回true,失败返回nil加上错误信息
lfscurrentdir 获取当前工作目录,成功返回路径,失败为nil加上错误信息
lfsdir(path) 返回一个迭代器(function)和一个目录(userdata),每次迭代器都会返回一个路径,直到不是文件目录为止,则迭代器返回nil
lfslock(filehandle, mode[, start[, length]])
lfsmkdir(dirname) 创建一个新目录
lfsrmdir(dirname) 删除一个已存在的目录,成功返回true,失败返回nil加上错误信息
-- Lua io *** 作
ioopen (filename [, mode])
功能:按指定的模式打开一个文件,成功则返回文件句柄,失败则返回nil+错误信息
mode:
"r": 读模式 (默认);
"w": 写模式;
"a": 添加模式;
file:write()
功能:按指定的参数格式输出文件内容,参数必须为字符或数字,若要输出其它值,则需通过tostring或stringformat进行转换
file:close()
功能:关闭文件,lua有垃圾自动回收
ioexists()
测试文件是否存在,如果存在返回true
-- Lua os *** 作
osremove (filename)
功能:删除文件或一个空目录,若函数调用失败则返加nil加错误信息
osrename (oldname, newname)
功能:更改一个文件或目录名,若函数调用失败则返加nil加错误信息
ossetlocale (locale [, category])
功能:设置程序的当前设置,函数返回最新的值,失败则返回nil
ostime ([table])
功能:按table的内容返回一个时间值(数字),若不带参数则返回当前时间table的字段:
static int ABC(lua_State L)
{
int n =lua_gettop(L);
double sum =0;
int i;
for (i=1;i<n;i++)
{
sum+=lua_tonumber(L,i);
}
lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
return 2;
} lua_register(L, "ABC", ABC);
lua中table的赋值,其实传递的是地址, *** 作被赋值的表内的 元素 ,会影响原来的table;但如果 *** 作的是被赋值的表这个变量本身,相当于改变了其“指针的指向”,不会影响到原来的table了。
弄懂了table赋值的问题,它作为函数参数的问题就迎刃而解了。函数内部使用的参数table,其实就是使用的它的拷贝(赋值)。
table的赋值会使两个表产生关联,可能导致一些意外的修改。为了解决这个问题,就需要用到table的克隆。
luaci给的方法:
1、首先通过解压游戏资源包,获取游戏脚本文件,可以直观的看到函数名称、参数等,是最佳的方法。
2、其次游戏没有验证lua、luaplus等dll,可以修改源码编译一个新的dll,在register函数里打印出注册的函数名称、函数地址等等。
3、然后用IDA、OllyDBG等工具查看反编译代码获取参数等信息。
4、最后直接用OllyDBG跟lua的register函数并配合所有参考字符串列表,看看都注册了哪些函数。
在Lua 52及之前的版本,所有数值都以双精度浮点格式表示,从53版本开始,Lua语言的number分为integer的64位整型和被称为float的双精度浮点型,若想要32位的整型和单精度浮点类型,可以将Lua 53编译为精简Lua(Small Lua)模式
可以使用%a参数进行格式化输出,如:
这种格式很难阅读,但是可以保留所有浮点数的精度,并且比十进制转换速度更快
// 区分整数和浮点数,由于53版本之前没有整数的概念,所以mathfloor永远返回整数,// 的 *** 作数只要有一个浮点数,则向下取整返回浮点数
取模运算的定义:
由此可知,取模和取余数差不多,当想要一个值不超过某个范围的时候,就对该值进行取模, 在整数的情况下, a % b 取模的值永远在[1,b-1]范围内,即 5 % 3的取模结果在[1,3]之间
Lua语言的关系运算六种
标准数学库math,包括三角函数(sin,cos,tan,asin等)、指数函数、取整函数、最大和最小函数max和min,random以及常量pi和huge(最大可表示数值,在大多数平台上代表inf)
mathrandom
mathrandomseed 用于设置伪随机数发生器的种子,看例子就明白了了
mathrandomseed每次设置一样的值,则mathrandom就会生成一样的随机数,不管mathrandom带不带参数。
三个取整函数:
floor 向负无穷取整;
ceil 向正无穷取整;
modf 向0取整,并会返回小数部分作为第二个结果;
如果想将数值x向最近的整数取整,这个问题没看懂??????
数学库中的常量定义了整型值的最大值mathmaxinteger和最小值mathmininteger
这段内容也没完全看懂?????
整型转行成浮点型
浮点型转行成整型
可以充分利用mathtointeger函数来判断一个数值是否为整数
从上到下,优先级从高到低
在二元运算符中,除了幂运算和连接 *** 作符是右结合外,其他都是左结合
Lua 53 支持的最大整数为2^63,而Lua 52支持的最大整数为2^53,由于52及以下版本没有整数,所以跟整数相关的函数都不支持,如mathtype()、mathmaxinteger、mathmininteger、mathtointeger等
以上就是关于lua tArgs参数问题全部的内容,包括:lua tArgs参数问题、delphi 怎么获取lua 函数的返回值、Lua 文件读取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)