qingtianyzl

晴天blog(QQ:14493558)
  博客园  :: 新随笔  :: 联系 :: 管理

ActionScript(笔记2)

Posted on 2006-05-04 17:11  晴天  阅读(1072)  评论(1)    收藏  举报

                       第十章  事件和事件处理器

  1:我们告诉解释程序要做什么,但是我们如何告诉他执行这些动作呢,ActionScript代码
     并不会自己执行,总要什么东西驱动着它执行
     这个东西就是同步机制 或者是预先指定的异步事件的发生。
  2:同步机制的执行顺序
     当播放头进入一个新的帧的时候,解释程序就会执行属于该帧的任何代码,当帧中的代码
     得到执行之后,屏幕显示就会更新,并播放声音,然后,播放头又进入到下一帧
  3:有的代码并不是按照预定的顺序来执行的,它要在ActionScript注意到某个预定的事件
     才执行,用户通过一些动作可以引发许多事件,事件可以导致基于事件的代码得到执行
     基于事件的代码(为响应事件而执行的代码)被称为异步执行的,因为触发事件可以在
     任意时间发生

     同步编程要求我们预先指定代码的执行时间,一异步编程让我们在事件发生的时候
     能够动态的做出响应,异步代码是ActionScript及其交互性的重点

  4:事件的类型
     用户事件:用户发生的动作
     系统事件:作为影片播放的一部分而发生的事件
     可以接收事件的ActionScript对象有:
      a:影片剪辑
      b:按钮
      c:XML和XMLScoke类对象

     ActionScript实际上有两种不同的事件实现,一类针对和影片剪辑与按钮相关的事件,
     另外一类针对所有其他种类的对象
 5:事件处理器
     并不是所有的代码,都会有事件的执行,只有我们编写对事件做出反应的代码才可以。
    三个必须:
     a:事件处理器必须有预先确定的名称
     b:事件处理器不用function语句来声明
     c:事件处理器必须属于按纽,影片剪辑或者对象,而不能够属于桢

6:事件处理器的语法
   按纽:on (eventName){
             statemens }
   影片剪辑:onClipEvent(eventName){
             statements }

   处理多个事件:
         on(rollover,rollOut){
             palyRandomSound();}

7: 创建事件处理器          
    要创建一个事件处理器首先要定义事件处理器,然后将它添加到相应的对象上       
    除了影片剪辑和按纽之外,有两个内置类XML和XMLSocket 支持事件处理器
   
   
8:事件处理器的生命周期和它所对应的对象生命周期有关,当一个剪辑或者按钮从场景上被删除,
   或者XML或XMLSocket对象死亡的时候,任何和这些对象相关的事件处理器都一同死亡,一个对象
   必须出现在场景上,或者存在于时间线上,它的处理器才能够保持活动
       

9:在flash中的所有事件发给所以场景中的影片剪辑,只要有响应该事件的代码存在,不会剪辑,按纽
   在那个位置 都会做出反应的

10:事件处理器的作用域
   a:影片剪辑事件
     和正规函数不同,影片剪辑事件处理器不定义局部作用域,当我们为剪辑添加处理器的时候,处理 
     器的作用域就是剪辑,而不是处理器本身,这意味着所有的变量都可以从剪辑的时间线上获得。
     影片剪辑一事件的作用域最简单的办法就是将处理器的语句看成是处理器所在的侦上的,然后如果
     侦上的语句的作用域是什么样的,就是怎么样的。
   b:按纽剪辑事件
     按纽处理器的作用域就是按纽所在时间线,
  
   c:其他对象事件处理器的作用域
     像xml和xmlSocket的事件处理器,他们的作用域和函数非常相似。
     它们有一个作用域链,其实可以把它们看作是一个函数,函数的作用域,
     是怎么的,就是怎么样的。

11:currentframe(MovieClip._currentframe 属性)
    public _currentframe : Number [read-only]
    返回指定帧的编号,该帧中的播放头位于影片剪辑的时间轴中。
  
12:影片剪辑与影片剪辑之间的变量传递
    对于影片剪辑与影片剪辑之间的变量传递,开始我以为很复杂,其实很简单,只要要所以在影片剪辑上
    所以在的变量(其实就是上面的所有代码)看作是剪辑本身时间线上的代码就可以了,所以访问的时候
    其实就可以看做是所在时间线与时间线之间的变量的传递。

    按钮与按纽之间的变量的传递
    首先要把按钮事件上的变量看成是按钮所置的时间线上的变量。
     注意: a:我们可以在按钮上给按 钮附加事件,但是我们不能够对按钮里面即所在的时间线上加上代码
           b:附加在影片剪辑上的代码是看作是剪辑本身时间线上的代码就可以了,而附加在按钮上
             的代码看成是按钮所在的时间线上的代码
           c:一个按钮里面可以嵌套另一个按纽,同时可以像影片剪辑一样进行参数的传递
   
    按钮与剪辑之间的变量传递
    按纽与剪辑之间可以任意的以相对或者的绝对的路径进行变量之间的传递,只是利用查入目标路径
    工具很容易出错,不过明白是可以实现的
    同时要注意的就是附加在影片剪辑上的代码是看作是剪辑本身时间线上的代码就可以了,
    而附加在按钮上的代码看成是按钮所在的时间线上的代码。所以他们在传递的时候要注意路径的
    起点问题不要弄错了

13:关于this的用法
    对于this在学习过程中,很多时候都看到它,也知道它的大概意思,现在对它做一个总的归纳
    引用对象或影片剪辑实例。
    执行脚本时,this 引用包含该脚本的影片剪辑实例。
    在调用方法时,this 包含对包含所调用方法的对象的引用。
    在附加到按钮的 on() 事件处理函数中,this 引用包含该按钮的时间轴。
    在附加到影片剪辑的 onClipEvent() 事件处理函数中,this 引用该影片剪辑自身的时间轴。
    因为 this 是在包含它的脚本的上下文中计算的,所以您不能在脚本中使用 this 来引用在类
    文件中定义的变量。
   
    this可以当做参数进行传递:例:
    function move(clip,x,y){
           clip._x+=x;
           Clip._y+=y;}
    onClipEvent(enterFrame){
          _root.move(this.10,15);}
 
14:按钮事件
    注意按钮事件所用的写法,按钮事件只送给鼠标所影响到的按钮,如果有多个按钮重叠,那么
    最上层的按钮就接收到所有的事件,其他按钮都得不到响应,即使最上层的按钮没有定义处理
    器也是如此。
    具体按钮事件祥见书上。

    影片剪辑事件:
    可以分有用户输入事件和影片播放事件
    用户输入实践与鼠标和键盘有关,而影片播放事件与flash播放器中侦的出现,影片剪辑的产生和
  死亡,以及数据的载入有关。
  同时注意用户的输入剪辑事件和前面所说的按纽事件在功能上有一定的重叠部分
          
   

 

15:影片剪辑与按钮里面可以同时放多个事件处理器。

16:执行的顺序
  一个影片的代码分散在多时间线上,或者多个剪辑事件中,所以执行起来有它的顺序,影片
  播放事件的处理就是按照影片的进展情况进行的:如:load->unload->enterFrame->data


17:复制影片剪辑事件处理器
 通过影片通过duplicateMovieClip()函数复制的时候,影片剪辑事件处理器也被复制,
 这样可以导致事件处理器里面的代码被复制后再次执行

