一、什么是行为
行为是一类特殊的剧本,即我们通常所说的Behavior。为了明白其具体含义,让我们先来看看什么是剧本。
在Director中,虽然只要通过鼠标的点击和拖动等一些非代码的操作就可以实现许多复杂的交互和演示,但Director强大的真正原因之一在于拥有内置的编程语言Lingo,这也是它能够成为一个完整多媒体开发平台的关键。而Lingo作为Director的核心内容,则是通过各种不同类型的剧本来实现其作用的。
Director中的剧本共有四种:
* 影片剧本(Movie Script):作用于整个影片,包含有可供其它剧本调用的处理程序。
* 父代剧本(Parent Script):仅在进行面向对象编程时使用。
* 行为剧本(Behavior Script):根据作用区域不同分为角色剧本(Sprite Script)和帧剧本(Frame Script),分别控制相应的角色或帧。
* 演员表剧本(Cast Script):隶属于相应的演员,作用于所有使用此演员的角色。
这四种剧本互相协作,对影片进行着全面的控制。而其中的行为剧本,使用得最为广泛。
二、为什么要使用行为
那么为什么要使用行为呢?也就是说,使用行为有什么好处呢?
其实,行为的最大优势在于能够批量“生产”和“操纵”特定的角色或帧。举个简单的例子来说,如果我们需要制作一些简单的导航按钮,则只需编写下面这段代码即可:
on mouseUp me
go to frame 5
end
这段代码的含义非常简单:当在此按钮上点击鼠标时播放头跳到第5帧。我们只要将其赋予某个按钮,即可实现相应的导航功能。
如果只需少量这样的按钮,则并不能看出来行为的优势,但如果需要制作许多这样的导航按钮且导航目的地不同时,行为的优势便显而易见了。简单的说,只需编写一个简单的导航行为,就可“以不变应万变”。
三、编写自己的行为
下面我们就以上面所提到的导航按钮为例,编写一个简单完整的“Guide Behavior”。
1. 准备素材:
首先,准备需要使用的演员(包括文本演员和按钮演员各4个)并将其置于舞台之上,完成后的结果如图所示。其中4个文本演员生成的角色分别位于通道1中的不同帧。
www.goodsgy.com
2. 编写剧本:
打开剧本窗口,建立一个名为“Loop”的剧本演员,并在属性监察窗中将其属性调整为“Behavior”,然后输入下面的代码:
on exitFrame me
go to the frame
end
www.goodsgy.com
上面这段代码使得播放头始终在当前帧上循环,直至发出跳出循环的命令。其实这个“Loop”便是一个简单的行为,只不过它并没有需要设置的参数。
使用相同的方法建立一个名为“Guide”的剧本演员并调整其属性,然后输入下面的代码:
property pTargetFrame
on getPropertyDescriptionList me
list = [:]
addProp list , # pTargetFrame, [ # comment: "Go To Frame" , # format: #integer , # range: [ # min: 1 , # max: 25 ], # default: 1 ]
return list
end
on mouseUp me
go to frame pTargetFrame
end
3. 添加Script:
将行为“Loop”分别拖拽到分镜表窗口帧通道的1、5、16、24帧,以使影片能够在这些帧上循环播放。
www.goodsgy.com
以同样的方法将行为“Guide”拖拽到角色2(由演员“Button01”生成)上,此时会出现下图所示的参数对话框。通过这个对话框,可以直接指定“go to frame pTargetFrame”命令中pTargetFrame的取值。利用滑动条,在当前对话框中指定其取值为“1”。
www.goodsgy.com
分别对角色3、4、5进行相同的操作,只不过需要在参数对话框中指定不同的pTargetFrame取值:角色3的pTargetFrame = 5,角色4的pTargetFrame = 16,角色5的pTargetFrame = 24。
从以上的操作中可以看到,此时的pTargetFrame已经成为了一个“变量”,我们完全可以根据需要指定其取值,从而避免了为不同的导航目的地编制不同的导航命令。这便是行为的强大之处。 www.goodsgy.com
www.goodsgy.com
<--分页-->
www.goodsgy.com
四、完善自己的行为
虽然“Guide”行为已经能够发挥其应有的作用,但离完整的行为还有一段距离,下面让我们来对其进行一些完善。
1. getPropertyDescriptionList函数的使用
在编写上面的“Guide”行为时,我们使用了一个名为“getPropertyDescriptionList”的函数,那么这个函数具体有什么作用呢?
getPropertyDescriptionList函数实际上返回的是一个属性列表,而其中的属性和属性值是利用列表命令addProp添加的。具体到这个“Guide”行为来说,此属性列表中只有一个属性“#pTargetFrame”,而其值仍然是一个列表[ # comment: "Go To Frame" , # format: #integer , # range: [ # min: 1 , # max: 25 ], # default: 1 ]。使用getPropertyDescriptionLIst函数,可以建立一个参数对话框,其中#comment用来显示参数的描述信息,#format用来限定参数的取值类型,#range用来限定参数的取值范围并确定参数的取值,default为参数的缺省值。要注意的是,#range属性并不是必需的。如果没有#range属性的话,则需要手动输入一个参数的取值。
www.goodsgy.com
2. runPropertyDialog函数的使用
在某些情况下,我们希望行为能够半自动地设置其参数,而无需每次使用时都进行手动设置,此时runPropertyDialog函数便发挥作用了。例如,我们可以为“Guide”行为添加下面的代码:
on runPropertyDialog me , list
setProp list , # pTargetFrame, 7
pass
return list
end
现在如果将这个行为拖拽到一个角色上的话,会出现下面的参数对话框:
www.goodsgy.com
这便是runPropertyDialog函数的作用:使用属性列表命令setProp将pTargetFrame的取值预设为7,从而无需我们手动设置。更为“神奇”的是,如果去掉其中的“pass”命令,参数对话框将不会出现,但setProp命令仍然有效,这样便实现了参数的半自动设置。
3. isOKToAttach命令的使用
此命令的含义显而易见,即检测行为是否“is OK To Attach”,当我们需要限定行为的使用范围时,就可以利用isOKToAttach命令。试着将下面这段代码加入“Guide”行为中:
on isOKToAttach me , spriteType, spriteNum
if spriteType = # graphic then
if sprite ( spriteNum ). member . type = # button then
return TRUE
else
return FALSE
end if
end if
end
如果现在再拖拽这个行为就会发现,它不会像以前那样可以被添加到任意的角色上,因为此时isOKToAttach命令已经限制其“只能添加给#button类型的演员生成的角色”。当然,对于isOKToAttach命令,除了#button以外,还有许多可供我们选择的参数,在这里就不一一列举了。
4. getBehaviorDescription函数和getBehaviorTooltip函数的使用
与其他的部分相比,getBehaviorDescription函数和getBehaviorTooltip函数的作用就不是那么重要了,不过它们仍然是构成完整行为的两个有机部分。
如图所示,getBehaviorDescription函数返回一个字符串,并将其显示在行为监察窗内:
www.goodsgy.com
而getBehaviorTooltip函数的作用更为简单:将一个返回的字符串作为其所属行为在库面板中的一个“Tool tip”。只有当我们将一个行为添加到库面板后,才需要这一功能。
www.goodsgy.com
五、一点说明
虽然我们编写的这个“Guide”行为本身非常简单,但却涵盖了一个完整行为所涉及的全部内容,因为无论一个行为多么复杂,其本身均由下面几部分组成:
* Property变量的声明
* getPropertyDescriptionList函数
* runPropertyDialog函数
* isOKToAttach命令
* getBehaviorDescription函数
* getBehaviorTooltip函数
* 行为主体代码
当然,这七个部分并不都是必需的。一般情况下,只需包含Property变量的声明、getPropertyDescriptionList函数和行为主体代码即可。
只要把握住以上几点,我们便可以举一反三,编写更多的自定义行为来满足不同的需求。如果在编写行为时遇到了困难,可以参考Director库面板内置的一些简单行为,会有不小的收获。
www.goodsgy.com