当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > Flash编写类及外部as文件的方式

ActionScript
FLASH 3D相册之利用BitmapData类制作
Flash 脚本游戏开发教程 第一课
Flash 脚本游戏开发教程第二课
Flash 脚本游戏开发教程第三课
Flash 脚本游戏开发教程第四课
Flash 脚本游戏开发教程第五课
Flash 脚本游戏开发教程第六课
Flash 脚本游戏开发教程第七课
Flash 脚本游戏开发教程第八课
Flash AS实现的蝌蚪摆尾动画的教程
从基础开始深入学Flash AS3教程(4)(译文)
从基础开始深入学Flash AS3教程(5)(译文)
从基础开始深入Flash AS3教程(2)(译文)
从基础开始深入学Flash AS3教程(3)(译文)
Flash AS3对单个图片进行角色动作化处理
从基础开始深入Flash AS3教程(1)(译文)
Flash教程:if条件语句的用法
Flash AS教程:_visible属性的详细讲解
Flash AS教程:图片环绕旋转效
Flash教程:trace()的使用

ActionScript 中的 Flash编写类及外部as文件的方式


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-16   浏览: 47 ::
收藏到网摘: n/a

我们已经了解到了在flash 9中如可在时间线上编写代码,如何将现有的时间线上的代码转换为外部类.以及flash9的Document Class形式,接下来我们要更细一步的来研究编写类及外部as文件的方式.
include
如果你之前了解As1.0,As2.0编程,那么对include一定不陌生,在Actionscript 3.0中我们仍可以使用include 来导入代码.
如下的例子:

1.打开flash新建一个文档,保存为drag_inclue.fla在场景中创建一个movieclip,本例中使用的圆球,将其转换为影片剪辑,并在场景中将其命名为circle_mc. 不需要在库中设置链接属性.
2.新增一层,按下F9打开Actionscript面板,在其中输入代码如下:
代码:

//设置当光标移到circle_mc上时显示手形
circle_mc.buttonMode = true;
// 侦听事件
circle_mc.addEventListener(MouseEvent.CLICK,onClick);
circle_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
circle_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
//定义onClick事件
function onClick(event:MouseEvent):void{
trace("circle clicked");
}
//定义onDown事件
function onDown(event:MouseEvent):void{
circle_mc.startDrag();
}
function onUp(event:MouseEvent):void{
circle_mc.stopDrag();
}

3.将此帧上的代码全部选中,按下ctrl x剪切掉,选择flash的new菜单,新建一个Actionscript文件,在刚剪切掉的代码贴上.保存名为drag_include.as.与drag_include.fla在同一路径下.
4.回到drag_include.fla中,在第一帧上输入如下代码:
include "drag_include.as"
测试影片即可以看到与时间线上测试时相同的结果了.此种方式,在As1.0时经常使用.如果你仍习惯这种方式,在Actionscript 3.0中仍可以使用.
元件类(symbol class)
这里所说的元件件类,实际是指为flash影片中的元件指定一个链接类名.它与上面的include 的不同之处于,它使用的是严格的类结构.而不是我们习惯上的时间线编写方式.我们要将小圆球的拖动功能封装起来,这样不论你创建多少可以拖动的小球,都会变得很轻松,只需要创建它的实例并显示出来即可。
我们仍使用上例来说明问题.打开drag_include.fla文件,将其另存为Symbol_class.fla文件,新建一个Actionscript文件,将其保存为Symbol_class.as文件,与Symbol_class.fla文件在相同目录下。现在我们将上面的例子中的代码抽象成类如下:
代码:

package {

import flash.display.MovieClip;
import flash.events.MouseEvent;
public class Symbol_class extends MovieClip {
public function Symbol_class(){

this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK,onClick);
this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
this.addEventListener(MouseEvent.MOUSE_UP,onUp);

}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
this.startDrag();
}
private function onUp(event:MouseEvent):void{
this.stopDrag();
}
}
}

因为我们将类的名称设置为Symbol_class,所以此类文件一定要保存为Symbol_class.as文件.我们还要做一步工作,在源文件中打开库面板,右击circle_mc选择链接,复选Export for Actionscript.在class处输入Symbol_class.as即让我们类与元件相关连..此时测试影片,你会看到与上例中相同的结果.这里注意一点,场景中仍要保证circle_mc的存在.因为在代码中我们并没有动态的贴加circle_mc. 同时这个例子中,与上例一样,我们并没有使用As3.0的Document Class特性.
动态类(dynamic class)
此种编写的类的方式与探索Actionscript3.0 flash9 Preview教程中的例子是一样的,此种方式是最最常用的.对于一些稍复杂的程序来说,是由主类和多个辅助类组成的.辅助类封装分割开的功能,主类用来显示和集成各部分功能。如上例我们已经封装了小球的拖动功能。现在我们想要创建100个这样可以拖动的小球。
如下演示:

思路是我们已经创建了封装了拖动功能的类,我们在创建一个主类,用来显示这100个具有拖动功能的小球,我们将使用As3.0的DocumnetClass 新特性.
如下:我们将主类命名为DocumentClass.as, 封装后的拖动球功能我们命名为Drag_class.as.
DocumentClass.as
代码:

package {

import flash.display.MovieClip;

public class DocumentClass extends MovieClip {

// 属性
private var _circle:Drag_circle;
private var _wslink:wslink;
private const maxBalls:int = 100;
// 构造函数
public function DocumentClass(){
var i:int;
// 循环创建小球
for(i=0;i<=maxBalls; i  ){
// 创建可拖动小球的实例
_circle = new Drag_circle();
// 设置小球实例的一些属性
_circle.scaleY = _circle.scaleX = Math.random();
// 场景中的x,y位置
_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
// 在场景上显示
addChild(_circle);
}
}

}
}


Drag_circle.as类
代码:

package {

import flash.display.Sprite;
import flash.events.MouseEvent;

public class Drag_circle extends Sprite {

public function Drag_circle(){

this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK,onClick);
this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
this.addEventListener(MouseEvent.MOUSE_UP,onUp);

}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
this.startDrag();
}
private function onUp(event:MouseEvent):void{
this.stopDrag();
}

}
}

打开我们之前所用过的fla文件,将其另存为drag_class.fla文件,与Document.as和Drag_class.as类所在目录相同。打开库面板,选中库面板中的小球,右击选择链接在class名称处输入Drag_class.注意与上面的元件类不同在于,我们不需要让场景中有任何内容,因为我们已在主类DocumentClass.as中动态的贴加和显示了circle_mc.。在DocumentClass.fla中的主场景中,在属性面板中的Document Class输入框中输入我们的主类名DocumentClass.然后你就可以测试了。
不使用库元件的动态类(dynamic class with no library)
在上例中我们使用的是已创建好的影片剪辑,并在库中做了类的链接,这种情况对于一些有复杂图形的情况下是比较好的选择,如果你能很熟练的应用Drawing Api绘制出你想要的任意图形,那么你也可以不使用库元件,可以直接在类中编写,在本教程中我们主要研究的是这种方式,接下来我们看不使用库元件如何编写类来实现上面的功能。
很显然即然不使用库中的元件,那么我们就需要在类中直接使用Drawing Api来直接绘制。如下,类的结构与动态类是相同的。我们需要在上例的基础上做些改动
首先删去fla中场景中的所有内容,包括库中的内容。

DocumentClass.as类如下:
代码:

package {

import flash.display.MovieClip;
public class DocumentClass extends MovieClip {
private var _circle:Drag_circle;
private const maxBalls:int = 100;
public function DocumentClass(){

var i:int;

for(i=0;i<=maxBalls; i  ){

_circle = new Drag_circle();

_circle.scaleY = _circle.scaleX = Math.random();

_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));

addChild(_circle);
}
}
}
}


Drag_circle.as类
代码:

package {

import flash.display.Sprite;
import flash.display.Shape;
import flash.events.MouseEvent;
public class Drag_circle extends Sprite {

private var _circle:Sprite;

public function Drag_circle(){

_circle = new Sprite();
_circle.graphics.beginFill(0xff0000);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();
_circle.buttonMode =true;
addChild(_circle);


_circle.addEventListener(MouseEvent.CLICK,onClick);
_circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
_circle.addEventListener(MouseEvent.MOUSE_UP,onUp);

}


private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
_circle.startDrag();
}
private function onUp(event:MouseEvent):void{
_circle.stopDrag();
}
}
}

注意Drag_circle.as类,我们只是增加了一段:
代码:

_circle = new Sprite();
_circle.graphics.beginFill(0xff0000);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();


还有就是构造函数之前的声明:private var _circle:Sprite;
测试你的影片。当然这里我们绘制的只是一个无渐变的红色园形。
Package Class
一般来说,一个.as文件中就一个类,但是在AS3中,现在允许在一个文件中定义多个类用来辅助主类。
在.as文件中的辅助类,必须定义在类包以外,并且只针对此文件中的主类和其他辅助类可见。它的基本结构如下:
代码:

package {
class MyClass {
function MyClass() {
var helper:MyHelper = new MyHelper();
}
}
}
class MyHelper {
function MyHelper() {
var helper:HelpersHelper = new HelpersHelper();
}
}
class HelpersHelper {
function HelpersHelper () {
}
}

注意,在包块中最多只能定义一个类。在同一个文件中的辅助类不是包块的一部分,并且只能在此文件中可见和被使用。
下面我们将我们将我们的类改写成上述的packge类形式。我们将下面的代码都写在一个DocumentClass.as的文件中,然后在fla文件中的属性面板中的Document Class输入框中输入DocumentClass类名。
代码:

package {

import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;

// Document Class
public class DocumentClass extends MovieClip {

private var _circle:Drag_circle;
private const maxBalls:int = 100;

public function DocumentClass(){
var i:int;
for(i=0;i<=maxBalls; i  ){
_circle = new Drag_circle();

_circle.scaleY = _circle.scaleX = Math.random();

_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));

addChild(_circle);
}
}
}

public class Drag_circle extends Sprite {

private var _circle:Sprite;

public function Drag_circle(){

_circle = new Sprite();
_circle.graphics.beginFill(0x6D6E71);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();

addChild(_circle);

this.buttonMode = true;
_circle.addEventListener(MouseEvent.CLICK,onClick);
_circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
_circle.addEventListener(MouseEvent.MOUSE_UP,onUp);

}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
_circle.startDrag();
}
private function onUp(event:MouseEvent):void{
_circle.stopDrag();
}
}
}
现在就可以测试你的影片了。