荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: guita (复杂爱), 信区: Multimedia
标  题: lingo(二)
发信站: 荔园晨风BBS站 (Tue Apr  2 17:09:29 2002), 转信

Lingo(二)——控制角色的位置

  主题是控制角色的位置,将会讨论如何用Lingo来自动控制角色的位置,并且和
大家讨论一下如何可以把一个只为某个角色而做的Lingo脚本程序转化为可以为多
个角色所用的通用性脚本程序。
还有就是将会讨论一下如何用鼠标、键盘等来控制角色的位置
等等。在这里是想通过这篇文章能引导一些朋友们进入Lingo之门,所以会写得详
细些,文章将会长些。再次强调,文章会分多次上传。请大家留意。希望大家有好
的提议能跟我说说,我的QQ号码是10988。本教程是以Director8为基础来写的。好
了,闲话不说了,下面开始
   先在Paint窗口创建一个位图演员,如一个实心圆。把舞台设成640*480,把实
心圆演员直接从演员表中拖放在舞台中央处。
   打开Message窗口,在窗口中输入:
   sprite(1).locH = 100
   按回车键。再输入:
   updateStage
   再按一次回车键。
   你看到了什么?实心圆的位置变化了。变成在原来的位置的左边近舞台左边处
了。
在这里就用了两句很简单的Lingo语言,来改变了实心圆的横坐标位置。第一句的
作用是把精灵1(即实心圆)的横坐标由原来的改变为100(Director7以前这句程
序是这样写的:set the locH of sprite 1 = 100,Director7之后也还支持这样
写的。但Director引入了新的点句式程序写法,能节省输入的时间,以及符合很多
程序员的习惯);第二句的作用是把第一句所做的改变来更新舞台所显示的内容(
注意:当你是在电影播放期间输入第一句程序的话,第二句是不需要输入的,在第
一句输完按回车键之后已经可以见到实心圆的位置变化了的,只有在电影是停止状
态下才需要输入第二句的)。
   再在Message窗口以同样的方式输入两句:
   sprite(1).locV = 100
   updateStage
   又可以见到实心圆的位置发生变化。这次是纵坐标发生了改变。
通过对比可以知道,locH与locV是分别代表角色属性中的横坐标与纵坐标。能不能
同时改变横坐标与纵坐标呢?当然可以的。在Message窗口以同样的方式输入两句

   sprite(1).loc = point(320,240)
   updateStage
   可以看到实心圆又回到舞台中央了。
   下面以例子说说实际应用这几句程序的情况。先来做一个会自动从舞台左边运
动到右边,到了舞台右边之后,会再从舞台右边运动到左边,到了左边之后又回转
右边运动的不停循环的运动。
新建一个影片,在Paint窗口创建一个位图演员,如一个实心圆。把舞台设成
640*480,把实心圆演员直接从演员表中拖放在舞台中央处。
打开script窗口,在窗口中输入下列程序(注意:程序每输入一行要按一下键盘上
的大回车键,不要按小回车键,在Director中,这两个回车键是不同的。另外,在
下面程序中有“--”符号之后的这一行内容为说明语句,输不输入都可以的。
Lingo会自动把“--”符号之后的内容忽略的,在这里加进去是为了使读者能更好
地看懂程序):

global pDirection
-- 定义一个变量pDirection

on beginSprite me
 -- 当第一次出现我(指使用这个行为剧本程序的角色)的时候
 pDirection = 5
 -- 设定角色每变化一次位置的变化量,数值越大,变化越快
end

on exitFrame me
 -- 当播放头退出当前帧,播放下一帧时
 sprite(1).locH = sprite(1).locH + pDirection
 -- 分镜表中1号通道上的精灵(角色)的横坐标增加pDirection这么多,
 -- 可能是递增,也可能是递减,由pDirection的值的正负决定。
 if pDirection > 0 and sprite(1).locH > 600 then
   -- 如果精灵1的横坐标大于600(即它已到了舞台的最右边)时就会
   -- (在这里,600这一数字是可以设大点或设小点都行的。)
   pDirection = -5
   -- 把pDirection的值改成负值
 else
   -- 否则的话
   if pDirection < 0 and sprite(1).locH < 40 then
     -- 如果精灵1的横坐标小于40(即它已到了舞台的最左边)时就会
     -- (40也是可根据实际情况来设定的。)
     pDirection = 5
     -- 把pDirection的值改成正值
   end if
 end if
end

   输入完毕之后按小回车键,script窗口将会关闭,如果你没有看到出错的对话
