Director 8从入门到精通

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Director 8从入门到精通
入门篇(一)
Director 中使用的术语与电影术语非常类似,因为Director 开发之初就是借鉴于电影。

我们先来认识一下Director 为导演们提供的导演舞台:
Stage: 舞台。

这是演员们表演的地方。

因为Director 开发是“所见即所得”,所以舞台上演员(实际上演员在舞台上称之为精灵)的表现将直接影响表演效果。

Director 启动时自动打开一个空白舞台,用户可以通过快捷菜单和属性观察器(Property Inspector)来修改舞台属性。

快捷键:Ctrl + 1。

顺便提醒一句:Director 是单任务系统。

Cast Window: 演员表(又称剧组成员表)。

与电影有所不同,无论戏份轻重,也不管有否出场,所有的演员都列在演员表中。

可以同时使用多个演员表,默认为Internal Cast。

演员可以是位图(Bitmaps)、矢量图形(Vector shapes)、文本(Texts)、脚本(Scripts)、声音(Sounds)、Flash影片(Flash Movies),QuickTime影片(QuickTime Movies)、AVI 视频(AVI Videos),还可以包含其它成员。

演员表中的演员一般都有相应的编辑器来编辑,也可以通过菜单File/Preferences/Editors…来指定编辑器。

通过双击演员可以启动默认编辑器。

快捷键:Ctrl + 3。

演员可以直接拖到舞台或总谱中,成为精灵。

多次拖动一个演员到舞台上,可以产生多个精灵,修改一个精灵的某些属性不会影响其它精灵和该演员,但修改该演员就一定会导致由它产生的精灵的改变。

Score:总谱。

与电影相同,总谱几乎就决定了演员的出场顺序(不包含跳转时)。

后面我们将看到,总谱与脚本结合几乎可以随心所欲。

Director 8 提供了150 个演员通道和6个特殊通道。

150个演员通道可以根据出场顺序依次安排演员,演员的通道数越小,表示演员在舞台上越靠后,也就是说,通道数越高,演员就在舞台前面,不会被通道低的演员遮挡。

6个特殊通道包括速率通道(Tempo channel)、调色板通道(Palette channel)、过渡通道(Transition channel)、两个声音通道(Sound channel)和脚本通道(Script channel)。

双击Tempo channels,出现如下对话框。

其中的四个可选项分别表示:
设定播放的速率(帧每秒)、在该帧停留时间、等待用户鼠标或键盘响应、等待标记点。

注意:设定播放速率后,在该帧以后没有设播放速率的帧都将以当前设定的速率播放。

这在设置有帧跳转时应特别注意。

默认为30 fps。

双击调色板通道,将出现如下对话框,可以选择非系统调色板或自定义调色板。

在导入位图时,如果位图调色板与当前调色板不匹配,系统将自动导入该调色板。

过渡通道是提供转场效果的。

从前一场景到后一场景需要过渡时,使用特殊通道选取合适的过渡,可以达到非常棒的效果。

双击过渡通道,出现如下对话框,可以在列表中选取转场效果。

注意:转场必须放置在下一场景出现的前一帧,即当前场景的末一帧。

在特殊通道中,声音通道有两个,而实际可以使用的声音通道有8个,其它6个可以用Lingo 语言控制。

使用时可以直接将演员表中的声音成员拖到声音通道中,哪些帧需要这些声音就把声音拖到那些帧上;也可以双击声音通道从列表中选取,然后在声音通道中拖动或延长。

脚本通道是提供写帧脚本的。

帧脚本的事件将在后面详述。

当前帧的脚本只对当前帧起作用。

当然,如果帧脚本改变了演员的某些属性,这些属性将一直有效直到再次更改。

入门篇(二)
总谱还提供了其它功能,可以通过快捷菜单调用。

快捷键Ctrl + 4。

Paint:画图窗口。

画图窗口提供了一整套画图的基本工具,可以进行简单的画图和图象修改。

通过画图作出的图形直接存放在演员表中。

画图可以使用外挂效果。

