Actionscript 3.0基础教程1-类的编写

作者: egoldy

性质: 原创

阅读次数: 26776

发表时间: 2007-02-20 06:23:21


     此教程是在上一篇探索Actionscript3.0 flash9 Preview教程的基础上写的.如果你还没有读过探索Actionscript3.0 flash9 Preview,请先读上一篇教程之后,在读此教程,在此教程中,我们根据上一篇教程中的例子,来研究编写的类的各种方式,以适应一些不同的情况.



在上一篇教程中,我们已经了解到了在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();
        }
    }
} 

现在就可以测试你的影片了。

By egoldy: 在此教程中我们只是研究类的编写方式,了解了类的编写方式,我们就可以在后面的编写工作针对不同的情形进行类的编写了。
 

讨论此教程

源文件下载

服务项目_SERVICE

关于我们

万博思图(北京)信息技术有限公司,专业的flash,flex开发团队,5年经验。公司致力于互联网上的业务的开展,对于互动网站行销,互联网应用程序开发有成熟的解决方案。我们关注互联网市场动态,关注新技术,更注重在新的领域不断探索发现。
万博思图业务内容主要包括企业品牌Flash网站开发,企业形象宣传Flash设计,动画,多媒体演示,Flex企业级应用程序开发,拥有众多成功案例,欢迎来电咨询。
 
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝阳区光华路15号院泰达时代中心4号楼704 邮编: 100026 EMAIL: WEBSTUDIO@WEBSTUDIO.COM.CN
电话: 010-59070059   (新号:010-59897050 010-59897060)  手机: 13693660520 传真: 010-59070059-801
京公网安备:110108006741      京ICP备:05013074号-1
王先生