文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络网站建设网页特效用林登脚本语言实现第二人生脚本编程
精品推荐
特别推荐
·常用辅助代码
·禁止网页页面刷新的特效代码
·网页星空动态星空背景特效代码
·随滚动条滚动的图片广告代码(图片还可以拖动)
·上下连续无间断滚动图像[网页特效]
热点TOP10
·网页页面中真实的宇宙效果演示[网页特效]
·图片爆炸效果动画演示特效[网页特效]
·右下角漂浮图像,能跟随滚动条进行上下移动
·Flash和JS实现的图片幻灯片切换特效
·效果不错的图片切换特效,太平洋女性网图片特效
·网页特效:随浏览器滚动条移动的DIV层
·不间断连续滚动的图片效果(向上滚动)
·用javascript编写的俄罗斯方块小游戏[网页特效]
·循环不间断向上滚动的文本特效代码
·常见网页可上下移动的右侧广告特效代码

用林登脚本语言实现第二人生脚本编程

日期:2007年9月18日 作者: 查看:[大字体 中字体 小字体]


  引言:如果你在第一人生里学会了编程,那么现在你可以在第二人生中锻炼你的编程技能,使用林登脚本语言来活动起你在流行的模拟世界里建立的物体吧。

  本文代码下载

  第二人生(SL)是由林登实验室开发的一个非常流行的多玩家在线游戏(MMOG)。许多人认为第二人生不仅仅是个游戏。如果你对第二人生不熟悉,它就像电影“黑客帝国”,人们生活和工作在一个围绕着他们的虚拟世界里。第二人生非常简单;你的电脑玩家,被称为avatar,在第二人生的3D世界里生活。

  在第二人生中没有任何特定的物体,那里所有的一切都完全依赖于你想如何构建它。另外,第二人生是免费的。你必须要注册,但是你只在需要拥有土地时才需要订购。

  然而,和“黑客帝国”不同,当前的计算机技术还没有先进到模拟一个物理世界,所以第二人生有两个重要的缺点。首先,你通过一个计算机屏幕来看到第二人生的世界,尽管使用了当前的3D图像技术,它仍然让虚拟世界有一种卡通化的界面。尽管这样,许多第二人生的区域可视化效果是非常好的。

  第二,第二人生的模拟不是一个完全的物理模拟。关键的元素,比如重力是存在的。然而,在第二人生里你不能完全的模拟一些如汽车那么复杂的东西,去模拟汽车的内燃引擎和电子器件的所有方面是非常困难的。现代计算机还没有足够的能力去做这样的事。就像你可以在这篇文章中看到的一样,在第二人生里有汽车和其他车辆。

  你可以通过一个免费客户端访问第二人生,它有各种平台下的版本,包括Windows,Mac和Unix。另外,林登实验室最近还将客户端开放源码了,这样就开放第二人生给第三方开发者来创建一系列客户端的增强功能。

  林登脚本语言介绍

  第二人生提供了一个脚本语言称为林等脚本语言(LSL)来填补第二人生简单物理引擎的空缺。程序员创建脚本告诉汽车该如何移动,而非模拟汽车的方方面面。脚本可以播放声音,转向汽车,甚至检测碰撞。比如,为了增加真实感,一个汽车脚本可以阻止汽车在不移动时转向。

  本文提供了对LSL的介绍。为了获取最大的收益,我建议你有一个“构建”的基本知识,但是它不用来理解程序代码。构建是将你的3D物体放置到第二人生世界里的过程。构建者创造了你在第二人生里看到的所有东西。

  这篇文章假设你已经有些熟悉第二人生中的构建过程。在第二人生中构建并不是非常难的,但是你必须“在”第二人生中构建事物。为了尝试,简单的点击第二人生窗口的底部的“Build”按钮来开始实验。

  LSL基础

  林登脚本语言初看有点像C语言。然而,它比C语言编程容易。没有指针,你可以直接比较字符串而无须使用strcmp这样的函数。LSL不是面向对象的;你不能创建你自己的对象,程序提供了一些3D相关的对象。LSL是基于状态的。每个LSL脚本有一个特定的状态,运行每个函数来在一系列状态中转化。这是和大部分编程语言不同的概念。当你在大部分语言中构建状态机时,LSL的状态机概念已经是语言的内建部分了。

  LSL脚本存在于第二人生中的3D元素的内部。对象是元素的集合。比如,在第二人生中的汽车可以是一个简单物体。但是,汽车对象可以是由很多基本元素组成的,每个部分包含自己的脚本。除此以外,这些基本元素可以互相通信,甚至和人类玩家通信。使用更高级的编程,元素甚至可以和SL外部的Web页面通信。

  LSL也是事件驱动的。大部分的第二人生中的物体通过事件触发状态转换而工作。第二人生提供了许多不同的事件类型。许多都是基于用户的,比如用户的触摸或者坐在一个对象上;但是,它也支持计时器事件,无须用户交互。

  在剩下的部分,我将给你展示如何在活动一个第二人生中的电梯。

  构建一个简单的电梯

  作为一个例子,本文将展示如何创建一个在第二人生的摩天大楼里上下升降的电梯。图1显示了电梯所在的摩天大楼。

