加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【转载】flash中 Depth :深度区域和时间轴刷新

发布时间:2020-12-15 17:55:48 所属栏目:百科 来源:网络整理
导读:深度区域: ????在为对象指定深度时必须清楚地了解Flash在深度上的三个区域。在Flash 中,深度的范围在-16384到2130690045之间,任何Flash的可视对象都不会超出这个范围。在播放时,Flash把时间轴中的对象按照默认的设置进行加载。-16384到-1是深度的第一个
深度区域: ????在为对象指定深度时必须清楚地了解Flash在深度上的三个区域。在Flash 中,深度的范围在-16384到2130690045之间,任何Flash的可视对象都不会超出这个范围。在播放时,Flash把时间轴中的对象按照默认的设置进行加载。-16384到-1是深度的第一个范围,在这个深度区域对象不可以使用脚本创建和移除,用于放置用户在编辑环境下创建的对象,这里把它称为时间轴区(Timeline)。接下来是0到1048575的深度范围,在这个深度范围内,对象可以使用脚本创建和移除,所以称为动态区(Dynamic)。之后一个区域称为保留区(Reserve),深度范围在1048576和2130690045之间,可以放置MC但是不可以移除。 Flash的深度区域: 时间轴区 -16384 到 -1 主要用于放置Flash 编辑时的对象,且对象不可用脚本移除,但可以使用脚本创建。 动态区 0到1048575 实现运行时的动态创建、动态访问和动态移除 保留区 1048576到2130690045 实现运行时的动态创建、动态访问,但不支持使用脚本移除对象。 Flash 在动态区之前提供了时间轴区,用于放置编辑环境下时间轴中的对象。在编辑环境下,最底层的对象放置到区域的最深处——-16384。在通常情况下会从-16383这个深度开始,Flash依次向较高深度放置时间轴中的对象。 接下来是动态区,在这个区域可以放置那些可以动态创建和移除的对象。而且这个区域也符合一般人的使用习惯,因为它的深度是从0开始的,而开发者在创建对象时通常也会考虑这个范围。在这个范围可以获得比较大的自由权,开发者可以使用脚本动态地创建和移除对象。如果对象不在动态区,那么首先可以把对象交换到动态区,然后再进行移除。 保留区可以理解为动态区的一个扩展,只是在保留区中无法使用脚本移除对象,对象在那个区域可以动态地被创建。在这个区域对象也可以使用swapDepth()方法交换到其它的深度区域。但保留区还是一个比较特殊的区域,因为那里的对象不可以被移除,而且深度高的有点离谱。在保留区Flash为对象提供了一定的存储空间。 需要特别注意的是,Flash 在使用createEmptyMovieClip()方法创建的空MC时,深度的分配上几乎没有什么限制,深度可以指定在-999999999999以下或是999999999999以上。虽然这个深度已经超出了刚才讨论的那个范围。 时间轴刷新: 关于深度,可能会遇到一些另人混淆的问题,特别是动态区和时间轴区。当时间轴被刷新时,所有的对象将被重新创建。Flash 会扫描位于该时间轴的时间轴区域,并清除保存在这些深度上的对象。然后Flash 读取时间轴上的数据并重新创建这些对象,但是通过动态方法创建的对象将被忽略。其中一个例子就是使用gotoAndPlay()返回播放已经播放过的帧,例如从第10帧返回到底5帧播放,这时Flash为了重新展示第5帧的内容必须刷新时间轴并完全重构第5帧的内容。但是使用动态方法创建的对象如果在时间轴刷新时被移除,那么这时并不被自动创建,除非程序给出。 很明显,这样可能会引起一些问题。首先,这样会失去在时间轴区域或是使用动态方法已经创建并交换到时间轴区域的对象。也就是在这中情况,不可以把使用动态方法创建的对象交换到时间轴区域,否则在时间轴刷新时会丢失这些对象。在开发时为避免这种情况的发生,可以创建一个单帧停止的MC,这样的MC可以是安全的,可以不必为时间轴刷新而担忧。 另外一个问题是无法移除所需要移除的对象。其原因是由于使用深度交换方法把时间轴区的对象转移到了非时间轴区,这样在时间轴刷新时就无法清除该对象了,而且这次刷新还会创建一个新的该对象到时间轴区。这种情况也应该避免发生。 还有一个需要清楚的问题是场景(Scene)跳转的问题。场景间的跳转不会引起时间轴的刷新,也不会触发其他一些特殊的事件。作为场景本身而言,它们是主时间轴的片段,当Flash被发布以后,这些场景便会整合到一起,变成单个的主时间轴。所以用户在一个场景创建的对象,它仍旧可以在接下来的场景出现,当然也可以使用脚本使那些对象消失。 播放器执行顺序: ????在深度问题上,还有一点比较容易被人们忽视。正如前面所提到的,深度也会影响到脚本的执行顺序。事实上深度本身并不影响脚本的执行顺序,但是深度却与对象的创建顺序有关。一般我们都会认为,在同一时间轴上,首先被创建的对象会首先执行它所包含的脚本。另人感到奇怪的是,在默认的发布设置下,那些最晚被创建的对象反而首先执行了EnterFrame事件中的脚本。在默认情况下对象从最底层开始被创建,这一点我们可以在Flash的发布选项中设置。帧脚本是按照它们被创建的顺序执行的。这样如果在bottom up 模式下,从技术角度而言,较低层的脚本反而较早执行,但是值得一提的是,EnterFrame事件中的脚本刚刚与之相反。 看来很有必要追究一下EnterFrame事件到底是怎样的一个事件。EnterFrame事件随着电影剪辑的帧速被持续地触发。可以认为EnterFrame事件是在播放头进入某一帧时触发的一个事件,但是在EnterFrame事件中的代码将先与帧脚本执行。但是,对象的创建和Flash的播放(对象状态的改变过程)到底是怎样一个关系呢?在Flash中第一帧的帧脚本和其它帧的帧脚本有着不同的行为。当运行一个Swf文件时,它的第一帧将首先被创建,然后开始载入该文档中的对象并拖入到舞台,这个过程可以认为是一个初始化的过程。所以在这个过程中随着对象的载入第一帧的容量将不断增大。这样做的原因也是显而易见的,只有当对象全部载入后,脚本才能执行,设想如果脚本所要操作的对象都不存在,那么脚本必然会发生错误。一旦所有的对象载入完毕,除第一帧外的其它帧都将被一次性创建,并开始播放。这样做的另外一个原因是,如果按照先创建,先播放的原则,那么必然导致不同电影剪辑播放时步调的不一致。因为创建对象是需要时间的,特别是在网络上,它还要有一个下载的过程。这里还要注意的是#initclip和#endinitclip中的代码块,它们通常定义在电影剪辑的第一帧,只要符号被定义且被编译(电影剪辑符号定义了,但不一定都被编译),那么就执行该代码段,它用于电影剪辑的初始化,所以优先于其它脚本执行,并且仅执行一次,它的运行效果将作用到该剪辑的所有实例。 ????这样,就可以得出,Flash的执行可以分成两个过程。首先是对象的下载、创建和初始化,接下来是一个播放的过程。播放是一个对象状态随着帧速改变的过程,其状态的两个极端是存在与不存在。这样在Flash的执行过程中,电影剪辑第一帧的脚本将首先被执行;然后是播放过程,其脚本执行的原则是EnterFrane事件脚本的执行先于帧脚本的执行。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读