zoukankan      html  css  js  c++  java
  • 转载:关于 addFrameScript函数的纠结

    原文地址 http://peijinlong.javaeye.com/blog/776764

    好久没有继续更新了,难得远道国庆放假,得好好归纳下才行。
         之前在做项目的时候,需要在一个MovieClip的时间轴的两个时刻执行帧脚本,但是在使用addFrameScript函数的时候发现了它的一些比较出乎意料的行为。现在就来总结一下:


    1、addFrameScript的扩展用法。
       我之前就知道这个公开的“秘密”API是用于在程序里面动态的为MC增加帧脚本的一个函数,这个函数的一般用法如下:

    Js代码 复制代码
    1. mc.addFrameScript(frameIndex,function);  
       mc.addFrameScript(frameIndex,function);
    


       其中frameIndex就是你要加入帧脚本的帧。这里值得注意的是,这里的frameIndex是从0开始的,而不是像gotoAndStop()函数是从1开始的,这里需要将实际的帧减一才是正确的。
       而在我们需要一次过在多个帧上面添加不同的帧标记的时候,我们需要多次调用这个函数。例如:

    Js代码 复制代码
    1. mc.addFrameScript(1,fun1);   
    2. mc.addFrameScript(5,fun2);   
    3. mc.addFrameScript(10,fun3);  
       mc.addFrameScript(1,fun1);
       mc.addFrameScript(5,fun2);
       mc.addFrameScript(10,fun3);
    


    而实际上,我们可以这样使用,以提高编码效率:

    Js代码 复制代码
    1. mc.addFrameScript(1,fun1,5,fun2,10,fun3);  
       mc.addFrameScript(1,fun1,5,fun2,10,fun3);
    




    2、addFrameScript的一个小秘密
       其实我们在使用Flash IDE为一个MC增加帧脚本的时候,在编译期,编译器也是使用addFrameScript来为你的MC增加帧脚本的,为了验证这个想法,你可以做一下实验。
       假设有这么一个类:

    Js代码 复制代码
    1. public class TestClass extends Sprite   
    2. {   
    3.    public function TestClass():void{   
    4.    }   
    5. }  
    public class TestClass extends Sprite
    {
       public function TestClass():void{
       }
    }
    


         然后打开Flash IDE,创建一个MC类型的原件,在时间轴的第一帧上面增加一个任意的帧脚本,例如一个stop()函数。然后将这个原件绑定到上面这个类上面,保存。然后发布影片,会发现编译失败,错误提示为无法找到addFrameScript函数。
        从这个实验可以知道,编译器在发布的时候也是使用这个内部API来增加帧脚本的。

    3、运行时addFrameScript的行为。
         运行时的addFrameScript行为比较少人知道,这个可以归纳为:


        
    • 调用一次addFrameScript函数增加了帧脚本后,这个帧脚本可以多次生效。所以MC用完后一定要记得stop掉,否则只是从显示列表 remove掉是没有用的,这个帧脚本还是会循环运行的。   
    • 在同一个帧上面多次调用addFrameScript函数,只有最后一次的调用会成功,前面的帧脚本会被覆盖。


       最后,也是最别扭的一个行为就是,一旦这个MC开始了播放,再次调用addFrameScript就会无效的了。假设我们有以下的代码:

    Js代码 复制代码
    1. public class TestClass extends MovieClip{   
    2.   
    3. public function TestClass():void{   
    4.   this.addFrameScript(3,fun1);   
    5. }   
    6.   
    7. private function fun1():void{   
    8.   trace("This is fun1.");   
    9.   this.addFramScript(10,fun2);   
    10. }   
    11.   
    12. private function fun2():void{   
    13.   trace("This is fun2.");   
    14. }   
       public class TestClass extends MovieClip{
       
       public function TestClass():void{
         this.addFrameScript(3,fun1);
       }
    
       private function fun1():void{
         trace("This is fun1.");
         this.addFramScript(10,fun2);
       }
    
       private function fun2():void{
         trace("This is fun2.");
       }
    }
    



    然后发布调试影片,发现只有 fun1被执行,fun2的trace是没有出现的。看来我们是无法为一个正在播放的MC增加帧脚本的,这个奇怪的行为可是搞了我好一阵子呢。

  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/xbglbc/p/1938034.html
Copyright © 2011-2022 走看看