| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 网页制作 > Flash教程 > ActionScript教程 > 文章正文 用户登录
如何加入透明Flas
为新浪博客添加fl
flashget下载联盟
265联盟:“Flash
新易网络提供100M
龙太极/100m/asp/
无限网络提供50M 
霞光科技50M/Htm/
苏能科技100M/FTP
悠博科技50M/FTP/

as进阶---影片剪辑深度交换函数的实现           

as进阶---影片剪辑深度交换函数的实现

作者:佚名 来源:闪吧 作者: auzn 更新:2007-1-13 20:46:34 错误报告 我要投稿

<序:好长时间没有写教程了,做网站太累了,写个教程换换气>

由于做的网站有一些应用要用到模仿窗口的深度交换,所以才进行了一些研究,

也可以通过本教程学习或复习一下数组的初级和中级应用。

Flash MX 2004也提供了几种用于深度交换的

函数,如 MovieClip.getNextHighestDepth(), MovieClip.getDepth(), MovieClip.swapDepths()等等

但是要对于一定区间深度的深度交换getNextHighestDepth函数可能就不太好用了。

例如要影片剪辑的深度有范围限制,

像下面描述的例子:(均为影片剪辑)

a1_mc,a2_mc,a3_mc.......a100_mc 深度:1,2,3,....100

b1_mc,b2_mc,b3_mc.......b100_mc 深度:101,102,103,....200

c1_mc,c2_mc,c3_mc.......c100_mc 深度:201,202,203,....300

现在要对b系列的进行频繁的深度交换,但是不能超出101~199这个深度范围,如果用getNextHighestDepth可能就会

干涉到c系列的深度值。

即使影片剪辑中包含有输入文本等东东,本例点击后也会触发交换函数而进行深度交换。

原理:当MOUSE在一些层叠的影片上点击时,利用hitTest()函数进行捕获这些层叠的影片,

再对这些影片进行深度排序,

得到其中的最大的深度的影片,因为深度大就在上面,盖往了深度小的,

所以这个深度最大的将成为所有(也有这些层叠之外的)的影片中深度最大的。

例如:(下面均是影片和其深度)

m1,m2,m3,m4,m5,m6

4, 1, 3, 5, 2, 6

可以知道m6是在最上面的。现在我点了一下m3,所以m3就应该是6,而m6就应当是第二深的,为5

深度3之前的(m2,m5)都不动,其它的要重新排列

排后如下:

m1,m2,m3,m4,m5,m6

3, 1, 6, 4, 2, 5

这样就保持了原来的(除m3)深度顺序,如m6要在m4,m1,m5,m2之上。要是直接用

MovieClip.getNextHighestDepth()和MovieClip.swapDepths()来实现

m6就要在m1,m4的下面了,正常来说是不正确的

下面我们就来做这个交换函数吧

效果:
点击浏览该文件

怎么样,是不是有点心动了

先建立一个550*400的swap.fla的影片,背景任意,帧速最好选为40,如下图:

按此在新窗口浏览图片

拖一个按钮组件入主场景,用于产生新窗口的点击事件,如下图:


按此在新窗口浏览图片

属性如下:

按此在新窗口浏览图片

在按钮上加入下面的动作,如图:

按此在新窗口浏览图片

有人会问createWin()是什么,其实她就是以后要用到的窗口生成函数,这里为了方便,就先把按钮上的工作都

做完了,以后就不用再管按钮啦。

接下来就要构建主要部件了:

按Ctrl+F8新建一个影片剪辑,命名为win,如下图:

按此在新窗口浏览图片

先建立一个足够大的矩形,做为窗口的背景,再在上面新加入文本输入和输出区,还有一个小的关闭按钮(一会儿

我们一起做),如下图:

按此在新窗口浏览图片

文本输出区的属性如下:

按此在新窗口浏览图片

对于矩形,我们按F8,把她封装,属性如下(*注意要选Button*):

按此在新窗口浏览图片

属性如下:

按此在新窗口浏览图片

并在上面加入如下代码:

on (press) {
startDrag(this);
}
on (release) {
this.stopDrag();
}
//

接下来我们就开始做关闭按钮:按Ctrl+F8新建一个剪辑,命名为close_btn,如下图:

按此在新窗口浏览图片

做成如下图所示的就可以啦,想怎么做就怎么做。

按此在新窗口浏览图片

把做好的按钮拖入到矩形框剪辑上

在关闭按钮上加入如下的AS:


on (release) {
with (_parent) {
trace(this+" 将要关闭,提取出的数字是:"+spilttask(this));
destroyedExec_array(spilttask(this));
}
this.removeMovieClip();
}

先不要管,后边会有解释的。

最后还要在上面做完的win的主帧写入下面的代码,目的是为了让mouse指向矩形MC时还保持是指针形状


drag_btn.useHandCursor = false;
////////////////////////////////////////////////

回到主场景,在库里右键点击win,在弹出的菜单里选择Linkage...

按此在新窗口浏览图片

按下图,进行选择,并命名为win

