资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1.1.导论导论林登脚本语言(LSL)是一种简单易学,并能给 Second Life 中的物体赋予生命的强大语言。 它的语法与 C/JAVA 语言的风格类似,每一个脚本中都有一个隐型状态机。同一个物体可以被赋予多个不同的脚本,也允许利用一个只有简单函数功能的脚本来进行 升级。这使得脚本会表现出特定的功能(如“漂浮”,“跟随”等等)也允许他们联合起 来组成新的行为。脚本语言会被编译成可执行的代码,就像 JAVA 一样,代码可以在仿真器的虚拟机上运 行。所有脚本分享仿真器分配的时间片,所以一个有很多脚本的仿真器能允许每个脚本执 行时间更短,而不会降低性能。另外,每一个脚本在其自己的内存空间中运行,以防止脚 本对仿真器的保护内存或者对其他脚本进行改写,使得脚本程序很难影响仿真器。这个指南为读者介绍了 LSL 语言的基本特征,如何编辑和应用你的脚本,如何完善的引用 标准常量,事件和库函数。2.2.现在开始现在开始你可能很想知道你可以利用 LSL 做些什么,你多久能掌握它。我们要开始一些简单的例子, 解剖他们,并在同时向你介绍一些脚本的开发过程。2.1.2.1. HelloHello AvatarAvatar按照惯例,程序语言的教程总是以“Hello”开始,我们也不改变这个惯例。虽然这个小程 序没有什么特别的用处,但这个例子可以让我们知道以下几件事:“创建一个基本脚本“脚本状态“调用函数“脚本事件“在物体上应用脚本2.1.1. 创建脚本打开你的“清单栏(Inventory)”,在下拉列表中选择“建立(Create)|新脚本(New Script)”。这时在你的“脚本”目录中会出现一个名为“新脚本”的空白文件。双击脚 本的文件名或图标在编辑器中打开脚本文件。当你打开这个脚本的时候,窗口中会自动的 插入一些基本的 LSL 语言框架。会像下面这样:defaultstate_entry()llSay(0, “Hello, Avatar!“);touch_start(integer total_number)llSay(0, “Touched.“);对这个脚本进行测试,当它进入某种状态,比如被触摸的时候。会显示“Hello, Avatar!”,和“Touched”。 因为这也许是你第一次看到一个程序指令,让我们来分解这 段小指令,一个小段一个小段地进行解释。2.1.2. 默认状态default.所有的 LSL 脚本都有一个简单的隐型状态机,它可以有一种或多种状态。所有的脚本必须 有一个默认状态,所以如果脚本只有一个状态,那么它就会是“默认”状态。当一个脚本 第一次启动或者重启时,它会从默认状态开始。默认状态通过把 default(默认)放在文档的最顶层,用花括号“”开始,并以“”结 束。 因为默认状态是一个特殊状态,你必须把它和其他状态区别开。每次当你进入一个状态,脚本引擎会自动的调用 state_entry()事件,从那里开始生成执 行代码。当状态结束,脚本引擎会在调用下一个 state_entry 处理之前自动调用 state_exit()事件。在上面的例子中,我们在 state_entry()中调用了 llSay()函数,而并 没有定义一个 state_exit()。进入(entry)和退出(exit)处理是一个初始化状态数据 和清除诸如“listen”事件回调函数的地方。在第五章中你能了解到关于默认状态,如何创建和利用其他状态的具体方法。2.1.3. 函数LSL 语言有超过 200 个内建函数,允许脚本和物体在环境中相互影响。所有的内建函数均 以“ll”开头。上面的例子中两次调用了 llSay()函数,llSay()的作用是在特定信道中显示文字。llSay( integer channel,string text );Channel 是信道的号,信道 0 是公共聊天信道,所有的人物都能够看到聊天信息。信道 1 到信道 2147483648 是专用信道,人们无法看到,仅供其它脚本从中获取信息。你可以定义自己的函数,但函数名不能是保留字,内建常量,或者内建函数。2.1.4. 触摸事件touch_start(integer total_number)llSay(0, “Touched.“);许多事件可以通过在你的脚本中声明一个事件处理程序来检测。touch_start()事件会在用 户触摸到物体的时候发生。2.1.5. 尝试既然我们已经看过默认脚本,也解释了其中的一些细节,现在可以试着运行这个脚本。点 击“保存”保存这个脚本。在保存处理中,编辑器会保存代码然后将代码编译成字节码然后再进行储存。当你在预览窗口中看到提示“编译完成(Compile successful)!”时, 编译已经完成并保存。为了测试这个脚本,你要把它应用到一个物体中。创建一个物体的方法是在主视窗中点击 “创建”。当那个棒棒出现的时候,你能够在世界中创建一个简单的物体。当物体被创建 时,你能把你新编写的脚本拖拽到物体上,运用这个脚本。当你把脚本拖拽到物体上以后,你就能看到物体显示出“Hello Avatar!”的信息。确保触摸事件能够在你点击的时候发生。当你点击物体时应该能在聊天历史中看到信息 “Touched”。2.2.2.2. 使用内建编辑器使用内建编辑器内建编辑器有着基本文本编辑器所具有的大多数功能。你可以用鼠标或 shift 键+方向键选 中文本。你可以使用 Ctrl+X, Ctrl+C,Ctrl+V 对文本进行剪切,复制,和粘贴,或者在 “编辑”下拉菜单中选择上述操作。2.3.2.3. 使用其他编辑器使用其他编辑器因为内建编辑器支持从剪贴板粘贴,所以你可以用其他的编辑器进行脚本编辑,然后复制 到 Second Life 中。 3.3. 基础教程基础教程既然我们已经看见一个简单程序的运行了,现在就看看如何自己编程吧.下面这些工具用来 构架基本程序块从而编程,并且会在实际中应用到。3.1.3.1. 注释注释为你的脚本加上注释是一个很好的习惯,在你更新、修改或者使用别人的脚本的时候,注 释会很有帮助。除非脚本很容易懂,否则你应该加上注释。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_is_rotating = FALSE; else / 绕 Z 轴正半轴旋转,向上方。llTargetOmega(, 4, 1); g_is_rotating = TRUE; 3.2.3.2. 算术操作算术操作LSL 中支持大多数算术操作,和 C/JAVA 语法相同。3.2.1. 赋值大多数的算术操作都是赋值,使用“=”表示。简单的说就是把等式右边的值赋予左边,但 是左边只能是一般变量。 所有的基本类型支持赋值“=”,相等“=”,和不等“!=”操作。 / 保存目标物体信息的变量key g_target; vector g_target_postion; float g_target_distance;/ 赋值函数范例set_globals(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. 二进制运算操作二进制运算就像是一个有两个同类参数的函数,然后返回那个类型;然而语法有些不同。 表 3-1 二进制运算符运算符运算符含义含义+加法-减法*乘法/除法%求模异或 右移每一个运算符都有详细的解析,请参见类型章节获得详情。3.2.4. 布尔型操作表 3-2 布尔运算符运算符运算符含义含义如果操作符左边大于右边则返回“TRUE”=如果操作符左边大于等于右边则返回“TRUE”list MyList = 1234, ZERO_ROTATION, StringVar ;生成列表: 1234, , “Hello, Carbon Unit“ 列表可以和其他的列表进行组合。比如:MyList = 3.14159 + MyList;生成列表: 3.14159, 1234, , “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; integer foo_int = (integer)foo_float;3.3.1.1. 暗转换LSL 只支持两种暗转换:整型(integer)到浮点型(float)和字符串(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 List (字符串 到 列表) Vector to List (矢量 到 列表) Rotation to List (旋转 到 列表) String to Integer (字符串 到 整型) String to Float (字符串 到 浮点型)String to Vector (字符串 到 矢量) String to Rotation (字符串 到 旋转 )3.4.3.4. 全局函数全局函数全局函数的声明也和 Java/C 的风格相似,只是没有 void 返回值。也就是说,函数在没有 返回值的时候不需要定义返回值(C 语言中需要定义返回空值 void):make_physical_and_spin(vector torque) / 扭矩变为 2 倍vector double_torque = 2.0*torque; llSetStatus(STATUS_PHYSICS, TRUE); llApplyTorque(double_to
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号