18:用updateAfterEvent更新屏幕
 处理器的每一次执行都记录在侦的中间,但是结果只在每一侦得到渲染的时候才显示出来,这种方法
 可以在某种交互形式形式上制造出生动活波的效果
 而updateAfterEvent可以即刻渲染发生在任何用户输入事件处理器期间的任何视觉变化 

19:代码的复用性
 在按钮和电影剪辑中,在事件处理器中如果有重复性的代码,那么没有必要一次一次的去写同样的
 代码,只要大代码放在一个函数中就可以,然后在处理里调用这个函数就可以了

20:在者按钮和剪辑还有其规定的数据对象可以用之外,在其他地方像场景啊 上不能够用的  


21:关于鼠标的用法:Mouse
  Mouse 类是不通过构造函数即可访问其属性和方法的顶级类。
  您可以使用 Mouse 类的方法来隐藏和显示 SWF 文件中的鼠标指针(光标)。
  默认情况下鼠标指针是可见的,但是您可以将其隐藏并实现用影片剪辑创建的自定义指针。
  Flash 应用程序仅可以监视在其焦点以内发生的鼠标事件。
  Flash 应用程序无法检测另一个应用程序中的鼠标事件。
  事件
    onMouseDown = function() {}当按下鼠标时获得通知 
    onMouseMove = function() {}当鼠标移动时获得通知。 
    onMouseUp = function() {}当释放鼠标时获得通知。
    onMouseWheel = function([delta:Number],
    [scrollTarget:String]) {}当用户滚动鼠标滚轮时获得通知。 
  方法
     addListener(listener:Object) : Void
     注册一个对象以接收 onMouseDown、onMouseMove、onMouseUp 和 onMouseWheel 侦听器的通知。 
     hide() : Number
     在 SWF 文件中隐藏指针。 
     removeListener(listener:Object) : Boolean
     删除以前向 addListener() 注册的对象。 
     show() : Number
     在 SWF 文件中显示鼠
 
  
              

              第十章 数组
 1: 数组可以理解为数据结构,它能包含多个单独的数据值,就像一座楼房是一种物理结构,能够容纳多个
   层一样,数组是 一个有多用途的容器,它可以包含任意数量的项目,甚至不同类型的项目
   虽然我们说一个数组包含很多值,但是,记住数组本身是一个单独的数据是非常重要的,它就像一个包含
   多个字符,但仍然是一个单独的一个串,数字包含多个数位但仍然是一个单独的数字一样,作为一个单独
   的数据,数组可以被赋值给一个变量,或者用来作为复杂表达式的一部分;
   
 2:数组有索引,从零开始 
  数组的大小:数组的长度
  数组的创建:可以创建一个带数据直接量的新数组,也可以使用特定的内置函数Array();
          a:数组构造器
             语法:var myList = new Array();

         b:数组直接量:
          语法: [expression1,expression2,expression3,...]

          c:数组与其他语言的数组相比,AsctionScript数组内可以容纳不同类型的数组。
 3:引用数组元素
   其实就数组元素我们建好了,怎么样的修改和获取里面的值呢
  怎么样得到里面的值:arrayName[elementName]  elementName:为索引
  
  设置元素的值:利用附值的形式
     arrayName[elementName]=a;
 
  确定数组的大小:可以利用它的内置属性:arrayName.length
    注意通过.length获得的值,是它真实的个数,而不是比实际数小1,因为它不是从零开始是从
  跟索引不同,比它多一.

 4:命名数组元素
    要访问数组中的所有命名元素必须使用for-in循环,它会将命名元素都列举出来
   
    创建和索引命名元素
     arrayName[elementName]=expression
    另外一个创建方法:
     arrayName.elementName=expression
 
   


 5:添加数组元素
    a:直接添加:
       arrayName[elementName]=expression
    b:用length属性添加新的元素
       arrayName.length=Number
    c:用Array方法添加新的元素
      1:push()方法在数组末尾添加一个或者多个元素
         arrayName.push(item1,item2,...itemn);
      2:unshift()在数组开头添加一个或者多个元素
         arrayName.unshift()(item1,item2...itemn);
      3:splice()可以从数组中添加或者删除元素
         arrayName.splice(startIndex,deleteCount,item1,item2,...itemn)
         startIndex是一个数字,表示要删除或者选择插入元素的开始
         deleteCount是可选择参数,表示要删除多少元素,如果不想删除
         元素则deleteCount为零
         item1,item2...它们将以startIndex开始的元素被添加到数组中
       注意:splice()是可以同时添加和删除元索的函数
       
      4:它可以返回删除元素构成的数组
         example: mylist=["a","b","c","d"];
                  trace(myLIst.splice(1,2));

      5:concat()方法
         和push()一样,concat()添加元素到数组的末尾。和push()不同的是,concat()不修改
         调用它的数组--只返回一个新的数组,而且,concat()可以将作为参数传递进来的数组
         分为单个元素,也可将二个数组合并为一个单独的新的数组。
         origArray.concat(elementList)
         example:  var a=[1,2]
                   var b=[3,4]
                   var c=b.concat(a); //c现在为:[1,2,3,4 ]
                   var d=a.concat(5,6);//d现在为:[1,2,5,6]
                   
         concat()不会将嵌套数组分开(原来数组保持在主数组中)
                   var x=[1,2,3]
                   var y=[[5,6],[7,8]];
                   var z=x.concat(y); //z为:[1,2,3,[5,6],[7,8]];

6:删除数组元素
      a:delete
       delete.arrayName.[index]
       注意:delete并不会从数组中删除某个元素,它只是将目标元素设置为undefined
  
      b:用length属性来删除元素
         var a=[1,2,3]
         a.length=2;
         trace(a); //a现在为:1,2
  
      c:用Array方法删除元素
        对于数组,有多种内置的方法可以删除元素,pop()和shift()方法用来从数组的开头或结尾删
        除元素
        1:pop:删除数组的最后一个元素
        arrayName.pop()
        
        2:shif()方法:从数组开头处删除元素
           arrayName.shif()
       
        3:splice()方法
       
7:通用数组操作工具
  其实就在添加或删除数组元素之后,对数组元素进行重新排序以及分类,将数组元素转换为串,以及从
  其他数组中摘取数组。
  a:reverse():颠倒数组中元素的顺序 
    arrayName.reverse();
  b:sort():按照我们提供的任意规则重新排序数组中的元素的顺序
    public sort([compareFunction:Object], [options:Number]) : Array
    排序区分大小写(Z 优先于 a)。
    按升序排序(a 优先于 b)。
    修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置
    具有相同排序字段的多个元素。
    数值字段按字符串方式进行排序
  C:slice(Array.slice 方法)
   public slice([startIndex:Number], [endIndex:Number]) : Array
   返回由原始数组中某一范围的元素构成的新数组,而不修改原始数组。
   返回的数组包括 startIndex 元素以及从其开始到 endIndex 元素(但不包括该元素)的所有元素

   startIndex:Number [可选] - 指定片段起始点索引的数字。如果 start 是负数,
   则起始点从数组的结尾开始,其中 -1 指的是最后一个元素。
   endIndex:Number [可选] - 指定片段终点索引的数字。
   如果省略此参数,则片段包括数组中从开头到结尾的所有元素。
   如果 end 是负数,则终点从数组的结尾指定,其中 -1 指的是最后一个元素。

   返回
   Array - 一个由原始数组中某一范围的元素构成的数组。
 d:join(Array.join 方法)
   public join([delimiter:String]) : String
   将数组中的元素转换为字符串、在元素间插入指定的分隔符、连接这些元素然后返

 e:toString(LoadVars.toString 方法)
   public toString() : String
   以 MIME 内容编码格式 application/x-www-form-urlencoded
   返回包含 my_lv 中所有可枚举变量的字符串。

8:数组对象
  数组是一种类型的对象,是Array类的特殊实例

9:多维数组
   在 ActionScript 中,可以将数组实现为嵌套数组,其实质上是数组的数组。
   嵌套数组,又称多维数组,可以被看作是矩阵或网格。
   因此,在编程时,可能要用多维数组来为以下类型的结构建模。
   例如,棋盘是一个由八行八列组成的网格,可以将该棋盘建模为包含八个元素的数组,
   而其中每个元素也是包含八个元素的数组。

10:getTimer 函数
  getTimer() : Number
  返回自 SWF 文件开始播放时起已经过的毫秒数。
 


数组总结:
    数组数组可以理解为数据结构,它能包含多个单独的数据值,它有索引,有大小,我们可以引用
    数组元素,添加数组,删除数组,并数组元素进行重新排序以及分类,数组还有多维的

 


                                         第十二章 对象和类
 1: 我对对象和类的理解
    对象可以把它理解成为我们现实中的某一件东西,而要描述这件东西 我们要用到很多东西,比如
    它的大小,形状,颜色,这些其实就是描述对象的属性,其实也就是对象的属性,一件东西有它的
    功能,像汽车能够加速度,转弯...这些就是对象的方法。
   
    对于系统的对象它有多少属性,有多少方法,是规定了的,我们可以改变他属性的值,以及利用方法
    从而达到我们想要达到的目的。我们不需要知道属性和方法是系统是怎么样实现的,因为这个系统已经
    帮我们做了,并且把它封装了
   
    对于自己定义对象,我可以给对象添加属性和方法

    方法其实就实现行为的函数,方法可以看作是对象所遵循的命令
    
    一个对象从理论上就是一个数据结构,它将有关的属性和方法集合在一起,一个对象要封装它的
    的行为,这意味着内部对函数的执行细节没有让外部的对象看见 实际上一个程序要通过一个接口
    (也就是说可以让外部的对象访问到的方法)来和一个对象进行交互,程序的其他部分不必担心
    对象如何完成它应该完成的工作的,而只对对象提供输入(input),并且在适当的时候提供输出
    (output)

    我对接口的理解:我想对象把属性,方法,封装起来,所以在对象以外不能够随便去访问它
                   一个对象要访问它,必须通过提供的输入,通过对象的加工,然后输出来
                   结果,其他对象要访问本对象必须要通过,让外面的对象访问到的方法,来和
                   本对象进行交换 这就是接口

    对类和实例的理解:类是一个普通对象的类别,其实它描绘的是一类对象所共有的特征,是区别
                      另一类对象的标志,大类中可以包含小类。
                      实例是对象的特定情况

                     通常一个对象类的所有实例都有相同的方法和属性名称,用属性的值可将一个
                     实例与相同类的其他实例分开来.

 

2:对象的分析:
   可以用数组类比对象,和数组一样,单独的对象是容器的容器。数组在单个元素中容纳多个数据值,与
    之相似,对象通过单个的属性来容纳多个数据值。

   实例化对象:
    new ConstructorFunction()
   
    创建一个新的一般对象
    new Object();

    通常将实例存在于一个变量,数组元素或者对象属性之中,以备以后访问
    var myObject = new Object();

 

3:对object()的理解:
   object()我们可以经常接触到,那它到底和其他的对象有什么不同呢,
   它是其他类属对像类型所基于的基础类型对像

 

4:对象的属性
   对象的属性可以包含任何类型的数据
   属性的使用:
     a:用点操作符来访问对象属性:
       objectName.propertyName
       objectName是对象的名字
       propertyName必须是一个合法的标识符   
     b:用[]操作符来指向属性
        objectName[propertyName]

   注意:在单纯的OOP中,我们几乎从不直接访问对象的属性,而是使用方法来访问属性的值,例如
   要检查内置Sound类的一个实例的Volume属性,我们使用下面代码
    trace(mySound.getVolume());
    而不用: trace(mySound.volume);
    注意本例子中,volume不是属性而是方法,属性后面是不用打括号的,不要混淆了上面说的是
    而是使用方法来访问属性的值。


  使用for-in循环来访问对象的属性
  例子:列举出对象的所以属性:
       var a = new Object();
           a.a=1;
           a.b=2;
           a.c=3
       for (var prop in a) {
    trace("Property"+prop+"has the value"+a[prop]);}

5:方法的使用:
   objectName.methodName()
   方法实际上就是一个存储在对象属性中的函数,要将一个函数赋值给对象属性,需要将函数转换为
   对象的方法
   一旦对象属性中有了函数,就可以将函数作为方法调用。 
   一个很有启发性的例子:
  
    var a =new Object();
     a.width=10;
     b.height=5;
     a.area=rectArea;
     funciton rectArea(){
           return this.width*this.height;}
     trace(a.area());
  
   还有另一种写法:
       var a =new Object();
     a.width=10;
     b.height=5;
     a.area=funciton rectArea(){
           return this.width*this.height;}
           trace(a.area());
    
    这二个例子都是将方法赋给属性,注意其中的写法,特别是方法二,以前看到这样的形式觉得比较陌生。
  
6:澄清一个问题,关于对象调用属性的时候要不要括号的问题
  请看例子:
    var a = new Object();
        a.a=Math.random;
        trace(a.a());

    var a = new Object();
        a.a=Math.random();
        trace(a.a);
  看这个二个例子都一样的,但是为什么a.a()与a.a的写法一样的呢,其实如果在将方法(Math.random;)
  赋给对象的属性的时候,然后包含了括号,那么在访问的时候(a.a)就可以不用括号,否则是要用
  括号。我想如果不是将方法赋给属性,而是直接调用属性 是不存在要用括号的。
        var a = new Object();
        a.b=Math.random;
        a.c=11;
  注意上面这个例子,b是a的方法,而c是a的方法,这是要区分清楚,不要混淆
  这是在给对象添加属性和方法的时候,以及对区分对象的属性和方法都有用的。

 


 
7:类和面向对象的编程
   建立类:
     构造函数的格式和普通函数类似
     function Constructor(){
               statements }

   自定义属性给类:
     function Constructior(){
             this.propertyName=value;}
     example: funciton Ball(){
               this.radius=10;}

   带参数的方法:
      function  Constructor(value1,value2){
               this.property1=value1;
               this.property2=value2;}
     myObject=new Constructor(value1,value2);
         

   将方法赋给类对象
     function Constructor(){
               this.methodName= function }
       
     添加语法只有这个一个但是变化的出来的形式有几种见书上Pg:306
     但是实质就是将一个函数赋给属性
 
    继承属性:
    我对其的理解是,一般类中定义的属性,在实例化对象中有自己特定的值,但是继承属性
    就不同它只能够被对象获取而不能够设置
    语法: Constructor.prototype.proName=value;
    例子:function Ball(radius,color){
               this.radius = radius;
               this.colro = color;}
           ball.prototype.gravity=9.8
          myBall = new Ball(5,0x003300,34,220);
          trace(myBall.gravity); //显示:9.8
      
   覆盖继承的属性
    要为单一个的对象定义一个继成的属性,可以使用和继成属性相同的名字在对象上赋一个属性。      
    设置对象上的属性通常可以覆盖同名的任何继承属性


    构造器属性:constructor 是对prototype的类构造函数的一个引用

    __proto__属性
   这是在创建对象的时候,解释程序自动赋给它的一个属性,主要被用来查找对象继承属性
   我们可以用来直接检查一个对象是否属于一个指定的类
  


 8:超类和子类
    超类和子类就是C#中的父类和子类,
   
   建立超类常用的语法:Constructor.prototype= new SuperClass();
  SuperClass为超类,Constructor为子类
   例:
    function Circle(){
           this.area=Math.random();}
    function Ball(a,b){
             this.c=a;
                  this.d=b;}
    Ball.prototype = new Clircle();
    MyBall = new Ball(a,b);
    trace(MyBall.area());

   例2:Pg:314 在子类的构造器里面里面可以传递参数给超类的方法处理


9:多太现象
   我觉得就是对多个类的管理,这个对做游戏很有用,值得一看
   见pg:315

10:确定一个类是否属于超类 要用到__proto__
   见Pg:316
   在上面也用到它去确定一个对象是否属于一个类


11:Object
   所以的对象都继承顶层Object,

 

12:valueOf(Object.valueOf 方法)
  public valueOf() : Object
  返回指定对象的原始值。如果此对象没有基元值,则返回该对象。
 
  返回
  Object - 指定对象的原始值或对象本身。
   下面的示例显示某个通用对象的 valueOf()(不具有原始值)
   的返回值并将其与 toString() 的返回值进行比较。
   首先,创建一个通用对象。其次,创建一个新 Date 数据对象,
   将其设置为 2004 年 2 月 1 日上午 8:15。toString() 方法以可读格式返回当前时间。
   valueOf() 方法返回原始值,以毫秒表示。最后,创建一个包含两个简单元素的新 Array 对象。
   toString() 和 valueOf() 均返回相同的值:one,two:


13:toString(Object.toString 方法)
   public toString() : String
   将指定对象转换为字符串然后返回它。


14:定义真正的全局变量或方法
   例:Object.prototype.a=550;
       var a = new Object();
       trace(a.a);


15:Rectangle (flash.geom.Rectangle)
   public class Rectangle
   Rectangle 类用于创建和修改 Rectangle 对象。
   Rectangle 对象是按其位置(如它左上角的点 (x, y) 所示)以及宽度和高度定义的区域。
   如果描述某矩形的左上角位于 0,0 处,高度为 10,宽度为 20,并且右下角位于 9,19 处,
   则在设计这些区域时要小心,因为宽度和高度的计数从 0,0 处开始。
   Rectangle 类的 x、y、width 和 height 属性相互独立;更改一个属性的值不会影响其它属性。
   但是,right 和 bottom 属性与这四个属性是整体相关的 - 如果更改 right,要更改 width;
   如果更改 bottom,要更改 height,等等。而且必须在建立 left 或 x 属性后,才能设置 width 或
   right 属性。
   Rectangle 对象用于支持 BitmapData 类滤镜。它们还用于 MovieClip.scrollRect 属性中,
   以支持将 MovieClip 实例裁切特定的宽度和高度并滚动特定的偏移量的功能。


16:prototype(Object.prototype 属性)
   public static prototype : Object
   对类或函数对象的超类的引用。prototype 属性会自动创建并附加到您所创建的任何类或函数对象。
   此属性是静态的,原因在于:它特定于您所创建的类或函数。例如,如果您创建自定义类,
   则 prototype 属性的值由类的所有实例共享,并且只能将其作为类属性进行访问。
   自定义类的实例无法直接访问 prototype 属性,但可通过 __proto__ 属性访问它。


17:理解内置类和对象像 Math,Mouse,Selection 类.


  总结:本章先讲了对象,对它的理解,它的实例化,并介绍了对象属性表现值的几种方法,以及访问
         方法,接着接着介绍对象的方法是使用,以及区分属性和方法的不同,接着介绍了超类和子类
         阐述了他们之间的关联,以及多太的问题,还有顶级对象Object 还有怎么样定义全局变量或方法
       

                                     第十三章 影片剪辑
           
1:一个包含其他剪辑的剪辑被称为包含剪辑的主剪辑或父剪辑.而本影片叫子影片
2:主影片可以包含一个庞大的场景,主场景和子场景上的东西可以结合成一个整体在一起播放 
3:AsctionScript提供了影片剪辑的控制细节,我们可以播放一个剪辑或停止,在它时间线内移动播放头
   在程序设计中计划性的设置它的属性(比如尺寸,旋转,透明度,以及在场景中的位置,以及它作为
   真实对象来操作
  
4:影片剪辑可以当作对象来进行操作,我可以获取和设置剪辑的属性,也可以在剪辑上调用内置的或者
   自定义的方法,和其他对象不同,剪辑上所执行的操作可以在播放器中产生可见或者可听的结果。
  
   影片剪辑并不是真正的对象,它既没有MovieClip类构造器,也不能在代码中用一个对象常量来实例]
   化一个影片剪辑,它不是对象,它属于一种类似对象的数据类型,称为movieClip(我们可以在影片剪辑
   上执行typeof来证明这一点,它会返回串“movieclip“).影片剪辑和真正的对象之间的主要区别是它们
   的分配(创建)方式以及解除分配(除去,或者说释放)的方式

5:影片剪辑的对象性:
   a:可以通过内置方法进行直接的控制:
                                    exzample: eyes.play();
   b:可以用点操作来获取和设置一个影片剪辑的属性:
                                    ball._xsacle=90;
   c:可以将剪辑属性值赋给一个变量:
                                    myClip.myVariable=14, x=myClip.myVariable.
   d:子影片剪辑可以作为父影片剪辑的对象属性来对待,因此可以用点操作符来访问嵌套的剪辑
                                    clipA.ClipB,ClipC.paly();
   e:我们可以把剪辑作为数据来管理,我们可以将一个影片剪辑存储在数组元素,或者变量中,甚至
     将剪辑的引用作为参数传递给函数 exzample:
                               function moveClio(clip,x,y){
                                         clip._x=x;
                                         clip._y=y;}
                               moveClip(ball,14,399)
        
6:影片剪辑的类型
  flash有三种类型的剪辑
         > 主影片
         > 正规影片剪辑
         > 智能剪辑
 


 除了这三种正式的类型之外,还可以基于对正规影片剪辑的使用将其分为四类
         >过程剪辑
         >脚本剪辑
         >链接剪辑
         >种子剪辑

主影片
     Flash文档包括基础的时间线和出现在每一个文挡中的场景,主时间线是文档所以内容的基础,包括
     其他所有的影片剪辑,我们有的时候将主影片称为主时间线,主时间线,主场景,或者简单的叫
      _root.
    主影片的操作方法和正规的影片时间线非常相似
     a:一个主影片不能从.swf文件中被删除(虽然一个.swf文件本身可以从Flash播放器中删除
     b: 下面的影片剪辑方法在主影片上调用无效:duplicateMovieClip(); removeMovieClip();
         swapDepths();
     c:事件处理器不能够被添加到主影片上。
     d: 主影片可以通过内置的全局性_root和_leveLn来引用
     e: 每一个.swf文件只包含一个主影片,而flash播放器中一次可以包含多个.swf文件。我们可以
        将多.swf文挡(因此有多个影片)通过loadMovie()和unloadMovie函数装载到levels的栈中

 智能剪辑
    一个包含用来在创建工具中自定义剪辑属性的图形用户界面的正规影片剪辑

 过程剪辑
    过程剪辑并不用来包含影片内容,只是用来重复执行一个代码,过程剪辑可以用enterFrame事件
    处理器或者时间循环来建立
 脚本剪辑
    和过程剪辑一样,脚本剪辑不用来包含内容,而用来跟踪一些变量或者执行某些脚本的空影片剪辑
    例:可以使用一个脚本剪辑来包含对击键和鼠标事件起反应的事件处理器。
 

链接剪辑
   一种从影片库中既可以导入又可以导出的影片剪辑,导出他导入设置在每一个影片库中动态生成一个剪辑  
   实例的时候,我们经常使用链接剪辑

种子剪辑
   在attachMovie()方法被引到Flash5中之前,我们使用duplicateMovieClip()函数,基于某些现存的剪辑
   (称为种子剪辑),来创建新的影片剪辑,种子剪辑是场景中只通过duplicateMovieClip()来进行复制
   剪辑,随着attacheMovie()的引入,就不需要种子剪辑了,但是希望保留一个剪辑的事件处理器和复制
   过程中的转换的时候,仍然使用种子剪辑和duplicateMovieClip()


7:创建影片剪辑
   我们不能够用创建对象的方式来创建影片剪辑,我们只能够在创建工具中亲手直接创建影片剪辑
   ,一旦影片剪辑得到创建,就可以使用诸如duplicateMovieClip()和attachMovie()这样的命令来
   为它创建新的独立的复本。
   影片剪辑符号和实例
   正如所有的对象实例都基于一个或者其他的类一样,所有的影片剪辑实例都是基于模板影片剪辑的,
   也就是符号,影片剪辑符号用来作为剪辑内容和结构的模型,我们在生成特定的影片剪辑之前,总是
   必须有一个影片剪辑符号,使用符号,我们可以用手动和程序方式来创建影片中渲染的剪辑
  
   二种方法创建: 一:是工具中创建
                  二:是转换创建
  创建实例:
        a:手动创建:直接拖入场景
        b:用duplicateMovieClip()复制来创建
          还可以将duplicateMovieClip()作为一个现有的剪辑方法来调用
          例:
             function moveClip(clip, x, y) {
                              trace(clip);
                               clip._x = x;
                               clip._y = y; }
                moveClip(clip1, 30, 40);
                clip1.duplicateMovieClip("ball2",0);
                ball2._x+=100;
                ball2._y+=50;
        注意:某剪辑被ActionScript或者Flash中制做工具变换(例如上色,旋转,重新设置大小)
               的复制实例继承种子剪辑的初始变换,种子剪辑后来的变换不影响复制实例。
        使用uplicateMovieClip()复制剪辑的一些优点:
           1:当影片出现在和程序执行有关的场景时可以精确控制
           2:当影片从和程序执行有关的场景中被删除可以精确控制
           3:赋给一个和其他复制影片剪辑相关的复制剪辑的层深度。
           4:复制一个剪辑的事件处理器
         这些能力可以提高对影片内容的程序化控制,太空船游戏就是一个显著的例子,当火力按钮
         被按下的时候,需要复制一个飞弹的电影剪辑
      
        c:用attachMovie()创建实例
           public attachMovie(id:String, name:String, depth:Number,
                  [initObject:Object]) : MovieClip 
          它和duplicateMovieClip()不同,它不要求预先创建实例,--它直接的影片库中从符号创建实例
           myClip.attacheMovie(symbolIdentifier,newName,depth);
          祥见:Pg:330 /系统帮助
          例子: function moveClip(clip, x, y) {
               clip._x = x;
               clip._y = y;   }
                 moveClip(clip1, 30, 40);
                 clip1.attachMovie("clip1", "circle1_mc", this.getNextHighestDepth());
                 trace(clip1);
           我的理解:开始对这个函数一直把握不定,现在觉得可以对它作一个总结了
               其实它就是将库中的元件放到场景或者影片剪辑上,它后面的三个参数开始我也把握不定
             现在知道了 d:String,:就是表示影片剪辑的名称(不是实例名)
                       name:String:就是对库中引出来的元件进行的命名
                       myClip:表示的就是电影被附加电影剪辑的名称
              

 8:实例名称:
    当我们创建一个平常的数据对象的时候(不是影片剪辑)的时候,必须将这个对象赋给一个变量
     或者其他数据容器,以便让该对象继续存在,以便我们在以后引用它
    exzample:
     new Object();
     var thing= new Object();
    影片剪辑不需要被储存在变量中以便引用,和普通的数据对象不同,剪辑实例在AsctionScript中
    可以通过它们的实例名称在创建之后检索。
     ball._y=200;
     每一个剪辑实例的名称都存在它的内置属性_name中,它可以被获取也可以被设置。
     当改变实例的_name属性时候,以后指向该实例的全部引用都必须使用这个新的名称
  
     如果手动创建的剪辑没有给予实例名称,她会在运行的时候有Flash播放器自动赋给一个。
     自动产生:instance1,instance2,instance3....instancen 这样的实例。


9:导入外部影片
   loadMovie: 这个在笔记前面意见介绍过,帮助里也有很好的例子
   只想补充的是: loadMovie 可以周围独立函数也可以做为实例的一个方法
   独立函数的语法:
                 loadMovie(url,loaction);
   剪辑方法版本的语法:
                 myClip.loadMovie(url);
    注意使用方法的是把它装载电影剪辑里面,然后就可以对这个电影剪辑进行我们想要的操作。

10:装载影片的执行顺序:
    a:loadMovie()函数出现在一个语句块的时候并不会立刻执行,实际上,它要等的块中所有的语句
      都执行完以后才执行
    b:调用loadMovie()来将外部影片装载到播放器中的时候,我们不能够在同一个语句块中访问这个外
      在影片的属性或者方法
    c:用loadMovie函数装载了外部文件的电影剪辑,不是能够用attachMovie()添加实例,也不能够用
      duplicateMovieClip()来复制这个剪辑。
    d:关于预装载器
      _totalframes:
        totalframes(MovieClip._totalframes 属性)
        public _totalframes : Number [read-only]
        返回由 MovieClip 参数指定的影片剪辑实例中的总帧数

     framesloaded(MovieClip._framesloaded 属性)
        public _framesloaded : Number [read-only]
        从流式 SWF 文件加载的帧数。此属性可用于确定特定帧及其前面所有帧的内容是否已经加载,
        并且是否可在浏览器本地使用。也可用于监视大 SWF 文件的下载。
        例如,可能需要向用户显示一条消息以表明在完成 SWF 文件中指定帧的加载前,
        SWF 文件将会一直进行加载。

     getBytesLoaded(LoadVars.getBytesLoaded 方法)
     public getBytesLoaded() : Number
     返回 LoadVars.load() 或 LoadVars.sendAndLoad() 所下载的字节数。
     如果当前没有执行加载操作或者尚未开始加载操作,此方法将返回 undefined。


     getBytesTotal(LoadVars.getBytesTotal 方法)
     public getBytesTotal() : Number
     返回 LoadVars.load() 或 LoadVars.sendAndLoad() 所下载的总字节数。
     如果当前没有执行加载操作或者尚未开始加载操作,此方法将返回 undefined。
     如果无法确定总字节数(例如,如果下载已开始但服务器尚未传输 HTTP Content-Length)
     此方法也将返回 undefined。
    例子:主场景
     clip1.loadMovie("
http://zhb520.chinavdata.com/flash/2005-happy%20new%20year.swf ");
     clip1剪辑中:
         onClipEvent (enterFrame) {
      trace(this._totalframes);
      trace(this._framesloaded);
      trace(this.getBytesLoaded());
      trace(this.getBytesTotal());}
            
    
 11:所有的影片和实例的堆栈顺序
     我对此的理解:所谓的堆栈其实就因为处理如果有多个东西存在于场景中的时候,就应该给他们一个顺序
     让它们有所编号,这就想排队一样,而用数据结构的语言来说这样的现象就叫堆栈。
     书:所有的影片剪辑实例和显示在播放器中的外部载入影片都按照一个可视堆栈顺序存放,就像一副牌
         一样,当实例或者外部载入的.swf文件在播放器中产生重叠的时候,高者总是掩盖底者。
      可以改变场景中的各剪辑堆栈的位置,利用下面13点的swapDepths()函数. 
     

 

12:onRelease(Button.onRelease 处理函数)
    onRelease = function() {}
    当释放按钮时调用。必须定义一个在调用事件处理函数时执行的函数。
    例:my_btn.onRelease = function () {
                       trace ("onRelease called");
                                     };

     注意这个代码可以放在场景中使用,并且my_btn可意思是电影剪辑,着说明在场景中可以把电影剪辑
     改变成有按钮行为.并激发事件

13:swapDepths(MovieClip.swapDepths 方法)
   public swapDepths(target:Object) : Void
   交换此影片剪辑与另一影片剪辑的堆栈或深度级别(z-顺序),
   另一影片剪辑由 target 参数指定,或指定为当前占用由 target 参数指定的深度级别的影片剪辑。
   两个影片剪辑必须具有相同的父级影片剪辑。交换影片剪辑的深度级别的作用是将一个影片剪辑移到另一个影片剪辑的前面或后面。
   如果调用该方法时影片剪辑正在补间,则补间会停止。
   例:
    myMC1_mc.onRelease = function() {
    this.swapDepths(myMC2_mc);
    };
    myMC2_mc.onRelease = function() {
    this.swapDepths(myMC1_mc);
    };


14:程序化生成影片剪辑堆栈;
 
   通过attachMovie()生成实例:
     attachMovie()生成的实例总是堆栈到它所添加的实例上面.
     例子见:p:334
     假设添加一个新的影片剪辑A到x上,添加一个新剪辑B到y上 x所在的层在y上
     剪辑会按照从上到下的顺序出现,A,X,B,Y 所以A在最上面
     如果再加一个也是一样的
  
   通过duplicateMovieClip()生成的剪辑然后添加到堆栈
     a: 如果实例的种子剪辑是手动创建的(或者是用duplicateMoviceClip()从手动创建的剪辑中复制的)
        那么新的实例就放在_root上堆栈里
    
     b: 另一方面,如果实例的种子剪辑是用atachMovie()创建的,那么新的剪辑就被放到它的种子剪辑
       堆栈中 


   在程序化生成的剪辑堆栈中给实例的深度赋值
  

15:程序化成剪辑的堆栈是由传递给attachMovie()或者duplicateMovieClip()函数的参数depth来确定的,也可以用swapDepths()函数在
     任何时候进行改修,每一个程序化生成的剪辑的depth,确定了指定程序化生成堆栈中实例应处的位置。剪辑的depth可以是任何整数
     从底部开始度量,因此-1在0的下面,1在0的上面,依次类推,当二个程序化生成的剪辑占据了屏幕上的同一个位置的时候,depth
     较大的一个就在另一个之前渲染
  层是单占的结构,每一次在同一个剪辑只能占据堆栈中的一个层---将一个剪辑放到被占据的层中会代替(删除)该层原来占据
  者。

  剪辑的深度可以有间隙,可以让一个剪辑在深度0,另一个剪辑在深度500,三个剪辑在深度1000,深度的1000
  深度的赋值出现间隙并不会产生执行问题,也不会造成浪费。

16:.swf文挡的_level堆栈
   总共有三种堆栈:内部堆栈;程序化堆栈;文挡堆栈
   对于文挡堆栈,每一个剪辑可以理解为一个层,每一个层只允许有一个文挡,如果一个层中引入多个文挡的话,则后面的文挡会覆盖
   前面的文挡,因为后面文档就要高一个层次,但是注意这样并不会把原来装载的影片从播放器中删除。
 
17:堆栈和执行顺序
  见P:338 
     a:不同时间线上的代码总是按照从上到下的顺序执行
   b:当手动创建的实例最初被载入的时候,它们的时间线上和load事件处理器中的代码按照flash文档发布设置中所给出的装载
    顺序来执行---默认顺序为从下到上,也可以从上到下。
   c:一旦载入,影片的所有都被设置成一个执行的顺序,它他载入顺序是相反的,最近添加到影片的实例,其代码总是
    首先的到执行。
    注意:对于堆栈本身存在的这些规则应该小心,因为层是变换不定的,因此应该避免用相对关系来产生代码,要争取用
     让代码能够安全的运行,而不依靠堆栈中剪辑的执行顺序,我们可以把代码放在一层,它处于每一个有代码的时间
     线的最顶层,从而可以避免由于执行堆栈所引发的一些问题。

18:实例和主影片的引用
    我们现在知道怎么引用,创建,复制和分类影片剪辑,那么我们通过这些途径得到的影片剪辑怎么样才能够有效的控制他们呢
  我们在下面的情况中要控制他们
  a:获取或者设置剪辑或影片的属性
  b:创建或调用或影片的方法
  c:对剪辑或影片提供一些函数
  d:操作剪辑或者影片的数据

19:使用实例名称
    引用当前实例或影片:在引用剪辑的时候并不总是需要使用实例的名称,属于实例时间线的某侦的代码可以直接引用该实例的  
  属性和方法,而不是任何实例名称。
  example: _alpha=60;
    使用this关键字的自引用:当我们要从某个实例时间线上的某侦,或者从它的某个时间处理器中显式的引用当前实例的时候
  ,可以使用this关键字
  有时对当前时间线的引用不用this 被省略了可以说是隐式的引用
  当为什么我们不有的时候不省略this呢
  因为:如果不用显示的实例引用,特定的影片剪辑方法就会被解释程序误认为是全局函数,如果我们遗漏了this的引用解释
  程序就为以为我们要调用类似的全局函数,然后告诉我们遗漏了影片剪辑参数。
  使用this,可以方便地将一个引用传递给在影片剪辑上操作的函数所在的时间线。
  
  如果我们有许多面向对象的编程工作,那么在使用this关键字来引用实例和影片的时候要小心,记住,在一个自定义的方法
  或者对象构造器内,this的意思有很大的不同,它不是对当前时间线的引用。
 
20:引用嵌套实例
    对这个问题在书中pg:334
    因为我在前面已经很祥细讲过这个问题,所以现在就不在讲了,
    只是要补充的是:剪辑的层次就像一棵家族树,一剪辑只能够有一个父亲,但是却可以有多个孩子。
    我们可以把它向上和向下访问,理解成向上和向下导航。    

 

21:用_leveln在播放器中引用其他文挡
    可以用内置的全局属性系列_levenl0到_leventn来指向多个挡的主时间线,n表示我们想要引用文挡的层级。
    levenl0表示最底的等级。

    leveln与_root
    _root总是指向当前文挡的时间抽,而leveln是对指定文挡时间抽的引用

 

          第十四章    词法结构

空白:Tab,空格,以及回车,都可以做为分隔,它们作用是使单词不至于粘连在一起,
      如果有其他操作符就没有这个要求了,基本上连在一起系统也能够识别。
      同时还要注意的是:语句是由分号来结束的,而不是分行符,
      而有的时候利用分行符对一段语句(像数组)进行分行往往可以达到
      使程序容易识别的目的


语句终结符(分号)
      语句终结符分号,如果在程序中断句没有使用,解释程序也年识别。
      但是为了混淆最好要使用分号:
      example: funciton addOne(vaule){
                 return
                 value+1 }
      本来我们是要返回value+1的但结果却返回了undefined.
      在函数常量后面必须使用分号,在使用了特殊字符#include指示,也必须使用分号

                         
注释:和c#中一样的


保留字:见表pg:375

标识符:见pg:376


大小写的区分: 在ActionScrpt中,关键字(见Pg:375,表14.1)是区分大小写的,
             而标识符,属性名称,函数名称是不区分大小写的 

                    
                                  第十五章 高级主题

这一章:比较重要也让我觉得很意思,是一个升化,提升的过程,在这里你会等到很大的满足感

1:操作数据的三种方法:复制,比较和传递数据
2:复制数据和复合数据的区别
   复制数据它必须开辟新的空间用来存贮复制过来的现在属于它自己的独特的,私有的拷贝
   而复合数据一个变量的时候,只是给变量一个数据引用。
   所以对于复制数据,原来的数据改变 不会引起复制数据的改变
   而对于复合数据,它的改变 会引起变量的再次改变,因为复制数据存储的是数据引用,如果
   引用改变,利用引用指向该复合数据的变量都会发生变化。

   根据复合数据和复制数据的这种特点,我们可以知道 对于一个函数,如果我们传递给的是
   是一个复合数据的变量的时候,对函数内所做的改变就会影响原来的变量,但是如果传递
   不是数据引用的变量的时候,在函数内所做的改变不会影响原来变量的值。

   经常我们考虑到程序的运行速度 以及所占内存的特点 我们就应考虑这些方面的情况
   并结合我们的实际利用。
 
3:对与
   a:十进制与二进制的转换,这些以前学过本书上pg:382也讲过,
     一个二进制转换为四进制就是 从左到右为 位于0位:1或者0乘为2的0次幂,位于1位:
     1或者0乘为2的1次幂,位于2位:1或者0乘为2的2次幂,位于3位:1或者0乘为2的3次幂
     然后把各位得到的值相加就可以得到最后的十位制的数值了。
  
    注意二点:一是我们说的二进制的几位是从0开始的
              二是二进制的位数不限

  1.    b:对于逻辑And的理解;
          operand1&operand2;
         这个逻辑与的特点就是只而二个数的对应的比特位 都为1,其结果对性的比特位
         才会被设置为1 否则相应比特位被设置为0;如果得到的结果为比特位都被设置为
          0,即没有对应的比特位都为1的,那么比特就为flash,否则为true
        
         利用这一位逻辑运算特点,我们可以检验一个operand1上我们指定的一个或者多个比特位
         是否有一个为1;而检验的方法就是我们设定一个数据,这个数据的饿特点就是
         我们想要检验的比特位在这个数据上也被设置为1,这个数据的上的其他比特位
         设置为0,这样通过位逻辑And运算,如果对应的我们指定比特位在operand1,只有一个为1那么就
         运算得到的数据的比特位中就有1,这样比特返回true。否刚对应的比特位在operand1,
         没有一个为1,那么得到数据的比特位全部为0返回false,因为在非指定比特位中我们设置的数据的
         比特位都为0,所以就算operand1在非指定比特位上就算有1,那么1与0运算的结果也是0,所以
         如果operand1指定比特为上没有一个1的,那么结果还是返回false.
     
         例:检验第2位(用4去检验)是否被设置为true;
             var x=number;
             if(x&4){
                  //代码;
                   }
             检验第2位或者第3位,是否有一位被设置为ture;
             var x=number;
             if(x&(4|8){
                 //代码
                   }
       
        c:对于位逻辑OR的理解
         在or运算中,只要有其中一个数据比特位上的数1,那么在结果中对应的比特位也为1;
         我们可以利用的:我们通常把单个的选项的多个数字合并起来,变成所有系统
         选项的一个单一个的值:
         如上面的if(x$(4|8));中OR起的作用就是先通过语句(4|8)把比特为第二位或者第三
         位设置为1,然后在与x进行And的位逻辑运算。

     位逻辑也用在一个已经存在的值中将选项设置为true,
     例: options =options|8
          这个例说明的是 不管options为什么数值,最后得到的options它的第比特位为3的数值都被
           设置为true了 

     d:为逻辑xor(互斥)
       operand1^opterand2
       二个比特位相同返回0,不同则返回1 ;
       它典型的使用就是在0和1(false和true)之间进行选项的来回切换,要切换用
       例: 要切换用第2个位表示的选项为(值为4)我们可以使用:
           options=options^4;
       我的理解如果把1和0看是开关的话,如果options第2位是1开的话 我们加一个4
       就把它关了,然后在加一个4又把它开了,所以它能够在1和0之间切换。
 

4:对比特位上1和0的理解
    一个值为1的比特可以说是被设置了,即是开关的开,返回的是true,一个值为
    0的比特可以说被清除了即是开关的关返回false;比特有的时候被当做开关就意
    味着它表示某种可以有两种状态的东西,开和关或者是true和false,
 
    位逻辑编程几乎中是包含一系列特征可以被设置/清除的情况,使用位逻辑操作符
    可以在单个数据值内简明的表示多个选项,而不需使用多个变量,这可以提供更
    高的执行效率和更低的存储器要求。

5:位逻辑NoT  ~
   它将改变单个数字的比特位,位逻辑操作使用二进制补码系统来表示负的二进制数
   ,还有一个简便的运算法则就是:将原来的数字取负,然后减去1得到的值。
    如:~10 为 9;

    例:options=options&-4;
        表达式~4返回的是一个除了2位上是0外,其他位都是1,位逻辑AND对这个返回
    的数字和options变量进行操作,options的第二位被清除,其他位不变,
    上面跟简洁的写法:options&=-4;

 


6:位逻辑位移操作符
  好处:通过位移可以达到我们变换开关的目的。
         同时我们还可以通过位移,把指定逻辑位上的开关,移到我们设置的检查
  逻辑位置点,我们就可以知道指定逻辑位上的开关的开启状态。

  同时位操作符也可以让我们快速的乘以或者除以2的倍数,
 
  带符号右移:
   operand>>n 右移多少位n位,就相当于除以2的n次方,
  无符号的右移:
   operand>>>n
 
  左移
  operand<<n 右移多少位n位,就相当于乘以2的n次方,
  一个很有启发的例子:
  myNumber=27583;
  count=0;
  for(var i=0;i<32;i++){
     if(myNumber$(1<<i)){
            count++;}


7:为什么要使用位逻辑
  虽然用用其他编程显得容易理解,但是用位逻辑运算显得更快更简洁,用计算机特有的二进制
  与它交流,可以节省空间,提高速度。
 
  我对位逻辑编程的理解:
  首先我觉得它不难,把每一个逻辑位看成是一个开关,其实就用它提供的位逻辑元算方式,和位移方式,
  对我们的比特位进行操作,通过对开关的操作,得到我们想要的信息,
  有三个方面的问题:一是提供的位逻辑方式有那些
                    二是我们怎么样去操作它
                    三是怎么样冲重提取我们的信息。
  说白了就是通过对比特位上的操作为我们存储信息
 
  这个编程很有意思,然后深入下去的话,也要一定的时间,但是绝对不难,然后带来的好处多多
  上面的写上了,而且我想在其他语言中照样存在这种编程方式,所以从某种角度来说是通用的。

 

8:影片剪辑的数据类型
  影片剪辑并不只是另外一个类,它们属于自己独特的数据类型,
  影片剪辑和对象虽然二者显得相同,但差别在于他们分配和解除分配的方式不同,正规对象采用的是引用计数和垃圾回收
  方式,而影片剪辑的生命周期是由时间线控制或者有duplicateMovieClip()和removeMovieClio()函数来精确控制的。

9:高级函数的作用域链,我想这个我可以结合,我笔记函数部分对这方面的讲解,其实在那个时候我已经想到了这方面并把它
   理解清楚了,现在也可以结合这部分pg:394在看看 然后遇到问题在查这二部分作为参考吧。

 

                                       第二部分:ActionScript的应用
 1:在动作面版中的专家模式有普通模式,普通的就是通过系统辅助写代码,专家的是方便直接在里面写代码,其实我觉得
    差别不大,注意一点,在代码工具箱里,可以拖代码或者点击代码,选中的代码就进了脚本框了。
    如果重专家模式转到普通模式会破坏原有的代码结构

 2:对侦添加脚本,最好将影片中全局使用的代码放在主时间线上第一侦,我们必须确保没有代码去访问还没有装载的影片部分,
    要检查影片一个特定部分是否被装载可以使用影片的属性_framesLoaded 或getByetsLoaded()方法

 3:对按纽添加脚本
    没有别的,因为其他的已经知道,只想说明一点的是:对于按纽如果上面添加过多的代码,这是不好的,所以如果代码比较多
    的话,最好把代码封装起来放在一个函数中,然后在按纽中去调用
   
4:为影片剪辑添加代码
    和按纽差不多 在前面也已经详细讲过。

5:代码在那里
    往往很多时候我们不知道代码在那里,以下有几种种方法:
    a:在动作面版中的对象浏览器中看
    b:选中元件再在动作面版上看它上面有没有代码
    c: 在时间线上看有没有代码的标志符号@
    d: 在影片浏览器中看,影片浏览器在窗口菜单下。

6:关与优化编程的一些方法:
   a:将所有的代码都放在独立的scripts层中,不要将任何影片内容放在这层上,只放代码
     并且将它放在层的顶部
   b:所以的侦标签放在一个独立的labels中,不要放置其他内容,专门用它来放桢标签
   c:当处理用于多个的代码库时,可以将代码保存到外部文件中,
   d:补充:我们还可以定义面版,定义快捷键,重新设置工具箱大小。

  
7:关于几种导入代码的方法:
   a:共享库导入
   b:#include导入
   c:文件导入


            第十八章 屏幕文本域

文本域有二种类型:一种是输入文本
                 一种是输出文本:即是动态文本,用来向用户显示信息
1:动态文本域
  我觉得可以很简单的说说明这个问题,即是先用text工具拖一个文本框出来 然后把它设置为动态文本,然后附一个变量值给他
   然后就可以用程序去操作这个变量了,注意这个变量是可以变量是可以赋给其他变量的


2:用户输入文本
  我觉得可以很简单的说说明这个问题,即是先用text工具拖一个文本框出来 然后把它设置为输入文本,
  然后我们在文本框中获得变量的值 然后提交给程序处理 

 


3:我发现flash8一个很好的功能就是能够对场景中的物体 像文本 剪辑什么的 进行滤镜效果
   真的作用真的好 可以做出很好的效果

4:我们可以对文本域进行各种控制
  有很多软件上 和树上都可以
  a:scroll属性:
  例: 点击向上滚动一行
    on (press) {
    if (textField.scroll>1) {
  textField.scroll--;
 }
    }  

     点击向下滚动一行
   on (press) {
 if (textField.scroll<textField.maxscroll) {
  textField.scroll++;
  trace("ok");
 }
   }
 


  b:maxscroll属性
     告诉一个域出现之前它可以被滚动多少距离
   
 

 

60多年前,一个朋友给我讲了一个笑话,把我笑翻了,后来由于肚子太疼进了医院。医生给我做手术前,问我 为什么笑成这样,我就讲给他听。他听后狂笑不止,最后竟然笑死了。 我被送上了法庭。法官让我把那个笑话讲出来,由陪审团判定是否与过失杀人的事实要件符合,我要求签订免责合同。法官宣布休庭,一天后重新开庭,宣布接纳我的意见。于是,我当庭把那个笑话讲了出来,结果有人笑得敲桌子,有人笑得在地上打滚。后来,当天所有听到这个笑话的人都笑死了。 我瞬间成了名人,各路记者纷纷要求采访我,我知道这笑话讲出去可能构成公共侵害,于是对着镜头,我含糊地说了一番话,大意就是:“理由永远是谎言,信仰永远是自慰。节目播出后,引起巨大反响。可没想到,有一天,几个神秘便衣闯进我的卧室,把我连拖带拽拉到一个黑屋子里。过了好久,一束强光照到我脸上。我勉强睁开眼睛,惊呆了,坐在我面前的人是目前惟一与我一样家喻户晓的人——总统。 总统大致交待了抓我的目的,很简单:把这个笑话录下来,然后送到中东敌对国家的独裁者那儿,笑死他。我只好答应他的要求,同时提出此笑话属于大规模杀伤性武器,不可针对平民。总统答应了。 两星期后,总统宣布已经掌握了那个笑话的关键技术,并且在沙漠地区试用成功。这在国际间引起轩然大波,很多国家惊慌失措,国际军事学家将此命名为“笑威慑”。就在此时,东方一个国家突然宣布也掌握了该笑话,原来给我讲笑话的那哥们投靠了该国。于是,我们之间形成了“笑威慑平衡”。 三年后,4月1日,我终日担心的终于发生了:中东一个恐怖组织盗取了那个笑话的原始技术。结果,文明遭到前所未有的破坏,各国政府惶惶不可终日。联合国只好召开全球首脑大会,最后将4月1日设定为愚人节。 60多年过去了,我已经风烛残年。在离开世界之前,作为历史见证人,我想有必要把这个笑话讲给大家。那天,我朋友给我讲的这个笑话很简单,很短,就一句话: http://www.tf-studio.com/WORK/FUN/15.HTML 必须回复后,才能查看