第二人生中的摩天大楼
图1 一个第二人生中的摩天大楼:这是本文中电梯所在的大楼

  你可以看到看到这个电梯活动在“Gyeonu”地区,坐标是(51,79)。第二人生使用特定的URL称为“SLURLs”。如果你安装了客户端,你可以直接参观这个电梯。如果这个链接无效,点击SL客户端的map按钮,查找“Gyeonu”,然后在坐标区输入坐标95,23,44。

  这个链接带你到一个web站点,这个站点显示了这个电梯所在区域的鸟瞰图。如果你安装了第二人生,你可以选择“Teleport Now”来传送到这个地点。这个电梯允许你在摩天大楼的每层参观,包括顶层。使用电梯你你只需简单的“sit on it”,这是一个内建的动作,出现在你右键点击一个游戏中的物体的弹出菜单里。电梯的弹出菜单让你选择电梯去向何处。你也可以找到每层的一个绿色圆锥,让你呼叫电梯到那一层。

  两个脚本控制该电梯。第一个脚本,Elevator.lsl使得电梯移动并且和avatars交互。(参看列表1)。

  列表1.

Listing 1. The Elevator.lsl Script: You can see the popup menu items
integer CHANNEL = 42; // dialog channel
list MENU_MAIN = ["Floor 1", "Floor 2", "Floor 3", "Floor 4", "Floor 5", "Floor 6", "Floor 7"]; // the main menu

float BOTTOM = 27.300;
float FLOOR_HEIGHT = 10;
float SPEED = 1;
float target;

default
{
state_entry()
{
// listen for dialog answers (from multiple users)
llListen(CHANNEL, "", NULL_KEY, "");
llSitTarget(<0,-0.5,0.5>, llEuler2Rot(<0,0,-90>) );
llSetText("Sit Here to Ride Elevator",<0,0,0>,1.0);
target = BOTTOM;
}

listen(integer channel, string name, key id, string message)
{
integer idx = llListFindList(MENU_MAIN, [message]);
if( idx!=-1 )
{
llSay(0,"Elevator heading to " + message + "." );
target = BOTTOM + (idx*10);
state moving;
}
}

changed(integer Change)
{
llDialog(llAvatarOnSitTarget(), "Where to?", MENU_MAIN, CHANNEL);
}

}

state moving
{
state_entry()
{
llSetTimerEvent(0.1);
}

timer()
{
vector pos = llGetPos();
pos.x = 50.500;
pos.y = 90.740;

if( pos.z!=target )
{
if( pos.z>target )
{
pos.z = pos.z - SPEED;
}
else
{
pos.z = pos.z + SPEED;
}
}

if( llFabs(pos.z - target) < SPEED )
{
pos.z = target;
llSetTimerEvent(0);
llSetPos(pos);
llSay(0,"Elevator has reached its target." );
state default;
}
llSetPos(pos);

}
}

  列表2中的代码(callElevator.lsl)应用在绿色的呼叫圆锥上。它和主电梯脚本通信并且召唤电梯箱。

  列表2.

