roadProgram的专栏

一个程序员的路

转 第二章 ActionScript 3.0 动画基础(1)(as3.0)

类和面向对象编程
      类(Class)和面向对象(Object Oriented),对于有些读者来说可能还没接触过而有些读
者可能已经在 AS (或其它语言) 中使用过很多年了,为了让大家都能学会,我会扼要的介
绍一下这些基础知识。就算是 AS 2 的 OOP 专家也希望能略读下这一段,因为 AS 3.0 的
                                                                  只要你在 Flash 中
工作原理确实发生了很大的变化。  如果你说你从没用过类,那你就错了,
写过代码,那么实际上就已经使用了类。类可以简单理解为一种对象, MovieClip 就是影
片剪辑的类,而文本框、影片剪辑、按钮、字符串和数值等都有它们自己的类。
      一个类最基本的两个部分:属性(数据或信息),行为(动作或它能做的事)。属性
(Property)指用于保存与该类有关的信息变量,   行为(Behavior)就是指函数,如果一个函数
是这个类中的一部分,那么我们就称它为方法(Method)。
一个基本的类:
      常用 Flash 的朋友都知道,我们可以在库中创建一个元件,用这个元件可以在舞台上
创建出很多的实例。与元件和实例的关系相同,类就是一个模板,而对象(如同实例)就是类
的一个特殊表现形式。下面来看一个类的例子:
package {
  public class MyClass {
   public var myProperty:Number = 100;
   public function myMethod() {
     trace("I am here");
   }
  }
}
    先来说明一下这段代码。在这里有些新的知识,对于 AS 2 老手也如此:包的声明。包
            作用就是把相关的类进行分组。知道这一点就够了,我们不再进行深入的讨论,
(Package) ,
本书的示例甚至不会用到包。Package 这个关键字和一对大括号是必需有的,我们理解为默
认包,紧随其后的就是类的定义。
另一个变化是 AS3.0 中的类拥有了访问关键字。访问关键字是指:一个用来指定其它代码
是否可访问该代码的关键字。 public (公有类) 关键字指该类可被外部任何类的代码访问。
本书中所有示例的类都是 public 的。在深入学习了 AS 3.0 后,我们会发现不是所有类都
是公有的,甚至还有多重的类,这些内容超出了本书的谈论范围。
    本例中我们可以看到,这个类的名字为 MyClass,后面跟一对大括号。在这个类中有两
种要素,一个是名为 myProperty 的变量,另一个是名为 myMethod 的函数。
包(Package)
    包主要用于组织管理类。包是根据类所在的目录路径所构成的,并可以嵌套多层。包名
所指的是一个真正存在的文件夹,用 “.”进行分隔。例如,有一个名为 Utils 的类,存
在于文件夹 com/ friendsofed/ makingthingsmove/ 中(使用域名作为包名是一个不成文
的规定,目的是保证包名是唯一的)。这个类就被写成
com.friendsofed.makingthingsmove.Utils。
在 AS 2 中,使用整个包名来创建一个类,例如:
class com.friendsofed.makingthingsmove.Utils {
}
在 AS 3 中,包名写在包的声名处,类名写类的声名处,例如:
package com.friendsofed.makingthingsmove{
  public class Utils {
  }
}
导入(Import)
      想象一下,每次要使用这个类的方法时都要输入
com.friendsofed.makingthingsmove.Utils,是不是太过烦琐太过死板了。别担心,import
语句可以解决这个问题。在这个例子中,可以把下面这句放在 package 中类定义的上面:
import com.friendsofed.makingthingsmove.Utils;。
构造函数(Constructor)
      构造函数是指一个名字与类名相同的方法。当该类被实例化时,该函数会被自动调用,
也可以传入参数,例如:
首先,创建一个类:
package {
  public class MyClass {
   public function MyClass(arg:String) {
     trace("constructed");
     trace("you passed " + arg);
   }
  }
}
然后,假设工作在 Flash CS3 IDE(集成开发环境)中,在时间轴上创建该实例:
var myInstance:MyClass = new MyClass("hello");
结果输出:
constructed
you passed hello
继承(Inheritance)
     一个类可以从另一个类中继承(inherit)和扩展(extend)而来。这就意味着它获得了另
