热门搜索:新年 节日 礼物 喜庆 人物 花纹 插画 PSD Web2.0 iPhone
维奇社区

你的位置:维奇素材网>学习教程>Flash>

繁體版
    AS3.0学习教程系列(五)
    来源:经典论坛 | 作者:lzyy | 发布时间:2007-12-04 | 栏目:Flash

  • 首先声明:本人大菜鸟一个,刚接触AS3不久,许多理念还没来得及灌输,这些case都是从网上down的,但因为解说是英文的,不利我们学习,我就充当一个translater,顺便可以让自己巩固一下知识。

    水平有限,错误难免,欢迎大虾小虾,大鸟小鸟指正。

    下面进入正题:

    >>>源文件下载

    案例5:熟悉AS3的package,以及多个package之间的相互通信

    说明:一个很简单的demo,有4个按钮,当鼠标划过和移开时会呈现出不同的状态,单击后变成disabled,再点击其他的按钮时,之前disabled的按钮恢复,被点击的按钮失效。

    演示http://www.live-my-life-with-yuyi.com/as3_cases/communicating/

    准备工作:打开源文件communicating_final.fla,点击属性里的发布设置,点击Actionscript3旁边的设置,在最下面的classpath里,引入classes的文件夹的路径,然后点击确定,前期工作就准备完了。

    代码

    源文件里的代码很简单:

    import todd.interactive.ButtonSet;
    var buttons:ButtonSet = new ButtonSet();
    buttons.addButtons([one_mc,two_mc,three_mc,four_mc]);
    addChild(buttons);

    导入ButtonSet类,实例化,然后调用里面的一个方法,最后将它放到舞台上。

    classes文件夹下面的todd->interactive文件夹里有两个as文件,其中一个就是刚刚调用的ButtonSet,来看看ButtonSet的源码:

    package todd.interactive
    {
        //其实只需载入display和events就可以了,不过多载入几个并不影响文件大小和效率
        import flash.display.*;
        import flash.events.*;
        import flash.filters.*;
        import flash.net.*;
        import flash.geom.*;
        import flash.ui.*;
        import flash.utils.*;
        import fl.transitions.*;
        import fl.transitions.easing.*;
       
        public class ButtonSet extends MovieClip
        {
            public var buttons:Array;
           
            public function ButtonSet()
            {
               
            }
           
            public function addButtons(buttonSet:Array):void
            {
                buttons = buttonSet;
                for(var i:int = 0; i < buttons.length; i++)
                {
                    addChild(buttons[i]);
                }
            }
        }
    }

     

    一个类应该被放在一个package里面,就像钱应该被放到钱包里一样。package后面定义的是该类的路径。然后一系列常用的类。
    定义了一个全局变量buttons,在变量前面加一个public就可以了。这样就能在整个类中被访问到。
    类名应该和文件名一样(区分大小写),然后定义一个同名函数,这个函数会在类被初始化时调用,就像php4的类一样。这里只是搭了个架子,没有具体内容。
    然后定义了一个函数addButtons,它的作用就是将一些mc或者sprites放到自己的container里(addChild)。
    还有一个类:DisablingButton,也是位于todd->interactive文件夹下,这也是这个案例的核心。对了,之前已经将RectButton的linkage里的baseClass设置为todd.interactive.DisablingButton。

    代码稍微有点长,且听我细细道来

    package todd.interactive{
        import flash.display.*;
        import flash.events.*;
        import todd.interactive.ButtonSet;
        public class DisablingButton extends MovieClip {
            var labels:Array;
            var thisParent:*;
            var thisIndex:int;
            public function DisablingButton() {
                labels = this.currentLabels;
                this.addEventListener(MouseEvent.CLICK, disableButton);
                this.addEventListener(MouseEvent.ROLL_OVER, over);
                this.addEventListener(MouseEvent.ROLL_OUT, out);
                this.addEventListener(Event.ADDED,setParent);
            }
            function disableButton(event:MouseEvent):void {
                for (var i:int = 0; i < labels.length; i++) {
                    if (labels[i].name == "disable") {
                        this.gotoAndPlay("disable");
                    }
                }
                this.removeEventListener(MouseEvent.CLICK, disableButton);
                this.removeEventListener(MouseEvent.ROLL_OVER, over);
                this.removeEventListener(MouseEvent.ROLL_OUT, out);
                enableOthers();
            }
            function enableButton():void {
                this.addEventListener(MouseEvent.CLICK, disableButton);
                this.addEventListener(MouseEvent.ROLL_OVER, over);
                this.addEventListener(MouseEvent.ROLL_OUT, out);
                this.gotoAndStop(1);
            }
            function over(event:MouseEvent):void {
                for (var j:int = 0; j < labels.length; j++) {
                    if (labels[j].name == "over") {
                        this.gotoAndPlay("over");
                    }
                }
            }
            function out(event:MouseEvent):void {
                for (var k:int = 0; k < labels.length; k++) {
                    if (labels[k].name == "out") {
                        this.gotoAndPlay("out");
                    }
                }
            }
            function setParent(event:Event):void {
                if (this.parent is ButtonSet) {
                    thisParent=this.parent;
                    for (var w:int=0; w < thisParent.buttons.length; w++) {
                        if (this == thisParent.buttons[w]) {
                            thisIndex=w;
                        }
                    }
                }
            }
            function enableOthers():void {
                for (var z:int=0; z < thisParent.buttons.length; z++) {
                    if (z != thisIndex) {
                        thisParent.buttons[z].enableButton();
                    }
                }
            }
        }
    }
     

    载入了两个常用类后,又载入了刚刚定义的ButtonSet类,这样我们就能使用ButtonSet的一些方法了。

    注意:这个类必须继承Movieclip类,因为该类的对象是一个mc。
    然后定义了一些全局变量(默认均为public)。
    创建析构函数DisablingButton,labels = this.currentLabels; 这句话的意思是取得当前mc的label属性,以array的形式返回,包含了label.frame,label.name等等的属性。
    然后监听自己的鼠标点击、移入、移出事件。
    this.addEventListener(Event.ADDED,setParent);这句话的意思是当自己被添加进一个容器时调用setParent函数。
    disableButton这个函数作用是,将当前mc的状态变成disabled,然后取消监听事件,同时激活其他的按钮。
    enableButton函数的作用就是激活自己的监听事件,并初始化自己的状态。
    over和out函数很简单,就是设置自己当前的状态。
    setParent函数的最终目的是捕获点击事件发生在哪个mc上(gotoAndPlay方法将触发EVENT.ADDED,所以over和out函数都将触发setParent函数,这也是一个待改进的地方)。
    enableOthers函数顾名思义,激活其他的按钮。因为setParent已经记住了,最后的点击事件发生在哪个mc上,所以只要遍历一下buttons,然后激活其他的mc就可以了。

    案例分析完毕。



  • TAG:

上一篇:Flash8模糊滤镜制作逼真竹页林   下一篇:Flash制作雨滴效果(附源码)

热门推荐

经典壁纸

    超酷设计壁纸 幻彩系列壁纸
    超宽屏或双屏幕精选壁纸系列二 超宽屏或双屏幕精选壁纸系列一
字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部