This script calls the elevator from one of the green floor cones found on each floor of the skyscraper.
default
{
state_entry()
{
llSetText("Touch to Call Elevator",<0,0,0>,1.0);
}

touch_start(integer total_number)
{

llShout(42, "Floor 1");
}
}

  尽管列表和下载代码包含了所有的脚本,我仍然帮助你查看一下电梯代码,看看它是如何回应一个sit事件,以及如何显示一个菜单。

  配置电梯和设置

  你可以注意到脚本中一些“常数”在电梯物体的上部

integer CHANNEL = 42; // dialog channel
list MENU_MAIN = ["Floor 1", "Floor 2", "Floor 3", "Floor 4", "Floor 5", "Floor 6", "Floor 7"]; // the main menu

float BOTTOM = 27.300;
float FLOOR_HEIGHT = 10;
float SPEED = 1;

  LSL事实上不支持常数,所以并没有“逻辑”常数。显示的这些值应用于这个摩天大楼,如果使用在你自己的建筑中可以修改这些参数。

  CHANNEL定义了电梯箱使用哪个频道和电梯呼叫圆锥通信。MAIN_MENU定义了每层的按钮。注意这也是你如何定义电梯可以访问多少层的方法。BOTTOM是你的建筑底层的Z坐标。SPEED是电梯移动的速度。

  为了设置电梯,state_entry事件被触发。每当进入到一个状态时这个事件就被触发。你可以从列表1中看到,state_entry被放置到缺省状态。因为缺省状态是LSL脚本开始的第一个状态,当电梯启动的时候这个事件运行。系统触发一个state_entry事件,只要一个对象进入了一个新的状态。因为所有的对象都是开始于“缺省”状态,当程序启动时缺省状态的state_entry事件总是首先触发。这就是事件代码:

state_entry()
{
// listen for dialog answers (from multiple users)
llListen(CHANNEL, "", NULL_KEY, "");
llSitTarget(<0,-0.5,0.5>, llEuler2Rot(<0,0,-90>) );
llSetText("Sit Here to Ride Elevator",<0,0,0>,1.0);
target = BOTTOM;
}

  IIListen命令告诉脚本开始在指定的频道监听,使得当用户呼叫电梯时脚本开始接受事件。IISitTarget事件允许一个对象告诉用户应该坐的位置的x,y,z坐标。第一个向量<0,-0.5,0.5>指定了相对于电梯箱中心该距离的位置。第二个向量<0,0,-90>指定了如何相对于该物体旋转用户的avatar。这将会在Z轴上旋转avatar -90度。Z轴是上下的轴。因此Z轴的旋转使得avatar改变他们面向的位置,但仍保持脚步在地面上。想像一下Z轴就像从你头部通贯到你的脚部。除此以外,调用IISitTarget允许对象在坐到物体上时接收事件。

  IISetText方法使得一个对象上显示指导性文字——这种情况下,使得用户知道他们应该坐上电梯来驾驶它。最后,脚本初始化电梯的目标Z坐标(存储在target变量中)到BOTTOM-底层。

  显示菜单

  当用户坐到电梯里时,第二人生发送一个changed事件给电梯脚本。这是事件处理代码:

changed(integer Change)
{
llDialog(llAvatarOnSitTarget(), "Where to?",
MENU_MAIN, CHANNEL);
}

  IIDialog方法显示一个简单的菜单给用户。你可以从图二中看到菜单,显示了我在游戏中的人物“Encog Dod”在等着电梯启动。

电梯启动
图2

  当用户选择了楼梯层,监听事件就会被触发,如下所示:

listen(integer channel, string name, key id, string message)
{
integer idx = llListFindList(MENU_MAIN, [message]);
if( idx!=-1 )
{
llSay(0,"Elevator heading to " + message + "." );
target = BOTTOM + (idx*10);
state moving;
}
}

  当listen事件触发时,message事件参数将会包含用户选择的菜单项文字。监听事件首先检查MAIN_MENU队列中选择的索引号,将用户选择以0开头的索引的值赋于整型变量idx。电梯然后报告它向那层运行去,并且设置目标变量。最后,它改变状态到moving。

  可能发生的一次不止有一个avatar坐上电梯。在这种情况下,第二人生给所有的avatars一个弹出菜单来选择一个目标楼层。电梯并不像真实世界那样“队列”所要去的所有楼层;而是avatar中最后选择的楼层就是要去的楼层。毕竟,所有的avatar分享这次乘坐。

  移动对象

  在第二人生里可以使用两种方式来移动对象。你可以物理的使用thrust来移动,或者直接使用x,y,z坐标。直接移动对象比物理移动要简单一点,所以我这里关注的是直接的基于坐标的移动。幸运的是,对电梯来说很简单,因为它只在一维上运动:上和下。就像你所想的那样,在第二人生中那是Z轴。

  当电梯进入到移动状态,电梯将会移动。当它的state_entry事件触发时,moving状态开始。

state moving
{
state_entry()
{
llSetTimerEvent(0.1);
}
...

  state_entry事件注册一个计时器,每秒嘀嗒10次。每次嘀嗒导致计时器事件被触发。计时器事件中的代码引发电梯移动。计时器通过获取当前电梯位置开始:

timer()
{
vector pos = llGetPos();
...

  如果Z轴不是最终的目标,那么脚本移动电梯或上或下向着目标而去。SPEED常量控制电梯移动的速度。

if( pos.z!=target )
{
if( pos.z>target )
{
pos.z = pos.z - SPEED;
}
else
{
pos.z = pos.z + SPEED;
}
}

  每个嘀嗒都会持续前进直到检查到电梯的位置已经非常靠近目标——比SPEED常量的一次移动距离要短。在这种情况下,脚本移动电梯到目标位置,停止计时,提示用户,将电梯状态转为default。

if( llFabs(pos.z - target) < SPEED )
{
pos.z = target;
llSetTimerEvent(0);
llSetPos(pos);
llSay(0,"Elevator has reached its target." );
state default;
}

  否则,电梯并没有靠近,还必须继续前进,因此计时器脚本移动电梯到新计算的位置:

llSetPos(pos);

  除了被乘坐的用户控制,电梯也可以被摩天大楼里的某层的绿色电梯呼叫椎体所呼叫,需要涉及到对象间通信。

  对象间通信

  第二人生中的对象彼此间通信的方式和avatar之间通信方式类似。Avatar可以说话,被邻近的avatars听到;他们也可以大声呼喊让更远距离的人听到。第二人生中的每个事物使用一个特定频道说话。Avatars通常在0频道说话。如果一个对象在频道0上监听,它可以听到邻近的用户的说话!类似的,如果对象在0频道说话,那么附近的用户也能听到。

  在摩天大楼的每层都有一个绿色圆锥体来呼叫电梯。圆锥非常简单。它们只是通过传输呼叫电梯到达的层。这和通过电梯菜单的方式是一个道理。

  每个层的圆锥体包含一个touch_state的事件,当用户触摸圆锥体的时候触发。这就是第一层的touch_state事件:

touch_start(integer total_number)
{
llShout(CHANNEL, "Floor 1");
}

  注意到脚本呼喊这个消息,这就比IISay方法的距离要大,因为摩天大楼比较高。电梯将会使用监听事件来收到这个通信,然后开始移动到指定层。

  在本文里你看到了如何在第二人生里创建一个电梯。这仅仅是个开始。在LSL库中有很多方法来允许你创建几乎无穷队列多的游戏对象。你可以创建对象来进行商业交换,卖出对象。你可以为游戏创建武器。你的对象甚至可以和外部的web服务器通信,让你在你的脚本里使用外部资源。

  如果你有兴趣学习更多LSL相关内容,林等实验室维护一个LSL Programming Wiki,你可以查找到更多信息。

(出处:清风学院






上一篇:如何用CSS使图片自适应显示宽度

下一篇:网页制作中的一些技巧
相关文章:
·人生哲理名言生活哲理短文
·经典语句:71条人生信条
·《性福人生》无限金钱秘籍 - 游戏秘籍
·人生之数:人生经典感悟108
·如何实现局域网打印机共享
·关爱男人:男人人生感悟100条
·人生激励:激励的最佳方法
·人生哲理:一个人最重要的是他的内心
·不可错过:激励人生的五句话
·人生格言谚语大全
相关软件:

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot