一、D8带给我们什么?
新版的Director 8在强大的Shockwave引擎的支持下,带给我们一个前所未有的多媒体&游戏开发平台,和以前的Director 6.5不同,D8支持圆点操作符,使我们的程序更简洁易懂,现在我们来看一个实例。
[目的]在Photoshop中做一幅图片(也可在别的软件中制作,如Director的Painter),用Lingo来控制其移动,从下至上,初始时移动快,到屏幕的2/3处,移动变慢,使人能够看清楚,当鼠标移动至图片,停止,移开鼠标,恢复移动。
[分析]我们计划用面向对象的行为来编写程序,使我们的程序可以附加至任意对象。在Director8中我们将脚本封装到了行为中,还使用了新的圆点操作符号。下面是D6.5和D8的代码比较,使你更容易上手。
赋值:
set x=32 --D6.5
x=32 --D8
为对象的属性赋值:
set the locV of sprite 1 to 150 --D6.5中将Sprite 1的纵坐标位置移动到150
sprite(1).locV=150 --D8的代码似乎简洁多了
回到我们的话题,下面是我们的Lingo代码,我给出了详细的注释:
property pMySprite --属性 精灵通道号码
property pHeight --属性 屏幕高度
property pMoveYN --布尔值 是否移动
property pFast --图片的移动速度 快
property pSlow --图片的移动速度 慢
on beginSprite me
--初始化属性值
pMysprite=me.spriteNum
pHeight=the stage.rect.Height*2/3 --屏幕高度的2/3
pMoveYN=TRUE
pFast=4
pSlow=2
end
on exitFrame me
--当播放头(playBack head)离开对象的时候执行下列代码
if pMoveYN=FALSE then return --若移动为假,退出句柄
if sprite(pMySprite).locV>pHeight then
--若对象的纵坐标大于屏幕的2/3
movePixels=pFast --移动速度加快
else
movePixels=pSlow
end if
sprite(pMySprite).locV=sprite(pMySprite).locV-movePixels
end
on mouseWithin me
pMoveYN=FALSE
end
on mouseLeave me
pMoveYN=TRUE
end
呵呵,就是这样了,你可以把上述代码贴到一个Behavior里,然后把Behavior赋给对象,当然了,因为我们的代码是面向-对象的呦:-),我想在今后同大家共同探讨Director Lingo方面的问题,欢迎给我写信或留言。
二、这次,我们来了解一下Director中几个主要的窗口,值得一提的是,在今后的学习中,我们将使用的是Director 8.0,前几个版本可能会有些差别。
在认识这些窗口前,我们先来做个比喻,了解Director是如何"工作"的。首先,使用Director(导演),我们可以把自己认为是"导演",让声音、图像、动画这些多媒体素材按照我们的意愿组织起来,成为一部完美的电影(Movie)。
在拍摄电影中演员(cast)是在后台等待出场的,他们按照剧本(Score或者Script)的要求,在适当的时候在舞台(Stage)上演出一个角色(Sprite)。这意味这什么?意味着演员(Cast)可以看成是一个父对象、一个类,他可以扮演许多角色(Sprite),就是派生(创建)出许多的子对象,子对象是类的一个实例,且子对象可以有不同的属性和表现方式。这是不是有些难于理解?
让我们再打一个更为通俗的比喻吧!周星驰是演员,他可以在《大话西游》中扮演悟空,也可以在《武状元苏乞儿》中扮演苏乞儿,悟空和苏乞儿不是一回事,他们有不同的性格和造型,但他们的本质是一样的,都是周星星扮演的。我们可以把周星星认为是一个Cast,悟空和苏乞儿是sprite,按照不同的剧本,在舞台上进行表演罢了。
好了,回到我们的话题。认识这些窗口,第一次进入Director的时候,我们可以看到以下几个窗口:Stage、Score、Cast。stage就是舞台,我们将让精灵sprite在这里出现;score是场景视窗,我们将在这里对精灵进行组织,让它们在适当的时机出现;cast可以看做是后台,演员在这里休息,也可以看成是一个存储媒体的数据库,电影中的声音、图像、数字动画都在这里存储。电影Movie意味着整个多媒体的集合,若你学过程序语言,可将它理解为工程。
上次,我们认识了Director 的3个重要的窗口。怎么样?搞清楚它们的关系了吗?还没有?呵呵,这也没什么,我们以后会接触到一些实例,由浅及深,你会发现Dir窗口的关系并不比《红楼梦》中黛玉、宝玉的关系复杂。
三、一个最简单的实例。
打开Director的画图Window>Paint(从工具栏中打开更方便些),用圆形工具绘制一个圆。当然,你可以在Paint中绘制比较复杂的图形,就象在Windows98中的画图的用法。Paint中有选择、橡皮、填充、直线铅笔等工具,在这里我就不详细介绍它们的用法了,你可以自己试一下,绘制好圆形后关闭Paint。打开Cast Window(Ctrl+3),看到我们刚绘制的圆了?给它命名为round。还记得上节课中的比喻吗?round就是演员周星星,它(他?)现在待在Case window中,就象在后台一样,等待着出场扮演悟空(或苏乞儿)。OK,我们点住round,将其拖动到stage window舞台上,打开scroe window,你发现有一个长条,占据了第1通道的1…28帧。呵呵,这就是"悟空"了,我们已让演员扮演了一个角色,术语上称为sprite。当然,它现在只是静静地待在stage上,没有任何动作,因为我们没有任何的剧本。
希望你明确这样一个概念,正是由于我们刚才的拖动,已经让演员从后台到了舞台上,扮演了一个角色sprite。(对象sprite是由cast类创造的一个实例)。
在使sprite运动之前,我们先看看总谱(score window),若你用过flash,可忽略此部分。总谱类似于Excel表,是一个二维表格,左边的行称为精灵通道(sprite channels);上边的列称为帧(frame);红色的线是播放头(play backhead)。我曾经提到过Dir是基于时间线(Timeline)的创作工具,意味着播放电影时,播放头将从第1帧开始,向右移动,在播放头到达的帧中,sprite channel中的sprite将被显示出来,通道号码大的对象会挡住通道号码小的对象。这没什么难于理解的,我们在观众席上看节目,若2个演员重合,前面的会挡住后面的。
回到刚才的话题,我们创造了sprite 1占据了1…28帧,若想让sprite 1运动该如何做呢?在score中单击第1帧,然后在stage上将sprite 1拖动到舞台的左边;单击第28帧,在stage上将sprite向右拖动,你会发现sprite 1上会出现一条白色的线,这就是精灵的移动路径(path)。OK,单击工具栏上的倒带按钮(Rewind),然后播放(Play),看到了吗?小球沿着刚才白色的路径移动。
这就是动画,若你用过Flash等动画软件的话,可能对此不屑。但是不要忘记了,这节课的题目可是"最简单的动画",哪个程序员不是从"Hello world"中成长起来的呢?
我们在上次做了最简单的动画,使用了Direcotr中的Paint工具。若你美工比较好,你可以在Paint中绘制精致的图片。为何有Photoshop这样强大的制图软件,还要使用Paint?我想原因大概有3个:Photoshop太复杂,学习起来可能要花更多的时间,而Paint只要用过Windows的画图就没什么问题了;另外,Director对Photoshop制作的图片兼容性不是很好,尤其是ink为透明的时候,会发现有小的毛刺,看起来非常影响视觉效果,在Paint中就很好了;还有就是Paint支持Direcot的洋葱皮绘画方式,便于制作动画。这也是这次我们将讨论的问题。
四、Direcot的洋葱皮技术和Film loop。
什么是洋葱皮?我不是专业的美工,探讨这样的问题会有班门弄斧之嫌,呵呵,我们只要明确它的概念就可以了。在从前的动画制作中,美工是这样绘制动画的,将准备绘制动画的图片用很薄的洋葱皮纸拓到底图上,透过隐约可见的洋葱皮纸来绘制下一副图片,一张一张来完成动画,呵呵,好累啊!!!
在Director中我们是这样应用洋葱皮技术的:打开paint画板,选择view>Onion Skin(洋葱皮)打开洋葱皮开关,这是一个浮动的面板。我来介绍一下几个按钮和其功用:1、洋葱皮开关,是否使用洋葱皮,值得注意的是每次用完后应该将洋葱皮开关关闭,否则下次启动画板,默认的将是开启洋葱皮。2、3、是一个可以输入或增加的按钮,用于隐式显示当前图片的前n个或后n个图片。后面3个按钮分别是设置为背景、显示背景、跟踪显示,这里不详细介绍了,若有兴趣,可以自己试一下。
OK,我们可以来做一个基于洋葱皮技术的动画了。
选择Modify>Movie>Properties设置电影属性(我通常是按Ctrl+shift+D),激活Property Inspector面板。注意:这是Director中最重要的面板之一,在Dir8中取消了在Score总谱中设置对象属性的用法,而将所有对象的属性设置集中到了这里,你可以在此设置电影(Movie)、对象(sprite)、演员(cast)、脚本(script)、参考线等,真是功能强大!!!在Property Inspector中选择Movie…Stage Size,设置为640×480,这是我们将来输出电影时的尺寸(请设置Movie size时要慎重考虑,因为若多媒体做到一半的时候要改变目标投影机的分辨率将是极其困难的,你的对象可能不得不随之改动位置)。
打开paint,打开view>Onion Skin,将允许洋葱皮开关按下,设置Preceding Cast Members 为1,Fllowing Cast Members为0。我们在Paint中绘制一副蛇的图片,命名为snake1。绘制好后按下Paint中的加号按钮(New cast member)建立一个新的图片cast,呵呵,看到了吗?一个虚幻的蛇的图片,这就是我们刚才绘制的那副,你可以参照snake1绘制一个稍有变化的蛇的图片,命名为snake2,依此类推,绘制snake3。若你有耐心,可以多画几副,图片越多动画越细腻,反正我只画了3张。
关闭paint和Onion skin,打开cast window和score window,单击snake1,将其拖动到score的channel 1中让它占据第1…3帧;单击snake2,也将其拖入score中的channel 1,让它紧挨snake1,占据第4…6帧;把snake3也放入score,让其占据7…9帧。你看见舞台(stage)上有蛇的spirte,现在单击play,呵呵,如何?你看到了一条逼真的蛇,正在原地舞动,如何让它运动呢?一条一条设置?那样会太麻烦且不容易同步,让我们看看director的另外一个强大功能吧:Film loop。
File loop就是把几个精灵对象(sprite)的运动集合起来做为一个对象。我们将score中的channel 1中的所有帧都选中(就象玩帝国时代中的画框选择一样,呵呵),被选择的影格是蓝色的,用鼠标点住这些影格,拖入cast中一个新的cast的位置,放手,看到一个对话框了吗?在Name中输入snake然后Ok,你可以看到在cast中同刚才的图片的画笔的小图标不同,新建立的snake film loop是一个圆筒样的图标。好了,我们再次选择score中的所有影格,然后按下Delete键删除它们,我们已经不需要这些影格了。
在cast中单击snake film loop,将其拖入score,哪怕现在只有1帧,我们的蛇也是运动的,因为Film loop是刚才删除的影格的集合。象我们上节设置小球运动一样设置关键帧,使蛇运动起来,是不是这样看起来逼真多了?呵呵。
五、简单的Lingo。
前几次,我们讨论了如何做简单的流式动画和洋葱皮技术。可是,当我们发布Movie时,会发现整个电影会一闪就退出。这是因为播放头水平向右运动,当播放至最后一帧,若无Lingo代码就自动退出。如何解决?
终于开始接触Lingo了,呵呵。让我们打开第3节课制作的简单的动画…小球的运动,在第28帧电影结束的地方,在Scroe Script Channel中双击(在总谱的分隔条上方)。弹出一个Behavior Script窗口,里面有默认的句柄(handle)on exitFrame me,在它的下方添加代码:go to the frame。是什么意思呢?解释一下。
刚才说过,若在电影的最后一帧若无任何代码,电影会在播放完后自动退出,我们刚才的Lingo命令go to the frame是控制播放头在播放完本帧后返回本帧。是的,在Director中,绝对的静止是不存在的,我们看到添加完go to命令后,播放头好像是停在了第28帧处,其实不然,它是在做往复运动,只不过速度太快,我们看不清楚罢了。
on exitFrame me,是一个句柄(handle),若学过别的程序语言,不妨把它看成是函数,me是参数,exitFrame是系统定义的句柄,意思是退出当前帧的时候执行的代码,Lingo的句柄总是以end结束。所以,我们刚才整个的代码应该是这样的:
on exitFrame me
go to the frame
end
这样,我们编译的电影就不会自动退出了,而是"静止"在最后一帧,相信你已经理解"静止"的含义了,没有绝对的静止,只有相对的静止和绝对的运动。呵呵,象是诡辩,用到这里形容播放头(play backhead)的运动还挺合适的。
六、Message Window。
我们终于可以谈论一些Lingo程序了,我只学到了一点皮毛,放在这里,希望可以起到抛砖引玉的作用,大家一起讨论。:-)
同别的程序语言一样,LINGO也有变量、数组、函数、参数、判断、循环...
我们先来看看变量,首先打开消息窗口(Message window),菜单Window>Message,或者是用快捷键Ctrl+M。在里面输入
-- Welcome to Director --
x=3
put x
--3