一个类所有的属性和方法(除了那些被 private 掩盖住的属性)。所生成的子类(派生类)还
可以增加更多的属性和方法, 或更改父类(基类)已有的属性或方法。要分别创建两个类来实
现(两个独立的 .as 文件),例如:
package {
  public class MyBaseClass {
   public function sayHello():void {
    trace("Hello from MyBaseClass");
   }
  }
}
package {
  public class MySubClass extends MyBaseClass {
   public function sayGoodbye():void {
     trace("Goodbye from MySubClass");
   }
  }
}
      不要忘记,每个类都必须在其自身的文件中,文件名为该类的类名,扩展名 .as,所以
必须要有 MyBaseClass.as 文件和 MySubClass.as 文件。   因此,在使用 Flash CS3 IDE 时,
保存的 FLA 文件,要与这两个类在同一个文件夹。
下面代码会生产两个实例,把它写入时间轴看看会发生什么:
var base:MyBaseClass = new MyBaseClass();
base.sayHello();
var sub:MySubClass = new MySubClass();
sub.sayHello();
sub.sayGoodbye();
      第一个实例没什么可说的,值得注意的是第二个实例中的 sayHello 方法,虽然在
MySubClass 中没有定义 sayHello,但它却是继承自 MyBaseClass 类的。另一个值得注意
的是,增加了一个新的方法 sayGoodbye,这是父类所没有的。
下面说说,在子类中如何改变一个父类中已存在的方法。在 AS 2 中,我们可以只需要重新
定义这个方法就可以了。而在 AS 3 中,则必需明确地写出 override 关键字,来进行重新
定义。
package {
  public class MySubClass extends MyBaseClass {
   override public function sayHello():void {
     trace("Hola from MySubClass");
   }
   public function sayGoodbye():void {
     trace("Goodbye from MySubClass");
   }
  }
}
      请注意,原来的 sayHello 方法被重写,再调用 MySubClass 后,就有了新的信息。另
外,私有成员也不能被重写,因为它们只能被它们自身的类访问。
MovieClip/Sprite 子类
    我们可以自己写一个类,然后让另一个类去继承它。在 AS 3 中,所有代码都不是写在
时间轴上的,那么它们一开始都要继承自 MovieClip 或 Sprite。 MovieClip 类是影片剪
辑对象属性和方法的 ActionScript 模板。它包括我们所熟悉的属性如:影片的 x,y 坐标,
缩放等,这些在 AS 3 中的变化不大。
    AS 3 还增加了 Sprite 类,通常把它理解为不在时间轴上的影片剪辑。很多情况下,
只使用代码操作对象,并不涉及时间轴和帧,这时就应该使用 Sprite 这个轻型的类。如果
一个类继承自 MovieClip 或 Sprite ,那么它会自动拥有该类所有的属性和方法,我们还
可以为这个类增加特殊的属性和方法。
      例如,游戏设计一个太空船的对象,我们希望它拥有一个图形,并且在屏幕的某个位置
移动,旋转,并为动画添加 enterFrame 侦听器,还有鼠标、键盘的侦听等。这些都可以由
MovieClip 或 Sprite 来完成,所以就要继承自它们。同时,还可以增加一些属性如:速度
(speed)、  油量(fuel)、损坏度(damage),还有像起飞(takeOff)、坠落(crash)、射击(shoot)
或是自毁(selfDestruct)等方法。那么这个类大概是这样的:
package {
  import flash.display.Sprite;
  public class SpaceShip extends Sprite {
   private var speed:Number = 0;
   private var damage:Number = 0;
   private var fuel:Number = 1000;
   public function takeOff():void {
     //...
   }
   public function crash():void {
     //...
   }
   public function shoot():void {
     //...
   }
   public function selfDestruct():void {
     //...
   }
  }
}
  

阅读更多
个人分类: Flash Flex
想对作者说点什么? 我来说一句

Flash ActionScript 3.0从入门到精通

2009年08月12日 9.55MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