比如将PhotoShop 中的Filters 文件夹拷贝到Director 的Xtras 文件夹中就可以使用PhotoShop 的图片处理效果了。

画图和Director 特有的“洋葱皮”(Onion skin)技术结合,可以轻而易举地将一连串相似的图片作成动画效果并制作影片环,以便随时调用。

下面简单介绍其用法:
用Paint 编辑一幅图片,通过菜单View/Onion skin调用“洋葱皮”,选中“Toggle onion skinning”按钮;
按Paint窗口左上角的加号,新建一幅图,此时出现前一幅图片的淡影;
选中工具栏上的Brush工具,选择左下角的墨水效果为Reveal,用鼠标在前幅图的淡影上选取保留的部分,可以看到选取的部分颜色变深;
再次单击“Toggle onion skinning”按钮,关闭“洋葱皮”,淡影消失,现在就可以加工该图了;
重复以上步骤,制作几幅连续变化的图片;
关闭“洋葱皮”,关闭Paint窗口。

在演员表中选取刚刚制作的几幅图片;
选择菜单Modify/cast to time,这时舞台和总谱中都出现由此得到的精灵,选择播放,就可以看到动画;复制或剪切该精灵,并粘贴到演员表中,此时要求输入影片环的名称,输入后保存,就可以在影片中直接使用影片环了。

提示:如果在画图时总会出现一幅淡影,那是“洋葱皮”没有关闭,调出
“洋葱皮”,再次单击“Toggle onion skinning”按钮就可以了。

注意:组成影片环的演员均不能被删除!
Text:文本窗口。

和Paint窗口一样,文本窗口制作的文本被直接保存到演员表中。

在文本窗口中可以制作丰富多变的文本,并可以通过快捷菜单来设置文本属性。

快捷键:Ctrl + 6。

Tool Palette:控件工具栏。

提供了一些基本控件,可以直接拖到舞台上,并自动加入到演员表中。

快捷键Ctrl + 7。

Field:域文本窗口。

与文本窗口类似,但比文本窗口更好用。

快捷键Ctrl + 8。

Control Panel:控制面板。

可以用不同的速率和位置来播放影片。

快捷键Ctrl + 2。

Vector Shape:矢量图形窗口。

与Paint窗口类似,用来绘制矢量图形。

快捷键Ctrl + Shift + V。

还有一个最重要的功能窗口值得一提:Inspectors。

Director 8的一个最重要、最显著的改进就是可以根据当前焦点自动切换属性观察器。

精灵的大部分属性都是直接在观察器中修改。

Script:脚本窗口。

为保持一致,Director中代码被称之为脚本。

脚本分为三种:电影脚本、行为脚本以及父脚本。

电影脚本起全局控制的作用,许多初始化动作和结束动作都在电影脚本中完成;行为脚本只在某一特殊阶段或事件发生时起作用;父脚本本身不产生任何结果,只是用来产生多个子对象,并设置各种参数以便形成各不相同的实例。

在属性观察器中可以更改脚本类型,并能将脚本连接到外部文件。

入门篇(三)
因为Director 的Lingo 语言是面向对象的事件触发机制,下面就来看一看Director 的基本事件和顺序。

事件名称(Handler) 状态说明
ActiveWindow 当一个窗口开始运行时触发
CloseWindow 当关闭一个窗口时触发
DeaactivateWindow 当一个窗口停止运行时触发
EnterFrame 进入一帧(FRAME)时触发
Exitframe 离开一帧时触发
Idle 影片在停滞状态时触发
KeyDown 按下键盘按键时触发
KeyUp 放开键盘按键时触发
MouseDown 按下鼠标键时触发
MouseUp 放开鼠标键时触发
MoveWindow 当移动窗口时触发
OpenWindow 打开一个新窗口时触发
ResizeWindow 调整窗口大小时触发
RightMouseDown 按下鼠标右键时触发
RightMouseUp 放开鼠标右键时触发
StartMovie 影片开始播放时触发
StepMovie 分格播放影片时触发
StopMovie 停止播放影片时触发
TimeOut 超过设置的时间时触发
ZoomWindow 放大窗口时触发
如果需要影片响应某类事件,只需在该事件中写脚本即可。