框,那么恭喜你,你成功了。如果有错识提示,那么请你再认真检查一下,要不你
也可以把上面的程序复制去用,这是经过测试的程序来的。
   script窗口能正常关闭之后,可以见到演员表中第二个位置多了一个Movie
Script演员。用鼠标右键点击演员表中的Movie Script演员,在弹出的菜单中选
Cast Properties,会打开Property Inspector窗口(注意:是指在Director8中,
在Director其它版本中可能不一样的),点选其中的script选项卡,在这个选项卡
中有一项设置Type,把这个设置选为Behavior。之后关闭Property Inspector窗口
,这样就把这个Movie Script演员改为Behavior Script演员了。
   把这个Behavior Script演员从演员表中用鼠标左键按定不放拖动到舞台上的实
心圆角色上放开鼠标左键。这样,就把这个行为加到实心圆角色上了。现在可以播
放来看看。
在这个Behavior Script的例子中,lingo程序是专门为分镜表中1号通道上的精灵
(角色)而做的。下面说说把它改成通用的、可以为分镜表中任何一个通道的精灵
所用的具体方法。为什么要这样做呢?因为如果你有多个角色用得上这样的行为时
,就不用为每个角色都专门编一段Lingo程序给它们了。想象一下,如果你想做一
个美丽的夜晚的场景,天上有很多美丽的、闪烁的、大大小小的星星以不同的速度
在慢慢移动……。哈哈……,是不是很想做了?
   第一个改动是把第一句:
   global pDirection
   改成:
   property pDirection
   因为“global”是定义全局变量的,只要当你的影片中有一个时候把
pDirection 的值设为一个固定的值的时候,例如为“5”,那么你的影片中凡是用
到变量pDirection 的时候都会把它认为是“5”。在这儿你当然不想看到每个星星
的移动速度都是一样的吧?“property”相对来说是定义局部变量的。它允许每一
个星星都有自己的pDirection值,即是有自己的速度。
   第二个改动是把:
   pDirection = 5
   改成:
   pDirection = random(5)
   意思是把pDirection设定为1到5中的任何一个整数。命令random是一个随机函
数来的。和其它很多语言是一样的。在这儿用上随机数的话,就可以为星星们随机
地设定一个速度给它,每次运行都不同的。
   第三个改动就是把程序中所有的:
   sprite(1)
   改成:
   sprite(me.spriteNum)
   意思是把硬代码“1”改成你把这个Behavior Script加到的那个角色所处分镜
表中的通道号。也就是说me.spriteNum是自动检测角色所处分镜表中的通道号的。

   第四个改动,也就是最后一个改动。把实心圆换成一个星星。并要确定这个星
星是附加了这个Behavior Script的。另外可以在屏幕上放上许多个星星(位置与
大小随你中意)。然后再为它们一一加上这个Behavior Script。完了之后,保存
吧。当然还要运行一下啦。
还有一个地方要说明一下的。就是要把舞台的颜色设色一片漆黑,这样才象是夜空
呀。
不好意思,漏了一个需要改动的地方还没说,就是要把if……then……句子中的“
pDirection = 5”和“pDirection = -5”两句都换成“pDirection =-
pDirection”才行。不过这样一改,程序可以进行一下压缩了,压缩之后的程序如
下:
property pDirection

on beginSprite me
 pDirection = random(5)
end

on exitFrame me
 sprite(me.spriteNum).locH = sprite(me.spriteNum).locH + pDirection

 if (pDirection > 0 and sprite(me.spriteNum).locH > 600) or(pDirection <
 0 and sprite(me.spriteNum).locH < 40) then

   pDirection = -pDirection

 end if
end


   如果想控制星星从不同的角度不同的方向移动,以及还要旋转之类的效果,也
是可以的,但由于Director的库面板里本来就有这么一个行为的了。所以,在这儿
就不再多说,请大家自己看看Director库面板里自带的这个行为(在库面板
Library Palette里的Animation类中的Automatic分类中的Random Movement and
Rotation行为,本文不用此行为,如大家有兴趣可自行尝试)。用法也很简单,只
需把它拖放到角色上,之后会出现设置活动范围、速度及旋转相关等的参数的对话
框。设好参数关闭之后就可以播放看效果的了。
   好了,说回原来的。现在已经有了一个很多星星横向移动的动画了,是不是能
把这些星星中的某颗在某个时刻化成绚丽的流星呢?答案是当然可以的。下面让我
们来看看怎么样做流星效果。


--
※ 修改:·guita 於 Apr  2 17:10:47 修改本文·[FROM: 192.168.55.226]
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.55.226]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店