按此在新窗口浏览图片

这时主场景上只要保留一个新窗口的按钮就行啦,其它的都要删去。

下面在主场景的主帧(也就是第一帧),加入Action Script.如下:

由于在这里把缩进省略了,看着不舒服,可以把它COPY到FLASH MX 2004里, 点击自动排版就行啦。


按此在新窗口浏览图片

//======================================//
//****** Swap-Movie-Clip-Depth ******//
// By: AuZn
//======================================//

//声明一个用于存放加载窗口信息的数组:win_array
var win_array = new Array();
//声明一个加载窗口的计数器
var i:Number = 1;
//声明一个加载窗口的位置偏移
var diff:Number = 120;
//此函数用于新生成一个窗口
function createWin() {
//加载win影片剪辑,并重新命名为: "win"+i+"_mc"
this.attachMovie("win", "win"+i+"_mc", i);
//把新生成的窗口压入win_array数组,包括的信息:窗口名winname:"win"+i+"_mc",窗口深度depth:i
//大括号是把这两项作为一个Object压入数组

win_array.push({winname:"win"+i+"_mc", depth:i});
//初始化窗口的一些基本信息,包括位置和要显示的文本内容
eval("win"+i+"_mc")._x = diff;
eval("win"+i+"_mc")._y = diff;
eval("win"+i+"_mc").name_txt.text = "window"+i;
//生成新的窗口后计数器自加,位移自加
i++;
diff += 20;
}
//创建一个用于监听mouse单击的影片剪辑
this.createEmptyMovieClip("click_mc", 0);
click_mc.onMouseDown = function() {
//当mouse单击时运行置换函数
swapDepthFirst();
};


//第一次深度处理,函数声明
function swapDepthFirst() {
var temp_array = new Array();
//对win_array内的所有元素进行查询
for (var i = 0; i<win_array.length; i++) {
//判断条件:当此影片剪辑与mouse接触到时
if (eval(win_array[i].winname).hitTest(_root._xmouse, _root._ymouse, true)) {
//得到一个MOUSE所接触的所有影片剪辑的数组
temp_array.push(win_array[i]);
}
}
//进行第二次深度处理
swapDepthSecond(temp_array);
}


//第二次深度处理,函数声明
function swapDepthSecond(temp_array:Array) {
//对数组进行排序
temp_array.sortOn("depth", 16);
if (temp_array[temp_array.length-1] != undefined) {
//得到一个当前MOUSE接触的所有影片剪辑中深度最大的一个数组元素,就是最前面的
//进行第三步深度交换
swapDepthThird(temp_array[temp_array.length-1]);
}
}

//第三步深度交换,函数声明
function swapDepthThird(depthObject:Object) {
//由小到大排深度
win_array.sortOn("depth", 16);
var index = 0;
for (var i = 0; i<win_array.length; i++) {
//trace(win_array[i].winname+":"+win_array[i].depth);
if (depthObject.winname == win_array[i].winname) {
//找到和入口的Object的窗口名相同的元素的索引
index = i;
}
}
//先保存最大的深度的深度值
var tempDepth = win_array[win_array.length-1].depth;
for (var j = win_array.length-1; j>=index+1; j--) {
//由最后到先前找到的索引处开始将前一个值传给后一个值(因为索引元素前边的深度小,不用改变)
win_array[j].depth = win_array[j-1].depth;
}
//把最大的深度值给索引元素
win_array[index].depth = tempDepth;
for (var k = 0; k<win_array.length; k++) {
//开始重新分配深度
//trace(win_array[k].winname+":"+win_array[k].depth);
eval(win_array[k].winname).swapDepths(win_array[k].depth);
}
}


//删除窗口在win_array中的元素,函数声明
function destroyedExec_array(num:Number) {
for (var i = 0; i<win_array.length; i++) {
//比较元素名,如果相同就删除
if (win_array[i].winname == ("win"+num+"_mc")) {
//删除
win_array.splice(i, 1);
}
if (win_array[i].winname != undefined) {
trace("剩余窗口:"+win_array[i].winname);
}
}
}


//分离数字函数,用于提取目标名字内包含的数字组合 eg:_level0.win23_mc -----> 23

//这个就不做注释了,也是数组的应用
function spilttask(target) {
var splitnumber:Number = 0;
var targetstr:String = target._name;
var task_str:Array = targetstr.split("");
for (var i = 0; i<task_str.length; i++) {
if (!isNaN(task_str[i])) {
splitnumber = splitnumber*10+Number(task_str[i]);
}
}
return splitnumber;
}

然后进行最后一步:Ctrl+Enter测试一下吧。呵呵,我的这个方法可能有一些麻烦,如果有更好的置换方法,谢谢请教

上面可能会有一些疏漏,请见谅。

扩展功能可能会有很多,如果您有时间,可以把窗口做得更像些,也可以加其它的如自己定义窗口的名字啦等等。

如果还有不明之处,可以回帖,也可以到小站一叙:www.kingnare.com

作者:AuZn

源程序:
点击浏览该文件

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。