现在再来看看脚本的优先权:
事件脚本(Event Script),是指以下五种事件:MouseUpScript,MouseDownScript,KeyUpScript,KeyDownScript,TimeOut;
精灵脚本(Sprite Script),是直接赋给精灵的动作;
剧组成员脚本(Cast Member Script),是赋给演员的动作,如果由该演员产生的精灵在同类事件中没有写脚本,那么所有精灵都将执行该演员的动作;
帧脚本(Frame Script),通过双击脚本通道写入的脚本,或者将演员表中的脚本成员拖到脚本通道上,也成为帧脚本,用来控制在某些帧应执行的动作;
电影脚本(Movie Script),起全局作用,一般初始化工作和全局变量、用户自定义事件都在这里完成。

如果同时存在几种脚本,将执行优先级别较高的脚本,一般地,优先级高的脚本覆盖优先级低的脚本。

比如同一精灵既有精灵脚本又有剧组成员脚本,将执行优先级较高的精灵脚本,并屏蔽优先级较低的剧组成员脚本。

脚本的位置安排相当重要,稍有不慎就可能出现漏洞。

比如在帧脚本中对某一精灵木偶化,并操纵它的行为,如果将该帧脚本放在电影脚本中,那么无论在什么地方,只要该精灵所在的通道不为空,该通道上的精灵就会作出相同的动作。

同样,不同的事件必须有对应的判断条件,比如在MouseDown事件中用The MouseUp作判断条件,注定不会有什么反应;同样在MouseUp事件中判断The StillDown 或The MouseDown,别生气,还是没有反应。

一般来讲,凡是能够用总谱实现的动作都可以用脚本来实现,有时候用脚本实现要简单得多。

比如在一个游戏中,两个精灵的几次对话可以用总谱来控制,也可以用脚本实现。

用总谱实现是恰当地安排精灵的位置和讲话内容,根据情节顺序进行。

如果用脚本来控制,不仅总谱要简单得多,实现起来也较方便,而且影片要小得多:通过脚本控制精灵的移动和对话框的位置,根据情节设置计数器来控制讲话内容和时间长短。

还有两个相当重要的窗口:Debugger(调试) 和Message(消息)窗口。

在调试时结合这两个窗口可以无往而不胜。

影片的最终效果靠舞台、总谱和Lingo脚本来实现。

总谱的编排和Lingo脚本的高级应用需要高超的技巧,这必须在使用中不断积累经验。

入门篇(四)
下面介绍一个用来检测饼图颜色的简单例子。

首先在Paint窗口中画彩色饼图,保存为“Circle”,在Text窗口中作输入文本“The color is:”,并保存为“Textbar”。

将上面两个剧组成员拖到舞台上,设置他们的属性。

将饼图墨水效果设置为“Matte”或“Background Transparent”,消除白色边框。

在总谱中将两个成员的长度均设为一帧,放置在第一帧。

在电影脚本中输入如下初始化脚本:
global _Color, _text
on startmovie
_text = "the color is: "
_color = rgb(0,0,0)
member("textbar").alignment = #center
member("textbar").text = _text
end
下面分析一下取色方法。

要求当鼠标点击在饼图上时必须实时检测出颜色值。

因为影片以30帧每秒的速率播放,也就是说在一帧上每秒可以检测30次鼠标事件并作出相应判断,这对于鼠标事件来说时间已经足够短了。

