• 让 Flash 广告具有记忆功能 - [AS]

    2008-02-03

    分类: AS
    当你常去的论坛上有个 Flash 广告,而你每次刷新页面的时候它都从头播放.
    会不会感觉很烦? 所以我们要改装一下这个Flash.给他植入记忆功能.

    要实现的效果:
    刷新或关闭页面的时候记住上次的播放头位置.
    下一次打开页面动画接着上一次的位置继续播放.

    应用:效果可以看经典论坛的 Banner 广告.
    http://bbs.blueidea.com

    实现代码如下(发布成AS1/AS2):...
  • 一些不太常见的代码写法 - [AS]

    2008-01-28

    分类: AS
    先看一下下面的代码,看是否每个都知道是干什么的,稍后我再把每一个代码的作用帖上。首先声明一下,写下述代码的目的不是让大家模糊代码,只是看到这样的代码时心中有数,呵呵,另外也希望能有朋友补充一下(注意,以下代码仅为示例,但大部分代码对于高手来说是不成问题的)

     1、mc.gotoAndPlay(Math.random()*10>>0);
    //Math.random()*10 取 10以内带小数的随机数。
    >> 是移位符号 &g...
  • 测试AS代码的执行速度 - [AS]

    2008-01-20

    分类: AS
    在帧标签的动作栏中,输入:

    var i = 0;
    var chongfucishu = 1000;
    t = getTimer();
    while (i    //代码放在这里
        i++;
    }
    trace(getTimer()-t);

    测试时间有什么意义呢?可以帮助我们优化代码,同一个程序可以用多种方式编出来,最优的方式...
  • 我眼中的常量与变量 - [AS]

    2008-01-18

    分类: AS
    最重要的一点也是难点,你要想尽一切办法理解:值类型与引用类型的区别。     
    在OOP(面向对象程序语言)中如果说“一切都是对象”(Everything is object),还不如说一切都是变量,在笔记一里我们说可以把对象的属性看成是变量。在这里我认为对象自身也可以看成是变量。     
    变量是编程所必需的。变量其实就是一个在程序运行时可以改变的量(从这个意义上说,常量其实...
  • as入门之恶补数学(三) - [AS]

    2008-01-18

    分类: AS
    我们都知道,横波是一种正弦波,那么我们就要模拟出来一个正弦的波的形状.
    下面说一下它的制作过程及原理.
    原理:使用正弦函数控制每个小球在竖直方向的运动,用复制函数来复制相同的小球在不同的水平位置.
    制作过程:
    1、先做一个小球,我们可以用线性渐变,做一个有一定立体感的小球。转换为mc
    2、新建一个mc,命名为ss,把刚才做好的小球mc拖入场景,调整它的位置到正中间。在小球mc上加上如下代码:
    onClipEvent(load){ //小球载...

  • 最近总用一些朋友问起一些数学公式,说这些内容不会,所以在这里开一个基础教程,希望能够对大家的学习提供帮助.
    在flash中,Math类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.
    我们先来看看flash中提供的Math类吧:
    Math.abs()          计算绝对值。
    Math.acos()   &n...
  • 美妙的Timer类——Timer与时钟Timer绝对是as3改进的亮点之一。它的使用技巧和美妙之处不是一下能说完的。这里先对它进行个完整的说明,再举几个具有启发的例子。为初学者处理计时器打下牢固的基础。

    Timer类:
    Timer类继承EventDispatcher。是FlashPlayer计时器接口。计时器可以用来间隔调用和延时调用。在其过程中可以访问其状态甚至进行干预。以此塑造出来的灵活性足以替代as2中的setInterval和getTi...
  • AS3的冒泡机制 - [AS]

    2008-01-18

    分类: AS
    再述冒泡
    思路
    1 在as2中发现问题,
    2 在as3中解决问题。
    3 结合问题,说明冒泡
    4 冒泡的问题所在以及解决方法

    冒泡很多人在谈,前段时间小弟也是一知半解。弄得云里雾里的。
    最近找到一个pdf,呵呵,才算弄明白了点。
    把一点学习笔记发出来。

    1 在as2中发现问题,
    我们用一个例子来发现as2中究竟有什么问题。
    As2中实现如下效果:
    舞台上一个m...
  • 看了一下keith peters的ActionScript 3.0 making things move样张,实在令人佩服

    只是还没出版,等,出了之后一定备一本在身边
  • Document Class初始化 > 主时间轴代码执行 > 舞台元件绑定的类初始化 > 元件的时间轴代码初始化 >..
    下面的层次按这样的规律循环。
  • flahs as 无基础入门经典教程 - [AS]

    2007-12-19

    分类: AS
    做过Flash动画的Flash爱好者们都知道,要做好一个Flash动画,AS是必不可少的,即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识。
    首先我们要了解AS要写在什么地方,什么时候AS会被触发执行。
  • as2深入理解函数 - [AS]

    2007-12-19

    分类: AS
    ◆函数是一种将代码块组织到一起的方法,可以通过名字或引用来调用它们,从而一遍又一遍地使用它们。
    ◆函数可以作为子程序,即它们可以执行某些运算并返回一个值。
    ◆函数可以被命名,也可以匿名。这两种类型都有不同的优点和缺点。
    ◆通过使用为函数创建的arguments对象,可以调用一个调用函数,递归地调用一个匿名函数, 并且按数组而不是按单独的各个变量来使用传递给函数的各个参数。
    ◆定义可以在许多不同环境中使用的通用函数是值得的。
  • as2 基础教程(1) - [AS]

    2007-12-19

    分类: AS
    ActionScript 2.0--接口 ************************************ 当在使用OOP时,除了继承比较重要之外,在就是接口了.就像JAVA和C#,ActionScript不提供多重继承(如一个子类可继承多个超类),这是因为如果使用不当在调试时就会象做了一场恶梦一样.会造成死循环和粘连不清的情况,在精心设计你的项目时,使用接口可以同样达到多重继承的效果,而不会出现上面说的那种很麻烦的情况. 一个接口就象是各类在执行方法时的一种协议,而通常在各个类未执行方法时是没有联系的.在接口中没有代码没有属性,只有方法,它的书写方式完全就象是在书写一个类一样,除了:
  • 原来是在1024X610 大小里做的场景,现在新做了一个场景是800X600的。
    怎么样把原来1024X610里面做的东西放在 800X600里面?

    最后根据需要的舞台大小,这里是800*600;
    编辑完成之后,在场景中第一层首帧加以下脚本:

    _root._xscale=int(800/1024*100);
    _root._yscale=int(600/610*100);

  • AS3.0教程(11): 视觉元件精要(1)
    来源:http://www.kingda.org/archives/kingda/2006/11/as3011_1.html#more
    作者:黑羽(KingdaSun)

    彻底了解AS3视觉元件架构
    DisplayObject,直译为视觉对象,意为可以被看到的对象。

    视觉是Flash 成功的主要基石。当我赏析Actionscript 3 的所有视觉元件类型和其整体构架时,感到非常满意。可以看出,这次整体的架构设计是深思熟虑的结果。与其他语言,比如C#,相比有自己强烈的特色,是对Flash视觉行为贴身定做的结果。

    Actionscript 3的架构乍一看很复杂,不包括UIComponent的子类,就有7到8个层,20多个莫名奇妙的类。头疼!但实际上,它的设计是非常的简洁优雅,远远比Actionscript 2一个MovieClip打天下强太多了。实际上,只要真正弄清了它的设计思路,就可以高屋建瓴,一览无余,会发现这个架构逻辑清晰,非常的易懂易记。所以,先抛开Actionscript 3 的帮助文件,我们一起来看看为什么要设计这样一个架构,搞出20多个怪胎出来。

    先来追忆一把Actionscript 2中无所不能的先贤: MovieClip(影片剪辑)。 这位兄台无所不能:可在其中画矢量图,可在其中贴位图;可在其中做影片,也可嵌套子影片;偶尔用来加载,闲来客串按钮;三教九流皆可放,肚皮天下第一广。它的父亲何人,原来是元始天尊Object。

    这样的玩意儿,新手用起来很爽,大大节约了脑细胞。但任何一个有过大型OOP项目经验的老手,都会毫不犹豫的指出,这样的架构设计是失败和混乱的。代价是巨大的。MovieClip类公开的属性和方法共有一百多个(自己数数)!居然直接继承根类!居然拥有这样多公开(public)属性和功能的类!居然应用范围如此广泛!

    首当其冲,其第一弱点就是系统资源的浪费。

    举个例子, 我新建一个空MovieClip A,只是想让它做个容器,好在里面放几个有内容子MC。这样我操作A的位置和渐变时,子MC会统一变化。这样的经验大家都有吧。可就是这么一个简单的纯容器A,Actionscript 2&1都会毫不犹豫的把MovieClip所有的属性和方法都赋给A。谁让A是MovieClip类的实例呢?可在这个应用上,我们要A的其他90多个功能干什么呢?而且还不算最耗资源的内建的对Timeline的支持!大家想想,我们每天都在创建MC。但事实上我们做开发时,创建的MC有多少用到了大部分的功能和Timeline?只有一部分的通过Flash创建的MovieClip才需要时间轴的支持,其余大部分根本不需要时间轴支持。这样的设计是不是有问题呢?

    痛批了一顿Actionscript 3之前的MC后,我们不得不说几句公道话:这样的错误是有其历史局限性的,我们不能苛求古人。且看现在的视觉元件架构,那叫一个爽。爽,就爽在系统设计师对整个Flash视觉系统的抽象上。抽象和解构的功力很深!不得不佩服!系统各个超类和子类的设计划分,职责清晰,稳健高效,堪称优雅!我看.Net FrameWork 的System.Drawing架构设计时都没有这个感觉。毕竟Flash是靠视觉起家,与视觉动画交互打交道最深阿。

    下面来欣赏Actionscript 3 的元件架构。

    Actionscript 3 中所有可以被看到的视觉元件都统一于DisplayObject,即其子类的实例。DisplayObject是一个抽象类,不能生成实例。从系统架构设计上来说,这样的超类设计是常识。DisplayObject,我在AS3.0教程(5):强大的事件机制(1)中讲过,继承于EventDispatcher类,也就意味着所有的DisplayObject子类都可以发送事件了。

    啊哈,DisplayObject下面一层的抽象就精彩了,架构设计师的原意是将所有视觉元件分为两大类:可以接受人机交互事件的,和不可以接受人机交互事件的。所以就有了InteractiveObject类和非InteractiveObject类之分。由于非InteractiveObject的几个类之间差别太大,也抽象不出什么共同点,所以,干脆就分成了InteractiveObject的六个同级兄弟 AVM1Movie, Bitmap, MorphShape, Shape, StaticText, Video。但黑羽认为从系统的优雅性出发,不妨就设一个UnInteractiveObject的超类,将这六个孩子放在这个超类的下面。还便于日后的功能扩展。

    在讲最重要的InteractiveObject之前,我们先把这几个不伦不类的兄弟先扫掉。这几个子类中,我们把它分为可以代码创建的,和不可以代码接触的。所谓不可以代码创建的,是指只能通过Flash创作工具来创建的。和以前一样,StaticText还是不可以用代码实现。另外一个是MorphShape,这个东东是指在Flash中创建Shape形变时,由Flash Player自动生成的,同样的,代码无法实现。

    剩下的几个都是可以用代码创建的:Bitmap,位图对象,可以通过BitmapData对象来创建,也可以从外部载入,比如通过loader。Shape,形状,专门用来绘制矢量图的,通过Graphic对象创建的。Video,视频对象,专门用来播放视频的,可以来自文件也可以来自网络流媒体。

    下面要说到的是AVM1Movie,所谓AVM1Movie,意思就是说Actionscript Virtual Machine 1所支持的SWF影片,也就是Actionscript 1和2的影片。由于Actionscript 3 采用的是AVM2,所以和AVM1影片无法跨脚本交流,必须要把它同AVM2 swf影片区分开来,所以有个这个类。关于这个,感兴趣的兄弟看我的这篇文:小谈Actionscript 3.0与AS 2.0,1.0的swf兼容性。这个一般我们不用关心,也不用直接接触,一旦我们加载一个AVM1老影片到AVM2 swf中时,Flash Player 会自动创建一个AVM1Movie的实例包装这个swf。我们打交道的往往是装载AVM1 swf的容器元件。

    到了InteractiveObject下一层了,这一层共有三个类。

    这一层的抽象理念又要赞一下。架构设计师又用了一个容器和非容器的概念来区分视觉元件。所谓容器,就是可以在其中加载其他的DisplayObject子类对象。当然也包括它的叔叔们,即非InteractiveObject的那几个类。所谓非容器,那就是说不能在它的视图里面加入其他的DisplayObject了。“容器”,这个公共性质实在太重要了,在这一层才这样抽象出来实在很高明,很到位。

    那么老套路,先讲讲非容器的两个类,TextField和SimpleButton。 TextField,就基本上是我们熟悉的动态文本框,这里暂不细说。来说说SimpleButton,这个名字虽然和我们在Actionscript 2中碰到的SimpleButton一样,但实际上二者有很大的差别了。实质上,Actionscript 3 中SimpleButton这个类是将Button这个重要常用的UI控件单独提出作为一类,而不是像以前和MovieClip混淆不清。谁都知道,在Actionscript 2和1中,只要改改MovieClip前几个帧的标签,这个MovieClip就变得和Button一样了。关于SimpleButton的使用,可以说非常简洁实用,这个放在后面细说。我在这里所要强调的是Button和MovieClip不是一个性质。虽然Actionscript 3中Sprite和其子类也可以通过buttonMode来做出和Butoon相似的行为,但原理是不同的。

    剩下的就是DisplayObjectContainer类了。DisplayObjectContainer的所有子类对象,都可以在其中添加其他DisplayObject子类对象。但要注意一点,DisplayObjectContainer本身也是一个抽象类,不可以生成实例。这是出于架构设计稳健性扩展性的考虑,和将DisplayObject设计成抽象类的原因一样,不多说了。

    重要的是看看它的几个子类,Sprite, Loader, Stage。 Stage,就是舞台,所有的视觉元件都是在它之中,当之无愧是最终容器,放在这一层也是合情合理。 Loader就有趣了,它把以前MovieClip装载的部分全部抽象分离出来了。所有和外部资源的加载,都是通过Loader来进行的。而Loader也不能直接和网络资源打交道,要通过专门的URLRequest对象来进行,各司其职,非常好。Loader能干什么?装载swf, 和各种图片。注意,视频还是要通过Video类来进行,直接addChild到各种Container中,不一定要放在Loader中。

    下面来了Sprite,这个3.0中我们打交道最多的容器了。一句话,它是去掉了时间轴的MovieClip(即MovieClip被阉掉了)。如我开头例子所说,倘若我们只是为了创建一个容器,那么Sprite是首选。甚至可以说,我们这些写代码的开发人员,90%以上的情况都只需要和Sprite打交道。含有时间轴的MovieClip一般是Flash工具创建出来的,往往只需要加载就可以了。准确的说,Sprite比Actionscript 2中的MovieClip不止少一个TimeLine,如装载。Sprite中也含有Graphic对象,这意味着,它也可以直接在其中代码绘图。但我们始终要记住,Sprite不同于Shape,区别就在于Sprite是容器,而Shape不是。从代码角度说,就是,Sprite可以addChild(),但Shape不可以。

    都说到这儿了,我们亲爱的MovieClip还不见踪影,到底在哪儿了呢?其实就在Sprite的下一层。Sprite下一层中,共有四个子类,MovieClip是其中一个。大家可以想到,现在的MovieClip重要性大不如前了,主要就是代表用Flash创建的含有时间轴的影片。常用的gotoAndStop, currentFrame等等这些属性现在才能碰到了。

    其余三个子类,也是来头不小,最牛的就是其中的FlexSprite。虽然它的改动只是变了一下toString()函数,但它却是所有Flex组件的共同基石。著名的UIComponent的老爸现在就是它了。UIComponent何许人也?天下组件,皆由它出。黑羽大胆预测,我们在Flash 9中所要用到的控件,也就是现在的Flex里面的组件,即mx.controls里面的所有组件。此类不可小看。

    另两个子类Preloader和DownloadProgressBar,已经不属于flash.display包了,而是属于mx.preloaders包,主要管理的是下载进度和共享库的下载等功能,不予细说了。

    到此,Actionscript 3 主要的视觉元件架构已经理出了一个清晰的脉络,设计的原因,理由,思路都做了一一剖析,希望大家喜欢。其实InteractiveObject下的另外两根枝条TextField和SimpleButton也有很重要的地位,在后续教程中会一一细说。

    下面到了老鸟时间了,和老鸟们分享一下我对Actionscript 3 视觉架构的分析心得。可以看出的是,抽象的界限非常明确,应用的模式也比较统一。应用的模式就是OOP编程中最常用的模式之一:Composite模式。比如Shape下的Graphic对象,Sprite下面的SoundTransform对象,Loader下的LoaderInfo对象,等等等等。我本来迷惑,为何不用装饰器模式,让这些元件的行为和Actionscript 2更加相似一些,过渡的痛苦少一些,但转念一想明白了架构设计师的苦心。就是要用这样清清楚楚,明明白白的Composite来加强所有开发者OOD时分工协作,更加快的熟悉和运用新的强大的架构。与这个优点相比,这么一点过渡的痛苦又算得了什么呢?

    关于Actionscript 3视觉编程后续部分和具体的编程例子,会陆续放出。
    P.S:本系列教程受Creative Commons License.协议保护,未经作者同意,不得用于商业用途。