ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:37.06KB ,
资源ID:30163673      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30163673.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(林登脚本语言指南.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

林登脚本语言指南.docx

1、林登脚本语言指南1.导论林登脚本语言(LSL)是一种简单易学,并能给Second Life中的物体赋予生命的强大语言。它的语法与C/JAVA语言的风格类似,每一个脚本中都有一个隐型状态机。同一个物体可以被赋予多个不同的脚本,也允许利用一个只有简单函数功能的脚本来进行升级。这使得脚本会表现出特定的功能(如“漂浮”,“跟随”等等)也允许他们联合起来组成新的行为。脚本语言会被编译成可执行的代码,就像JAVA一样,代码可以在仿真器的虚拟机上运行。所有脚本分享仿真器分配的时间片,所以一个有很多脚本的仿真器能允许每个脚本执行时间更短,而不会降低性能。另外,每一个脚本在其自己的内存空间中运行,以防止脚本对仿

2、真器的保护内存或者对其他脚本进行改写,使得脚本程序很难影响仿真器。这个指南为读者介绍了LSL语言的基本特征,如何编辑和应用你的脚本,如何完善的引用标准常量,事件和库函数。2.现在开始你可能很想知道你可以利用LSL做些什么,你多久能掌握它。我们要开始一些简单的例子,解剖他们,并在同时向你介绍一些脚本的开发过程。2.1. Hello Avatar按照惯例,程序语言的教程总是以“Hello”开始,我们也不改变这个惯例。虽然这个小程序没有什么特别的用处,但这个例子可以让我们知道以下几件事:创建一个基本脚本脚本状态调用函数脚本事件在物体上应用脚本2.1.1. 创建脚本打开你的“清单栏(Inventory

3、)”,在下拉列表中选择“建立(Create)|新脚本(New Script)”。这时在你的“脚本”目录中会出现一个名为“新脚本”的空白文件。双击脚本的文件名或图标在编辑器中打开脚本文件。当你打开这个脚本的时候,窗口中会自动的插入一些基本的LSL语言框架。会像下面这样:defaultstate_entry()llSay(0, Hello, Avatar!);touch_start(integer total_number)llSay(0, Touched.);对这个脚本进行测试,当它进入某种状态,比如被触摸的时候。会显示“Hello, Avatar!”,和“Touched”。 因为这也许是你第一

4、次看到一个程序指令,让我们来分解这段小指令,一个小段一个小段地进行解释。2.1.2. 默认状态default.所有的LSL脚本都有一个简单的隐型状态机,它可以有一种或多种状态。所有的脚本必须有一个默认状态,所以如果脚本只有一个状态,那么它就会是“默认”状态。当一个脚本第一次启动或者重启时,它会从默认状态开始。默认状态通过把default(默认)放在文档的最顶层,用花括号“”开始,并以“”结束。 因为默认状态是一个特殊状态,你必须把它和其他状态区别开。每次当你进入一个状态,脚本引擎会自动的调用state_entry()事件,从那里开始生成执行代码。当状态结束,脚本引擎会在调用下一个state_e

5、ntry处理之前自动调用state_exit()事件。在上面的例子中,我们在state_entry()中调用了llSay()函数,而并没有定义一个state_exit()。进入(entry)和退出(exit)处理是一个初始化状态数据和清除诸如“listen”事件回调函数的地方。在第五章中你能了解到关于默认状态,如何创建和利用其他状态的具体方法。2.1.3. 函数LSL语言有超过200个内建函数,允许脚本和物体在环境中相互影响。所有的内建函数均以“ll”开头。上面的例子中两次调用了llSay()函数,llSay()的作用是在特定信道中显示文字。llSay( integer channel,str

6、ing text );Channel是信道的号,信道0是公共聊天信道,所有的人物都能够看到聊天信息。信道1到信道2147483648是专用信道,人们无法看到,仅供其它脚本从中获取信息。你可以定义自己的函数,但函数名不能是保留字,内建常量,或者内建函数。2.1.4. 触摸事件touch_start(integer total_number)llSay(0, Touched.);许多事件可以通过在你的脚本中声明一个事件处理程序来检测。touch_start()事件会在用户触摸到物体的时候发生。2.1.5. 尝试既然我们已经看过默认脚本,也解释了其中的一些细节,现在可以试着运行这个脚本。点击“保存”

7、保存这个脚本。在保存处理中,编辑器会保存代码然后将代码编译成字节码然后再进行储存。当你在预览窗口中看到提示“编译完成(Compile successful)!”时,编译已经完成并保存。为了测试这个脚本,你要把它应用到一个物体中。创建一个物体的方法是在主视窗中点击“创建”。当那个棒棒出现的时候,你能够在世界中创建一个简单的物体。当物体被创建时,你能把你新编写的脚本拖拽到物体上,运用这个脚本。当你把脚本拖拽到物体上以后,你就能看到物体显示出“Hello Avatar!”的信息。确保触摸事件能够在你点击的时候发生。当你点击物体时应该能在聊天历史中看到信息“Touched”。2.2.使用内建编辑器内建

8、编辑器有着基本文本编辑器所具有的大多数功能。你可以用鼠标或shift键+方向键选中文本。你可以使用Ctrl+X, Ctrl+C,Ctrl+V对文本进行剪切,复制,和粘贴,或者在“编辑”下拉菜单中选择上述操作。2.3.使用其他编辑器因为内建编辑器支持从剪贴板粘贴,所以你可以用其他的编辑器进行脚本编辑,然后复制到Second Life中。3.基础教程既然我们已经看见一个简单程序的运行了,现在就看看如何自己编程吧.下面这些工具用来构架基本程序块从而编程,并且会在实际中应用到。3.1.注释为你的脚本加上注释是一个很好的习惯,在你更新、修改或者使用别人的脚本的时候,注释会很有帮助。除非脚本很容易懂,否则

9、你应该加上注释。1. 在脚本的开始要注明脚本的功能2. 在每一个全局变量之前要注明它在哪一段是全局的3. 在每一个全局函数之前要注明它的功能4. 在你自己一眼看不出代码功能的地方,加些注释LSL语言使用和Java/C+一样风格的单行注释。/ 这个脚本触发一个物体的旋转/ g_is_rotating 保存旋转的当前状态。 TRUE 表示/ 正在旋转, FALSE 表示其他情况。integer g_is_rotating = FALSE;default/ 在触摸时触发状态touch(integer num)if(g_is_rotating)/ 关闭旋转llTargetOmega(, 0, 0);g

10、_is_rotating = FALSE;else/ 绕Z轴正半轴旋转,向上方。llTargetOmega(, 4, 1);g_is_rotating = TRUE;3.2.算术操作LSL中支持大多数算术操作,和C/JAVA语法相同。3.2.1. 赋值大多数的算术操作都是赋值,使用“=”表示。简单的说就是把等式右边的值赋予左边,但是左边只能是一般变量。所有的基本类型支持赋值“=”,相等“=”,和不等“!=”操作。/ 保存目标物体信息的变量key g_target;vector g_target_postion;float g_target_distance;/ 赋值函数范例set_global

11、s(key target, vector pos)g_target = target;g_target_position = pos;/ 利用函数返回值来赋值vector my_pos = llGetPos();g_target_distance = llVecDist(g_target_position, my_pos);3.2.2. 十六进制的使用整数会以十六进制的形式输入,例如:integer Mask = 0xff;/ 等于整数255;integer Bit= 0x0100; / 等于整数256;3.2.3. 二进制运算操作二进制运算就像是一个有两个同类参数的函数,然后返回那个类型;然

12、而语法有些不同。表3-1 二进制运算符运算符含义+加法-减法*乘法/除法%求模异或右移每一个运算符都有详细的解析,请参见类型章节获得详情。3.2.4. 布尔型操作表3-2 布尔运算符运算符含义如果操作符左边大于右边则返回“TRUE”=如果操作符左边大于等于右边则返回“TRUE”&如果操作符左右两边均为真则返回“TRUE”|如果操作符左右两边有一边为真则返回“TRUE”!否定运算符3.2.5. 位运算操作表3-3 位运算符运算符含义&按位与|按位或取反3.3.类型变量,返回值和变量都是有不同的类型的。LSL中提供了几种基本的数据类型。LSL 类型整型(Integer)一个32位带符号的整型值的有

13、效范围是从-2147483648到2147483647。浮点(Float)一个IEEE标准32位浮点型值得有效范围是从1.175494351E-38到 3.402823466E+38。键值(Key)键值是在SL中一个唯一的,可以用来引用物体的标识。矢量(Vector)矢量值中包括3个浮点值。矢量值可以用来指示3维位置,方向,速度,力量,脉冲,甚至颜色。每个部分可以通过xy和z来访问。表 3-4. 矢量算术运算符运算符含义+两个向量相加-从一个向量中减去另一个*向量点乘%向量叉乘旋转(rotation)旋转型变量中有4个浮点型函数。成员可以通过xyz和s访问。表 3-5. 旋转运算符运算符含义+

14、两个旋转量相加-一个旋转量减去另一个*将第一个旋转量转到第二个量所需要的旋转量(第二个量为目标量)/将第一个旋转量转到第二个量所需要的反向旋转量(第二个量为目标量)列表(list)列表是另外一种数据类型。列表用括起来,内部的各个值用逗号隔开。string StringVar = Hello, Carbon Unit;list MyList = 1234, ZERO_ROTATION, StringVar ;生成列表: 1234, , Hello, Carbon Unit 列表可以和其他的列表进行组合。比如:MyList = 3.14159 + MyList;生成列表: 3.14159, 123

15、4, , Hello, Carbon Unit 更简单的:MyList = MyList + MyList;生成: 3.14159, 1234, , Hello, Carbon Unit, 3.14159, 1234, , Hello, Carbon Unit 一些库函数可以从列表中拷贝数据,分类列表,和移除子列表。3.3.1. 类型转换类型转换分为明转换和暗转换。明转换使用类似C语言的语法:float foo_float = 1.0;integerfoo_int = (integer)foo_float;3.3.1.1.暗转换LSL只支持两种暗转换:整型(integer)到浮点型(float

16、)和字符串(string)到键值(key)的转换。因此,你可以在需要浮点量的地方使用一个整型,可以在需要键值的地方输入字符串。3.3.1.2.明转换LSL支持以下形式的转换Integer to String(整型 到 字符串)Float to Integer(浮点型 到 整型)Float to String(浮点型 到 字符串)Vector to String(矢量 到 字符串)Rotation to String (旋转 到 字符串)Integer to List(整型 到 列表)Float to List (浮点型 到 列表)Key to List (键值 到 列表)String to L

17、ist (字符串 到 列表)Vector to List (矢量 到 列表)Rotation to List (旋转 到 列表)String to Integer (字符串 到 整型)String to Float (字符串 到 浮点型)String to Vector (字符串 到 矢量)String to Rotation (字符串 到 旋转 )3.4.全局函数全局函数的声明也和Java/C的风格相似,只是没有void返回值。也就是说,函数在没有返回值的时候不需要定义返回值(C语言中需要定义返回空值void):make_physical_and_spin(vector torque)/ 扭

18、矩变为2倍vector double_torque = 2.0*torque;llSetStatus(STATUS_PHYSICS, TRUE);llApplyTorque(double_torque);3.5.全局变量全局变量在文件的各处都可以调用,全局变量的声明也和Java/C语言类似,但每一行只能声明一个变量:vector gStartPosition;如果需要,全局变量可以被初始化,没有初始化的全局和局部变量会被初始化成0值:vector gStartPosition = 3.6.局部变量局部变量要在它的声明下才可被使用(定义必须放在调用前)。在它们被定义的那个代码段中有效。下面这段合

19、法代码就类似C语言:integer test_function()/ 测试我们在函数中的任何地方都可以调用的向量vector test = ;integer j;for (j = 0; j 10; j+)/ 这个向量和上面定义的不同/ 这是不好的编程习惯vector test = ;/ 测试失败if (test = )/ 无法达到4.流控制LSL有完整的处理条件问题的函数,比如循环或者从脚本的一点跳到另一点。4.1.条件语句if 状态操作符的语法和Java/C语言类似。check_message(string message)if(message = open)open();else if(m

20、essage = close)close();elsellSay(0, Unknown command: + message);当小括号里面的值为非0值时,花括号里面的表达式才会有效。当if后的括号中的值为真(不为零)时,else后的表达式就不再有效。无效符号NULL_KEY等同于假FALSE。当if或者else if 后面的表达式都不是非零整型是,即执行else后面的语句。括号中的表达式可以使用常用的整型运算符或者比较运算符。/一个函数,如果收到了一些用来指导它下一步做什么的信息。这样的代码就像/一个简单的块,一旦条件符合就会一下子被用到程序中。assess_next_step(intege

21、r perm, integer attached, integer balance, float dist)string msg;if(!attached)if(perm & PERMISSION_ATTACH) & (dist 10.0) | (dist 20.0) & (balance 1000)move_closer();elsellRequestPermissions(llGetOwner(), PERMISSION_ATTACH);4.2.循环结构循环是大多数程序语言都有的一种基本构件,LSL中的循环与Java/C的结构相似。4.2.1. for语句当你知道一个操作需要重复多少次的时

22、候使用for语句就显得很有用了。就像Java或者C中的循环,括号里共有三部分, 初值,循环条件,和步长。循环在当中间的循环条件为真时运行,在循环结束时变量会自动增加。/使一个非物理性的块延z轴向上做平缓的上移,移动的动作由许多次连续的移动组成move_up(float distance, integer steps)float step_distance = distance / (float)steps;vector offset = ;vector base_pos = llGetPos();integer i;for(i = 0; i 0)llSay(0, Inventory + (st

23、ring)i + : + name);elsellSay(0, No more inventory items);continue = FALSE; while(continue);4.2.3. while语句While循环和do-while循环很像,不同的是do-while循环先执行代码,再判断下次是否需要继续循环,而while循环先判断,符合条件以后再执行代码。mention_inventory_type(integer type)integer i = llGetInventoryNumber(type);while(i-)llSay(0, item: + llGetInventory(

24、i);4.3.跳转Jump语句用来从一个函数或者一个事件中跳到脚本中的其他地方。但不能跳到别的函数或者事件中。通常,你可以在用if.else条件语句过于复杂的时候使用它。4.4.状态改变状态改变允许你将你的脚本状态在默认状态和用户状态之间转变。你可以通过在事件处理程序的花括号(和)之前使用一个state关键字来定义你自己脚本的状态。你可以使用这样的语法来使用新的状态调用过程:state 。defaultstate_entry()llSay(0, I am in the default state);llSetTimer(1.0);timer()state SpinState;state Spi

25、nStatestate_entry()llSay(0, I am in SpinState!);llTargetOmega(, 4, 1.0);llSetTimer(2.0);timer()state default;state_exit()llTargetOmega(, 0, 0.0);5.状态所有的脚本必须有一个默认(default)状态,在脚本运行的时候会首先进入这个状态。状态包括由LSL触发的事件处理程序。所有的状态必须至少有一个事件处理程序如果不包含任何事件处理程序,那将不是一个状态。当状态改变时,所有的回调设置都会被保持,所有的未决事件都会被清除。5.1. state_entry(

26、)函数state_entry事件在进入一个新的状态时发生,在程序启动时,它总是作为程序的第一个事件来处理。这个事件处理程序没有数据的传输。你有的时候可能会为了让你的物体起作用而在state_entry()中为定时器或传感器设置一个回调函数。警告:这是一个常见的错误,出现这样的问题是因为假设了state_entry()会在你把一个物体从清单栏中拖出来的时候被调用。当你把一个物体放回清单栏中的时候,这个物体当前的状态将被保存。所以,当你再次将这个物体拖出清单栏的时候,state_entry()并没有被调用。如果你想让每次这个物体被拖出来的时候都运行一个启动代码,你需要建立一个全局函数,并在state_entry()和on_rez()函数中都调用它。/全局初始化函数。init()/为物体的拥有者设置一个listen函数。key owner = llGetOwner();llListen(0, , owner, );defaultstate_entry()init();on_rez(integer start_param)init();listen(integer channel, string name, key id, string

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1