运用Actions语句实现Flash中的热区交互
2009-03-02杜娟
杜 娟
热区,通俗地讲就是一个看不见的交互区域,通过单击、滑过等响应方式触发其包含的其他响应。在Flash中没有明确这种功能,但是我们可以综合运用元件(影片、按钮)和Actions语句来实现。
一、热区的建立
(一)特殊按钮法
Flash中按钮制作共包括四帧,依次为:弹起(release)、指针经过(pass)、按下(down)和单击(press)。如果在前三帧不做任何设置,而只在第四帧中绘制形状或导入一幅图片,如五角星、动物、地图等,那么就制作了一个“无形”的特殊按钮。这种按钮放在场景中是看不到的,但一样可以实现按钮的交互,在绘制的形状范围内单击,热区响应就实现了,响应的区域就是这些隐藏的图形。
(二)元件透明法
在Flash6.0以后的版本中,图形、影片元件是可以进行类似于按钮交互的。即通过给图片、影片元件加上Actions语句实现一些特殊的功能,而元件可以设置多种属性,所以我们说赋予语句的元件在某种意义上是增强型的按钮。如将图片元件的透明度(Alpha)设置为“0”并且给其加上交互语句,此时图片就是一个热区。再如,将动态影片元件进行透明度设置的话,那么热区也在不停地变化。从而使热区更加丰富多彩。需要提示的是:这一方法同样适用于按钮元件,虽然做法不同,但可以达到和前一种方法一样的效果。
二、热区的响应
(一)鼠标与热区的响应
当鼠标指向某一热区时,屏幕上会给出明显的变化对用户进行提示,通常采用的方式是出现一段解释文字、鼠标外形的变化或播放声音等。
1.文字注释响应
即当鼠标进入由按钮制作的隐藏区域中,出现文字提示。此效果可利用控制元件的透明度alhpa来完成,可以给按钮加上如下语句实现提示:首先确保提示的文字内容是一个影片元件,为其命名为实例名instancename,并将其alpha值设定为0,即不透明。在按钮的“动作”面板中编写如下的Active脚本:
on (rollOver) {
instancename._alpha = 100;
}
on (rollOut) {
instancename._alpha = 0;
}
2.用自定义鼠标注释响应
要创建自定义指针,可在舞台上设计某种影片剪辑。再在动作脚本中隐藏标准指针,并跟踪自定义指针的移动。要隐藏标准指针,可使用内置Mouse类的Mouse.hide()方法。要使用影片剪辑作为自定义指针,可使用startDrag()动作。创建影片剪辑,将其用做自定义指针并将该剪辑的实例放置在舞台上。在“动作”面板中键入以下内容:
on (rollOver) {
Mouse.hide();
newmouse._alpha = 100;
startDrag(newmouse, true);
updateAfterEvent();
}
on (rollOut) {
Mouse.show();
newmouse._alpha = 0;
}
3.声音注释响应
当鼠标进入热区范围,通过一段声音提示。这种方式往往用于低年级识字教学中。其做法是:首先将某段声音导入到舞台上。打开库,选中刚刚导入的声音,单击右键,点击“链接”,在弹出的“链接属性”对话框中,输入声音的标识符,如soundlable,并将“作为动作脚本”的复选框勾中,点击“确定”按钮确认。回到舞台上,选择“窗口”→“开发面板”→“行为”,在行为属性框中添加声音行为,即选择“+”,选择“声音”→“从库加载声音”,在对话框中输入声音链接的ID,也就是声音的标识符sound- lable,以及声音的实例名称,如instancename。接下来点击“确定”按钮即可。这时,会发现“行为”属性面板上增加了“释放时”的行为,只需要将其改为“移入时”即可。同样的操作方法,“移出时”的行为是停止声音。该部分的Active脚本如下:
on (rollOver) {
//Play Internal Sound Behavior
if(_global.Behaviors == null)_global.Behaviors = {};
if(_global.Behaviors.Sound == null)_global.Behaviors.Sound = {};
if(typeof this.createEmptyMovieClip == 'undefined'){
this._parent.createEmptyMovieClip('BS_instancename',new Date().getTime()-(Math.floor((new Date().getTime()) /10000)*10000) );
_global.Behaviors.Sound.instancename = new Sound(this._parent.BS_instancename);
} else {
this.createEmptyMovieClip('_instancename_',new Date().getTime()-(Math.floor((new Date().getTime()) /10000)*10000) );
_global.Behaviors.Sound.instancename = new Sound(this.BS_instancename);
}
_global.Behaviors.Sound.instancename.attachSound("soundlable");
if (true) {
_global.Behaviors.Sound.instancename.start(0,1);
}
//End Behavior
on (rollOut) {
//Stop Sound Behavior
_global.Behaviors.Sound.instancename.stop("soundlable");
}
以上都是以鼠标移入热区为例进行热区响应的,其实还可以利用语句实现其他方式的响应。如在热区内按下鼠标:MovieorbuttonName.onPress;单击热区:MovieorbuttonName.onRelease;按下鼠标:MovieorbuttonName.onMouseDown;移动鼠标:MovieorbuttonName.onMouseMove;鼠标到达热区上:MovieorbuttonName.onRollOver;鼠标从影片移到热区外:MovieorbuttonName.onRollOut。
(二)元件与热区的响应
这种响应不仅仅是鼠标与热区之间的交互,而增加了第三方,也就是当某个物体被移动到热区上时产生交互,这种方式在一些实验或游戏中经常能够见到。一般是当物体移动到热区上时响应交互,当没有到达热区上时物体返回到原来的位置。
首先制作两个元件——被拖动的物体和热区,物体的实例名为Object,热区的实例名为Hotarea。再为元件所在的帧加上如下Actions语句:
_root.object.onPress = function() {
_root.object.startDrag();
x0=_root.hotarea._x;
y0=_root.hotarea._y ;
x1=_root.object._x;
y1=_root.object._y;
};
_root.object.onRelease = function(){
_root.object.stopDrag();
if(_root.hotarea.hitTest(_root.object))
{
_root.object._x = x0;
_root.object._y = y0;
_root.object.stopDrag();
trace("到达目标区域");
}
else
{ _root.object._x = x1;
_root.object._y = y1;
trace("没有到达");
}
};
trace语句可以替换为需要的提示方式。如:gotoandplay()、music.start()等。
(作者单位:辽宁电化教育馆)