LUA-VRP实例教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
haoLUA-VRP开发帮助
1.LUA-VRP开发模式
Lua是执行效率相当高的一种脚本语言,所以用户可以把大量的运算任务交给Lua脚本处理而不必过分担心执行效率。Lua用C语言编写,所以能够很好的和C/C++工程结合使用。
使用脚本模式作为开发的一部分能够有效的隔离项目的内核模块和逻辑模块。
我们把Lua脚本依附的C/C++工程称作宿主程序,在这里VRP-Builder/ VRP-Player/ VRPSDK- APP 就是宿主程序。每一组Lua代码运行需要一个Lua虚拟机环境,用Lua 句柄表示,每个Lua虚拟机是彼此隔离的,就像若干台电脑彼此独立运行,除非通过宿主程序通信。每个Lua虚拟机有自己的线程,一个宿主程序可以并发运行多个Lua虚拟机。
VRP和Lua通过相互调用来实现交互和信息传递。
1.VRP调用LUA的方法如下:
在VRP中我们通过“调试”中的“加载Lua文件”开启一个lua句柄
这个句柄是当前虚拟机指定的名称,这个文件就作为这个虚拟机初始编译并且执行的文件。比如lua名称句柄可以是lua_handle0,文件名称是C:\test.lua,那么VRP脚本运行到这个命令的时候就会建立名叫lua_handle0的Lua虚拟机,并且编译并运行 C:\test.lua。
如果只运行一次C:\test.lua文件不足以解决问题的时候,我们就要在VRP需要的地方运行“执行lua函数”命令,
其中lua名称句柄就是已存在的包含这个函数的虚拟机的句柄,函数名称就是已编译lua文件中的某个函数名称。如果需要传入参数可以执行“执行lua扩展函数”它提供2个字符串参数可以传入lua函数,相应的Lua函数形式也要有两个参数的输入。
2.LUA调用VRP的方法如下:
通过在任何地方写入sys.DoScript(“
例如sys.DoScript("显示/隐藏FPS, 1");
通过sys.GetValue(“VRP变量名称”);来获得VRP变量的值
例如local numResult = sys.GetValue("mTemp");
这样当VRP需要调用参数多余2个的LUA函数时,我们可以通过VRP设定参数值,在LUA中获得参数值来实现更多值的通信。
2.一个简单的例子
在VRP中我们制作了一个简单的场景,分别有3个立方体,Box1,Box2,Box3
下面我们在sample目录下建立一个空的文本文件sample0.txt,然后改后缀为lua
在VRP初始化函数里,我们加入了加载这个空的lua文件
点击Box03我们加入鼠标点击事件来调用lua函数,这个函数名称叫做OnBox3,但是目前我们还没有在sample0.lua文件里写这个函数
OnBox03的作用是获得系统时间,并调用VRP消息窗口显示它
下面是Lua代码
function OnBox3()
local time = os.date();
sys.DoScript("字符串连接, "..time..", , , , , ");
sys.DoScript("弹出上一个获取的信息, 当前时间");
return;
end
一个函数用“function 函数名称”
。。。。。。
End
来表示
Lua的注释是用“- -”来说明后面的当前行文字都是注释文字
local time = os.date();这一行的意义是建立一个局部变量time,并调用获得系统时间函数os.date()获得系统时间给time变量。
变量需要先声明,再使用,一个变量可以是全局变量,声明时前面不加local,也可以是局部变量,只在函数或者循环块里有效,前面加local。
下面的sys.DoScript(“”)函数就是直接调用VRP命令,Lua中字符串连接很简单,只需要用..来连接上一个或者下一个字符串,也可以双向连接。
每个函数可以有return 也可以没有return 语句返回。
下面就是运行时点击Box03的图片
下面我们编写点击Box2触发的Lua函数
function OnBox2()
local num = 1;
for i = 1, 10, 1 do
num = num * i;
end;
sys.DoScript("字符串连接, "..num..", , , , , ");
sys.DoScript("弹出上一个获取的信息, 1-10阶乘");
return;
end
这个函数的目的是计算1到10的阶乘,也就是1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = ? VRP脚本本身没有循环语句,所以用 Lua 循环逻辑控制就很方便
Lua的循环语句是 for i = 初始值,最大值,递增值 do
。。。。。。循环体
End
下面就是运行时截图
点击Box01的lua函数是
function OnBox1()
local hour = os.date("%I", os.time());
local minute = os.date("%M", os.time());
local second = os.date("%S", os.time());
hour = hour / 12;
minute = minute / 60;
second = second / 60;
local radh = -math.pi * hour * 2;
local radm = -math.pi * minute * 2;
local rads = -math.pi * second * 2;
local posX = math.cos(radh) * 50;
local posZ = math.sin(radh) * 50;
local posY = 0;
--sys.DoScript("字符串连接, "..posX..", , , , , ");
--sys.DoScript("弹出上一个获取的信息, 测试");
sys.DoScript("定位移动模型, Box03, 1, "..posX.."/"..posY.."/"..posZ..", 1");
local posX = math.cos(radm) * 50;
local posZ = math.sin(radm) * 50;
local posY = 0;
sys.DoScript("定位移动模型, Box02, 1, "..posX.."/"..posY.."/"..posZ..", 1");
local posX = math.cos(rads) * 50;
local posZ = math.sin(rads) * 50;
local posY = 0;
sys.DoScript("定位移动模型, Box01, 1, "..posX.."/"..posY.."/"..posZ..", 1");
return;
end
这个函数的目的是用Box03, Box02, Box01分别表示时针,分针,秒针显示当前时间。
他调用lua库函数os.date()通过传入不同的参数返回时分秒,这些不用记,只要知道需要的时候到哪里去查例子就可以了。
math.pi 是圆周率 3.14……..
math.cos就是计算余弦值