双击第一帧的脚本通道,在帧脚本中输入如下脚本:
on exitFrame me
check --检测鼠标事件并在当前帧循环
go the frame
end
on check
global _color, _text
repeat while the mouseDown --检测鼠标按键
if the mousemember <> member("circle") then --如果鼠标没有
--选中调色饼
exit --则退出
end if
--得到相对于调色饼的鼠标点的位置,并取该点颜色值
--注意计算该点时,是用鼠标位置减去调色饼的左上角坐标,
--而不是调色饼的位置Loc
_loc = the mouseloc - point(sprite(1).rect[1],sprite(1).rect[2])
_color = member("circle").image.getpixel(_loc)
--如果取色为黑色或白色,则退出,这样可以保证只有鼠标点中饼图时才
--检测到颜色
if (_color = rgb(0,0,0)) or (_color = rgb(255,255,255)) then
exit
end if
--在文本框中显示颜色值,并改变文本框背景色为选取色
member("textbar").text = _text &Return& _color
sprite(2).bgcolor = _color
updatestage
end repeat
end
现在可以编译运行了。

效果如下图所示。

这个例子没有什么特别的技巧,只需要了解事件触发机制和前面介绍的影片运作方式,很快就可以做出来。

提高篇(一)
Director提供的功能,象文字特效、颜色渐变、动画效果等,很快就可以熟练掌握,但是要有提高,作出有一定水准的多媒体作品,就必须与脚本相结合,在保证影片细节的同时,提高交互性和智能化功能。

如果平时关注一下影视媒体和多媒体游戏、演示、教学软件,就会发现有很多别具一格、独具匠心的动画效果,其中一部分就是用Director开发的。

下面先介绍一下常见的使用技巧:
窥视效果,也称之为望远镜效果。

在前景上透过某一区域可以看到背
景的动画效果,动画超出该区域的部分被截去。

比如“红色警戒”的片头动画,通过望远镜看到坦克在移动。

实现方法:将动画放在前景的后面,在前景上选择一块区域,通过选取前景色和墨水效果,将该区域设置为透明,就出现这种效果。

日出效果,太阳升起,大地由暗变亮。

实现方法:通过颜色配合和透明度(Blend)的改变就可以实现这种效果。

主选单效果。

作为菜单使用的文本或图片,在鼠标移过或选取时图片
有颜色、大小变化或周围光环闪烁。

实现方法:判断鼠标位置所在成员,激活时用图片替换并循环几次,或者制作一个闪烁的影片环,加在激活成员上,就出现闪烁现象,如果可以配合声音,效果会更好。

一般来讲,如果选单较多,用脚本实现要简单得多。

其它效果还很多,不一一详述,只要多看多想多做,就会掌握更多的方法。

Lingo语言的掌握不是一蹴而就的事,需要不断学习和积累经验。

提高篇(二)
下面介绍一下脚本语言的三种基本结构:
1、顺序结构:
if logicalExpression1 then
statement(s)
else if logicalExpression2 then
statement(s)
else if logicalExpression3 then
statement(s)
end if
2、控制结构
case expression of
expression1 : Statement
expression2 : multipleStatements
...
expression3, expression4 : Statement
{otherwise : statement(s)}
end case
3、循环结构
repeat while testCondition
statement(s)
end repeat

repeat with counter = start to finish
statement(s)
end
在实际使用中,上述结构经常用到,至于语言细节描述,限于篇幅,不作具体讲解,请参阅帮助和其它低版本Director 的参考书籍。

在Director 8的系统路径…/learning/Lingo_examples下有个画图的例子Imaging.dir。

在该例中使用了行为库中的“Multi-State Button”行为。

现在要求以此为蓝本,改成一个不用行为库、更简洁易懂的例子。

由于讲解的方式所限,在此讲一讲主要思路,欢迎有兴趣的朋友与我联系,互相交流。

沿用系统实例的部分画图工具图片,保留四个显示颜色的大选色板,用四个画图工具(注意,不是按钮)制作四个光标用来作图。

方法如下:单击Insert/Media Element/Cursor…菜单项,选择画图图片,分别制作成光标并保存即可。

因为画图基本上全部由脚本实现,因而在舞台上布置好精灵后,将总谱中的帧长度全部设为一帧。

脚本编制思路如下:由选色板的激活状态选择颜色,在选色板的MouseDown事件中写脚本如下:
on mouseDown me
global drawcolor
--设置鼠标点击位置,由此得到颜色并替换精灵的剧组成员
yellowRect = rect(545,269,563,286)
redRect = rect(561,269,579,286)
blueRect = rect(545,285,563,302)
greenRect = rect(561,285,579,302)
--判断鼠标点击位置,得到颜色值,并替换该精灵的剧组成员
if (the clickloc).inside(yellowrect) then
drawcolor = rgb(255,255,0)
sprite(me.spriteNum).member = member("yellowcolor")
else if (the clickloc).inside(redRect) then
drawcolor = rgb(255,0,0)
sprite (me.spriteNum).member = member("redcolor")
else if (the clickloc).inside(Bluerect) then
drawcolor = rgb(0,0,255)
sprite(me.spriteNum).member = member("bluecolor")
else
drawcolor = rgb(0,255,0)
sprite(me.spriteNum).member = member("greencolor")
end if
end
提高篇(三)
现在需要判断激活的画图按钮。

设置一个全局变量CurrectTool保存当前激活的按钮,可能取值为#none(没有按钮被激活),#chalk(粉笔按钮被激活),#rectangle(矩形按钮被激活),#circle(画圆按钮被激活),#pencil(铅笔按钮被激活)。

在电影脚本中写自定义事件如下:
on checkInactive
global currenttool, mouseclickcounter
if currenttool <> #none then
case currenttool of
#chalk: sprite(3).member = member("chalkUp")
#rectangle: sprite(4).member = member("rectUp")
#circle: sprite(5).member = member("circleup")
#pencil: sprite(6).member = member("lineup")
end case
end if
mouseclickcounter = 0
end
然后在每个按钮的MouseDown事件中检测以上自定义事件。

以“ChalkUp”按钮为例,写脚本如下:
on mouseDown me
global currenttool, mouseclickcounter
mouseclickcounter = 0
checkInactive
sprite(me.spriteNum).member = member("chalkdown")
currenttool = #chalk
end
选择了画图工具,现在开始画图。

以矩形画图为例,写自定义动作脚本如下:
on drawwithrectangle
global mouseclickcounter, drawcolor
global beginpointX, beginpointY
--注意到全局变量MouseClickCounter,由于矩形由左上角和右下角坐标决定,
--因而必须鼠标连击两次才能画出一个矩形。

--首先得到左上角坐标,再得到右下角坐标
case mouseclickcounter of
0: beginpointX = the mouseH - 49
beginpointY = the mouseV - 66
1: endpointX = the mouseH - 49
endpointY = the mouseV - 66
member(2).image.draw(beginpointX, beginpointY, endpointX, endpointY ,[#shapetype: #rect,#linesize: 2,#color: drawcolor])
end case
end
因为在黑板上作图,所以在黑板的MouseDown事件中写如下脚本:
on mouseDown me
global currenttool, mouseclickcounter
--如果鼠标已经连击了两次,就将全局变量MouseClickCounter清零
if mouseclickcounter = 2 then
mouseclickcounter = 0
end if
--根据按钮的激活状态来决定画什么图形
case currenttool of
#rectangle: drawwithrectangle
#circle: drawwithcircle
#pencil : drawwithpencil
end case
--鼠标点击次数加一
mouseclickcounter = mouseclickcounter + 1
end
[img]/multimedia/director/d8/image/Image01017.gif[/img]
本例的画图思路基本就是这样,至于其他细节问题比如画图时光标的变化、画图的连续性,以及其他扩充的画图
功能,请有兴趣的朋友自己实现。

如果你根据系统提供的实例能独立实现画图功能,那么你对事件触发机制和Lingo脚本的掌握已经有很好的基础了。

图六:画图的实现
通常在编写脚本时会遇到很多意想不到的问题。

比如在用PuppetSprite将精灵木偶化以后,如果不及时取消木偶化,在其他地方就会出现出乎预料的结果;在设置时间等待时,如果用delay()或自定义Wait函数,那么在等待时可能就不能同步播放声音了,解决的办法就是自定义Wait函数,在等待时判断声音通道是否空闲,如果空闲则继续播放声音。

总之,熟能生巧,多思考多实践,你会成为高手的
精通篇
如果想作出专业级的多媒体软件,就必须精通Director;而精通Director,决不是一蹴而就的。

Director的功能相当强大,要全面掌握她不是一件很容易的事。

这部分将介绍一个行为库脚本的编写原理,来侧重介绍Lingo语言的使用,。

在做多媒体教学软件时,要对学生(用户)的练习结果作正误判断。

现在要求编写一个行为库脚本,对用户输入的数据进行检验。

也就是要为开发人员提供一个行为脚本,该行为应具有如下功能:
该行为联系的对象是域文本对象,域文本的内容是任何类型的可见数据;
该行为提供如下接口(相对于开发人员而言):三个正确答案的参数接口,答案正确时的消息接口,答案错误时的消息接口。

提供三个正确答案的接口是为了解决一题多解的问题。

该行为要求开发人员提供的正确答案必须是1~3个,且第一个答案不为空。

要求该行为高效、简洁、健壮。

根据要求,经过周详的分析,编写该行为脚本如下所示:
--本行为用来检测域文本(#field)的数据是否与正确答案相符
--"Check Answer" behavior v1.0 written by Hufei , 2000/07/14
--******************************************************************
--* 当前版本只适用于域文本(#Field),并且域文本的Framing属性必*
--* 须设置为“Limit to the field size”和“Editable”;*
--* 目前不支持文本(#Text)类型,这在以后的版本中会改进。

*
--******************************************************************
--参数说明:
--FirstAnswer: 域文本接受的第一个正确答案(由开发人员赋值)
--secondAnswer: 域文本接受的第二个正确答案
--ThirdAnswer: 域文本接受的第三个正确答案
--MessageCorrect: 如果域文本中输入的数据(指用户使用开发的最终产品
-- 时输入的数据)正确,则执行该消息(动作)
--MessageInCorrect: 如果域文本中的数据不正确,则执行该消息(动作)
--以上五个参数均由开发人员输入
--行为描述
on getbehaviorDescription
Return
"This behavior is used to check whether the text of current sprite "& Return &
"is fit in with the answer the developer given. "&"The parameters the developer" & Return &
"input are the answers, whose number can be at most three. "&Return
end getbehaviorDescription
--在打开行为库时该行为的浮动提示
on getbehaviorToolTip
return
"Drag this behavior to a sprite which member type must be #field or #text." &
"Input the answer text which format must be a string or an integer value or a float value," & "the first answer text can not be EMPTY, other two may be EMPTY." &Return&
"Caution: In this version, the member must be a field, not a text!" &
" And the framing property of field must be "& QUOTE &"Limit to field size"& QUOTE & "and "& quote &"Editable" & quote &"!"&Return
end
property spriteNum
property MySprite
property myMember
property MyType
property FirstAnswer
Property SecondAnswer
Property ThirdAnswer
Property MessageCorrect
Property MessageIncorrect
--检测消息,初始化精灵(域文本)
on beginsprite me
checkMessage
Initialize me
end beginsprite
--精灵退出舞台时清空
on endsprite me
sprite(me.spriteNum).member.text = ""
end
--检测消息
on checkMessage
if (MessageCorrect = "Nothing") or (MessageCorrect = "") then
MessageCorrect = "Nothing"
end if
if (MessageIncorrect = "Nothing") or (MessageCorrect = "") then
MessageIncorrect = "Nothing"
end if
end checkMessage
--初始化精灵
on Initialize me
Mysprite = sprite(me.spriteNum)
myMember = mysprite.member
MyType = MyMember.type
mymember.text = ""
--第一个答案不能为空
if FirstAnswer = "" then
alert "The correct answer can not be empty!"
end if
end Initialize
--离开当前帧时判断域文本是否为空,如果不为空,判断是否按下回车键on exitframe me
if mymember.text <> "" then
checkEnter
end if
end exitframe。

相关文档
最新文档