荣龙's profilecrl-就是这样PhotosBlogListsMore Tools Help

crl-就是这样

crl

荣龙 陈

Occupation
Photo 1 of 28
September 13

为影片增加侦听器

一个朋友的疑问.
 
为单个增加onPress侦听数组:
/**
* @author crl
* @version 0.000001
* @serialData File: C:\Users\crlnet\Desktop\BtnDelegate.as
Created: 2007/9/13 9:54:09
Modified: 2007/9/13 10:05:36
Size: 672 bytes
*@link http://www.nikemode.com
* @use new BtnDelegate(button);
*/
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class BtnDelegate {
 private var mc:MovieClip;
 public function BtnDelegate(mc:MovieClip) {
  if(typeof(mc)!="movieclip")throw new Error("不可当做按钮");
  this.mc=mc;
  EventDispatcher.initialize(this.mc.__proto__);
  mc.onPress=Delegate.create(this,press);
  mc.addEventListener("onPress",this);
 }
 private function press(){
  var o:Object={};
  o.type="onPress";
  o.target=this.mc;
  this.mc.dispatchEvent(o);
 }
 private function onPress(){
  trace(this.mc);
 }
 
为所有的影片,增加常用事情侦听数组.但由于flash里的一个特性-父级影片有鼠标事件,将忽略子级事件.

/**
* ...
* @author crl
* @version 0.000001
* @serialData File: C:\Users\crlnet\Desktop\BtnDelegate.as
* Created: 2007/9/13 9:54:09
* Modified: 2007/9/13 10:05:36
* Size: 672 bytes
* @link http://www.nikemode.com
* @use new BtnDelegate(button);
*/
import mx.events.EventDispatcher;
class BtnDelegate{
 private var eventList:Array=["Press","Release","RollOver","RollOut"];
 public function BtnDelegate() {
  EventDispatcher.initialize(MovieClip.prototype);
  for(var i in this.eventList){
   MovieClip.prototype.ref=this;
   MovieClip.prototype["on"+this.eventList[i]]=this[this.eventList[i]];
  }
 }
 private function Press(){
  this["ref"].dispatcher(this,0);
 }
 private function Release(){
  this["ref"].dispatcher(this,1);
 }
 private function RollOver(){
  this["ref"].dispatcher(this,2);
 }
 private function RollOut(){
  this["ref"].dispatcher(this,3);
 }
 private function dispatcher(target,index:Number){
  var o:Object={};
  o.type="on"+this.eventList[index];
  o.target=target;
  o.target.dispatchEvent(o);
 }
}
 
最下面这个方法,是我看过javaScript中为window.onload增加事件时想到的。
MovieClip.prototype.addEventListener = function(event, fun:Function) {
 var oldEvent = this["on"+event];
 if (typeof (oldEvent) != "function") {
  this["on"+event] = fun;
 } else {
  this["on"+event] = function () {
   oldEvent();
   fun();
  };
 }
};
//这边还有个小问题,必须用代理来弄。不然添加多个侦听会出错。
//接收函数中this指定失效,不过看完这几个,你自己捎加修改就可以解决
pp.mc.addEventListener("Press",Delegate.create(this,tt));
September 10

聊天记录

夜真 13:27:59
聊聊吗?
crl 13:28:41

夜真 13:28:50
你好 我是小妍
crl 13:29:18
你好,好像认识的样子
夜真 13:29:41
最近我在网络上看到一件事情, 想跟你分享好吗?
crl 13:30:45
好的.不会是法轮功什么的吧
crl 13:30:50
哈哈
夜真 13:31:13
河南省高耀洁医师在海外被颁发-年度女权活动人士奖, 这位中国抗艾滋病勇敢祖母的故事,一下子传遍全世界,这事有听说过吗
crl 13:32:09
没听说过,很感人吧
夜真 13:32:32
高医师的故事, 也是一部中国的近代史, 但却充满了辛酸与无奈
crl 13:32:33
祖母?
夜真 13:32:38
高医师说: 90年代中期,在共铲党「献血光荣」的误导号召下,偏远贫困的农民,纷纷加入了这场「以血致富」的运动中来
夜真 13:32:59
而结果呢?则是艾滋病在贫穷地区蔓延,一发不可收拾….
crl 13:33:08
针头没有消毒???
夜真 13:33:31
在卖血背后高昂的利润, 政府官员,商人.一连串利益挂钩, 导致中国目前有 500-1000万的艾滋病感染者
夜真 13:33:57
且每年以30%~40%的速度蔓延, 多少无辜的生命就这样没有了
crl 13:34:03
哪有那么多人要血.
crl 13:34:16
拿来喝也不用那么多.
夜真 13:34:26
河南有整个村变成艾滋病村,与世隔绝, 共铲党就准备让他们自生自灭,看到这样的事情,感到好心酸难过……
夜真 13:34:46
而高医师以80 岁高龄, 独自对抗贪官,共铲党, 置自己生死于度外,告诉更多人中国艾滋病的真象,这样勇敢的精神, 我想这应该就是中国未来的希望吧!
crl 13:35:10
然后这个应该不会报道吧
夜真 13:35:33
有时网友会跟我讨论, 管好自己就好了,干嘛那么多事!
crl 13:36:00
恩.报纸等媒体,都属于国家的
crl 13:36:14
怎么可能会报道不利于自己的东西
夜真 13:36:23
但我觉的中国是我们大家的, 我爱这片国土, 那些既得利益者, 只为钱不管老百姓死活, 若大家也默许它们这样的行为, 你想想中国会变成如何?
夜真 13:36:43
我只是一介小女子, 朋友都说我很直, 常常会说出别人想说又不敢说的话, 但我只希望跟网友聊聊真心话, 更希望中国好. 希望你别介意哦!
crl 13:36:53
什么人都有,但是坏人,应该是少部份
夜真 13:37:15
共铲党执政几十年, 经过三反, 五反, 文化大革命, 有计划的杀害了八千多万条无辜的中国人….每次计划完成都会骗人民说现在变好了
crl 13:38:15
其实维持一个国家的稳定利益大一一却
夜真 13:38:37
这像不像强盗杀了人, 然后跟对方家人说我这么做都是为了你好….
crl 13:38:36
有时可以错杀千人
夜真 13:38:44
最近全世界都在声援 2500多万中国人退出共铲党, 他们说:没有共铲党, 才有新中国, 说的很有道理耶
crl 13:39:42
安内,才能更好的抵御外敌.外面多少国家乱的不成体统
夜真 13:40:04
其实人民才是国家真正的老板,哪个党不行就叫他下台嘛!但是中国人被这个党统治的穷怕了,动不动就用稳定啦来骗人民, 其实祸根不就是这恶党吗?
crl 13:40:33
况且,我觉得我们的生活质量确实有很大的改善
夜真 13:40:56
苏联, 东德, 摆脱了共铲党, 人民拥有了真正的自由, 经济还突飞猛进
夜真 13:41:16
从此可以自己掌控自己的人生, 不必再被魔掌控制监视
crl 13:41:18
我看各国的国情
夜真 13:41:21
 
crl 13:41:49
你的想法太过悲观
crl 13:42:35
任何国家,任何区域,都会有不择手段的人.
crl 13:43:26
不过这些都不能推到一个国家的执政党
crl 13:43:49
看不到你的图.
crl 13:43:57
 
夜真 13:44:30
不好意思,我没装视屏耶
夜真 13:44:40
我刚说的都是我的想法
   发送连接请求给对方时(文件“{955D8C15-78DB-4CD9-B8CC-D310EB931991}0.jpg”)遇到网络错误,发送失败,可能您的QQ已经掉线,您可以尝试重新发送请求,或重新登录QQ
夜真 13:45:00
原来中国还是有这么多不怕共铲党的勇士,他们要从内心跟共铲党决裂, 还给自己一个干净的自我, 不再跟恶党同流合污
crl 13:45:16
恩,我知道.不过也应该处在别人的立场来想问题
夜真 13:45:21
还有很多网友在找真象, 让自己生命绽放出美好的光芒, 送你的图片上面有网址,你也可以上去看看什么是真相哦!
夜真 13:45:32
今天很高兴跟你聊这么多
夜真 13:45:42
我有点事, 要下了
crl 13:46:25
好的,记着一句话,没有绝对的好,也没有绝对的坏,处在别人的立场想问题
夜真 13:46:32
天天开心哦
夜真 13:46:37
886 .
crl 13:46:42
88
crl 13:46:52
我想你应该不是机器人吧
crl 13:47:11
自动聊天的那种装置 
August 31

猴子理论

-道德的起源-

把五只猴子关在一个笼子里,上头有一串香蕉
实验人员装了一个自动装置
一旦侦测到有猴子要去拿香蕉,马上就会有水喷向笼子
而这五只猴子都会一身湿
首先有只猴子想去拿香蕉,当然,结果就是每只猴子都淋湿了
之後每只猴子在几次的尝试後,发现莫不如此
於是猴子们达到一个共识:不要去拿香蕉,以避免被水喷到
後来实验人员把其中的一只猴子释放,换进去一只新猴子A
这只猴子A看到香蕉,马上想要去拿
结果,被其他四只猴子海K了一顿
因为其他四只猴子认为猴子A会害他们被水淋到,所以制止他去拿香蕉
A尝试了几次,虽被打的满头包,依然没有拿到香蕉
当然,这五只猴子就没有被水喷到
後来实验人员再把一只旧猴子释放,换上另外一只新猴子B
这猴子B看到香蕉,也是迫不及待要去拿
当然,一如刚才所发生的情形,其他四只猴子海K了B一顿
特别的是,那只A猴子打的特别用力(这叫老兵欺负新兵,或是媳妇熬成婆 ^O^)
B猴子试了几次总是被打的很惨,只好作罢
後来慢慢的一只一只的,所有的旧猴子都换成新猴子了,大家都不敢去动那香蕉
但是他们都不知道为什麽,只知道去动香蕉会被猴扁
这就是道德的起源

-阶级的起源-

实验人员继续他们的实验,不过这一次他们改变了喷水装置
一旦侦测到有猴子要去拿香蕉,马上就会有水喷向拿香蕉的猴子,而不是全体
然后实验人员又把其中的一只猴子释放,换进去一只新猴子C
不同以往的是猴子C特别的孔武有力
当然猴子C看到香蕉,也马上想要去拿
一如以前所发生的情形,其他四只猴子也想海K猴子C一顿
不过他们错误估计了C的实力,所以结果是反被C海K了一顿
于是猴子C拿到了香蕉,当然也被淋了个透湿
C一边打着喷嚏一边吃着香蕉,美味但是也美中不足
A、B、D、E没有香蕉吃却也比较快乐,毕竟没有被淋到嘛
后来C发现只有拿香蕉的那个才会被淋到,他就要最弱小的A替他去拿
A不想被K,只好每天拿香蕉然后被水淋
于是五只猴子有了三个阶级
这下子阶级也随着道德的起源了

-道德的沦丧-

天变热了,笼子里的猴子们想冲凉却找不到地方。终于出现了一位反潮流英雄,猴子HERO。
HERO在无意中碰到了香蕉,理所当然的引来了一顿饱打。但在挨打的过程中,猴子们享受到了冲凉的乐趣。等身上 的水干了之后,猴子A在无意中碰撞了HERO,使HERO又一次接触到了香蕉,于是,猴子们享受了第二次冲凉,HERO遭到了第二次痛殴。
在此之后,只要大家有冲凉的需要,就会有一只猴子X挺身而出,对HERO进行合理冲撞。
大家对HERO的态度也有了明显的不同,在平时大家会对HERO异常温和,以弥补在冲凉时为维护规则而不得不对它进行的暴力举动。
一天,在大家冲凉时,饱受折磨的HERO闻到了香蕉的清香,生物本能使它在别的猴子心有旁鹜时将香蕉吃了。而且此后没有了新的香蕉来填补空缺。猴子们陷入了另一个尴尬境地:没有冲凉的水,也没有香蕉,只有HERO。
于是,另一个规则形成了。猴子在烦躁的时候会痛打HERO出气,HERO不得反抗。
当笼子里的旧猴子被新猴子换掉时,新猴子会在最快的时间内学会殴打HERO。
终于有一天,老天有眼,历尽沧桑的HERO被另一只猴子代替了。猴子们失去了发泄的对象,只能任意选取一个目标进行攻击。从此以后,笼子里的猴子们不吃不喝不冲凉,唯一的举动就是打架。
这就是道德的沦丧。

-道德的重建-

实验人员对猴子们的争斗不休感到不安。为了重建道德秩序,他们决定继续供应香蕉。
一天,正在混战的猴子们发现头顶多了一串香蕉,它们其中的一个A不顾身上的剧痛,把香蕉摘了下来。于是久违的甘露出现了,未曾尝过甜头的猴子们先是茫然失措,继而争先恐后的加入冲凉的行列。香蕉反而被遗忘了。当猴子B、C、D、E发现A在享受淋浴的同时还吃着美味的香蕉,嫉妒心使它们暂时团结起来,共同K了A一顿,将A吃剩的香蕉夺过来,但是,此刻的香蕉成了匹夫怀里的宝玉,得到它的猴子虽然可以享受美味,但付出的代价也是巨大的。
实验人员不断放入香蕉,却发现战斗比以前更激烈了。分析清楚原因后,他们用木头做了一个假香蕉扔进了笼子。此时猴子们已经学聪明了,它们知道触摸香蕉可以享淋浴, 而试图独占香蕉则会遭到痛扁。于是,一个新的现象出现了,当猴子们有冲凉的需要时,会有一只猴子将香蕉拿起来,而当它发现有遭到攻击的可能时,它会马上放下香蕉逃到一边去。这样,猴子们都能冲凉,但是又不至于再象以前那样N败俱伤。
没有猴子发现那个香蕉是假的。

-信仰的起源-

五只猴子A、B、C、D、E三个阶级快乐地生活了很久
他们精确的给出了三个阶级的定义,即吃香阶级、拿香阶级和干看着阶级
可惜猴子A由于长期的水中作业无可避免地引发了它肺部功能的衰竭
一天他在例行的拿香蕉作业中跌倒了就再也没有爬起来
于是实验人员又送进了一只同样孔武有力的猴F
当然他还是对屋顶的香蕉很有兴趣
不幸的是他最终以微弱的劣势被以C为首的群猴再次海K
第二天,又到了拿香蕉的时候
猴子C很无所谓,反正他还要吃香蕉,反正他不会被水淋到
真正恐慌的是B、D、E三猴
F是那么的健壮,他们这些媳妇是熬不成婆了
他们将面临一个艰难的抉择,谁该去步A的后尘?
猴子B、D、E展开了激烈的争论,讨论谁最应该做下一个拿香阶级
猴子F很奇怪也很好奇,什么叫“拿香阶级”呢?
猴子B、D、E解释道:所谓“拿香阶级”就是猴子界勇敢者的阶级
需具备一不怕苦二不怕死的大无畏精神方能得此殊荣
猴子F闻听不禁有些神往,有些跃跃欲试
当然他最终达到了目的,作了唯一的拿香阶级
再后来,B、D、E三猴陆续被换出局,换来的猴子个个健壮如C
他们继续大大出手,不过目标不是香蕉,而是那个唯一的拿香阶级
于是信仰也出现了


-迷信的起源-

后来A终于被好心的实验人员拉出了苦海。
新来了猴子F
C觉得有必要维护自己的阶级地位,B、D、E则生怕自己顶了A的缸……
在各种复杂心情的作用下,B、D、E在C的带领下爆扁了F一顿,然后强令F做拿香蕉阶级。
F开始不乐意,后来慢慢在B等的劝说下等“待多年的媳妇熬成婆”这一宿命。
慢慢的老资格的B、D、E猴子渐渐被淘汰,C发现自己在体力上不再占有
优势,很难再通过武力让这一游戏规则继续下去,觉得十分苦恼。
这时,一只最有希望升级为吃香蕉阶级(暨C的理所当然接班人)也是C谋
臣的H向C进言。于是君臣定计。
H开始依靠自己多懂几种猴语而在其他若干猴面前树立的权威形象向其他猴鼓吹:“每一只新来笼子的猴子都是有罪的,这种罪责来自血统。……只有摘香蕉的猴子才能被(实验人员)送到天堂。”
事实上,因为被水冲很容易得肺炎病倒而被实验人员淘汰掉,猴子们不知道
反而以为被淘汰的猴子真的进了天堂。
渐渐,猴子都相信了这套理论,并且讲给每一只新猴子听。
然后就这么流传下去越传越神奇。以至于后来摘香蕉阶级的猴子都为了能摘香蕉而大打出手。……
这些都是C没有想到,H没有看到的,那时他们都已经死了。
然而迷信就这么诞生了。
 
June 30

AVM2Loader

用于加载AVM1的影片,但会清除所有的as我代码.
原文:http://snippets.libspark.org/trac/browser/fladdict/as3/src/net/fladdict/display/AVM2Loader.as

package {
    import flash.display.Loader;
    import flash.events.*;
    import flash.net.*;
    import flash.system.LoaderContext;
    import flash.utils.ByteArray;
    import flash.utils.Endian;

    /**
    * Loads both of AVM1 and AVM2 swf as AVM2.
    */
    public class AVM2Loader extends Loader {
        private var _urlLoader:URLLoader;
        private var _context:LoaderContext;

        /**
         * loads both of AVM1 and AVM2 movie as AVM2 movie.
        */
        override public  function load(request:URLRequest,context:LoaderContext=null):void {
            _context=context;

            _urlLoader=new URLLoader  ;
            _urlLoader.dataFormat=URLLoaderDataFormat.BINARY;
            _urlLoader.addEventListener(Event.COMPLETE,_binaryLoaded,false,0,true);
            _urlLoader.addEventListener(IOErrorEvent.IO_ERROR,_transferEvent,false,0,true);
            _urlLoader.addEventListener(ProgressEvent.PROGRESS,_transferEvent,false,0,true);
            _urlLoader.addEventListener(Event.OPEN,_transferEvent,false,0,true);
            _urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS,_transferEvent,false,0,true);
            _urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,_transferEvent,false,0,true);
            _urlLoader.load(request);
        }
        private function _binaryLoaded(e:Event):void {
            loadBytes(ByteArray(_urlLoader.data),_context);
            _urlLoader=null;
        }
        private function _transferEvent(e:Event):void {
            dispatchEvent(e);
        }
        /**
        * loads both of AVM1 and AVM2 movie as AVM2 movie.
        */
        override public  function loadBytes(bytes:ByteArray,context:LoaderContext=null):void {
            //uncompress if compressed
            bytes.endian=Endian.LITTLE_ENDIAN;
            if (bytes[0] == 0x43) {
                //many thanks for be-interactive.org
                var compressedBytes:ByteArray=new ByteArray  ;
                compressedBytes.writeBytes(bytes,8);
                compressedBytes.uncompress();

                bytes.length=8;
                bytes.position=8;
                bytes.writeBytes(compressedBytes);
                compressedBytes.length=0;

                //flag uncompressed
                bytes[0]=0x46;
            }
            hackBytes(bytes);
            super.loadBytes(bytes,context);
        }
        //if bytes are AVM1 movie, hack it!
        private function hackBytes(bytes:ByteArray):void {
            if (bytes[4] < 0x09) {
                bytes[4]=0x09;
            }

            //dirty dirty
            var imax:int=Math.min(bytes.length,100);
            for (var i:int=23; i < imax; i++) {
                if (bytes[i - 2] == 0x44 && bytes[i - 1] == 0x11) {
                    bytes[i]=bytes[i] | 0x08;
                    return;
                }
            }
        }
    }
}
June 20

使用混合模式(14种)

转载:http://4nothing.net/blog

混合模式就是把一个图像(基图像)的颜色跟另一个图像(混合图像)一起组合成第三种图像——结果图像就是屏幕上显示的实际图像。一个图像中的每一个像素都会和其他图像中对应的像素一起作用来生成最终结果中相同位置处的像素值。
每个display对象都有blendMode属性,它可以设置成下面的值之一。在BlendMode类中定义了一些相关的常量。当然了,你可以直接使用这些常量的实际值:一些字符串。
以下面两个图像为例,我们在圆形(2)上应用blendMode,它将叠在另一个图像(1)上
blendmode-0a.jpgblendmode-0b.jpg
BlendMode.ADD (”add”):
效果如下:
blendModeadd
把display对象的颜色值加在背景上,最大值是0xFF。通常用来在两个图像之间创建一种发光溶解的动画效果。比如,如果一个display对象有一 个像素点的颜色RGB值是0xAAA633,背景像素的RGB值是0xDD2200,混合后的RGB值是0xFFC833(因为0xAA + 0xDD > 0xFF,0xA6 + 0×22 = 0xC8,0×33 + 0×00 = 0×33)。

BlendMode.ALPHA (”alpha”):通常用于把前景的透明度应用到背景上。
效果如下:
blend alpha
把display对象上每个像素都相对背景设为透明的。这需要父级display对象的blendMode设置成BlendMode.LAYER。比如,在上面的示例图中,是一个白色背景,blendMode = BlendMode.LAYER。
BlendMode.DARKEN (”darken”): 通常用于叠加。
效果如下:
blendmode-6.jpg
选择display对象颜色和背景颜色中更暗的那个(也就是值更小的那个)。这个设置通常用于叠加的情况。比如如果display对象某像素的RGB值是 0xFFCC33,背景像素的RGB值是0xDDF800,那么最终显示的RGB值就是0xDDCC00(因为0xFF > 0xDD,0xCC < 0xF8,0x33 > 0×00)。

BlendMode.DIFFERENCE (”difference”): 通常用于创建更多跳动的颜色。
效果如下:
blendmode-7.jpg
比较display对象和它的背景对象爱你该的颜色值,并用亮的值减去暗的值。这个设置通常用于跳动较大的颜色。比如,如果display对象像素RGB 值是0xFFCC33,背景像素的RGB值是0xDDF800,那么最终显示的结果RGB值就是0×222C33(因为0xFF- 0xDD = 0×22, 0xF8 - 0xCC = 0×2C,0×33 - 0×00 = 0×33)。

BlendMode.ERASE (”erase”):通常用于使用前景alpha擦掉背景中的一部分。
效果如下:
blendmode-12.jpg
基于display对象的alpha值擦去背景上的部分。这需要把父display对象的blendMode设置成BlendMode.LAYER。比如上图中的父display对象就有一个白色背景,blendMode = BlendMode.LAYER。
BlendMode.HARDLIGHT (”hardlight”):通常用于创建阴影效果。
效果如下:
blendmode-14.jpg
根据display对象的暗度调整每个像素的颜色。如果比灰度50%亮,display对象和背景的颜色将选更亮的。如果比弧度50%暗,那么颜色将相乘,结果将更暗。这个设置主要用于阴影效果。
BlendMode.INVERT (”invert”): 用于反转背景。
效果如下:
blendmode-10.jpg
反转背景。
BlendMode.LAYER (”layer”): 用于强制为一个特定的display对象的预构成创建临时缓冲区。
效果如下:
blendmode-2.jpg
强制为display对象创建一个透明组。也就是说在处理display对象前先把它放到临时缓冲区中。如果display对象使用了缓存或者它是一个包含了至少有一个子对象的blendMode设置不是BlendMode.NORMAL的话,这个处理将是自动的完成的。
BlendMode.LIGHTEN (”lighten”): 通常用于重叠的情况。
效果如下:
blendmode-5.jpg
选择display对象和背景中颜色更亮的那个(颜色值高的那个)。比如,如果display对象某像素的RGB值是0xFFCC33,背景对应像素的 RGB值是0xDDF800,那么最终显示的结果RGB就是0xFFF833(因为0xFF > 0xDD, 0xCC < 0xF8, 0x33 > 0×00)。

BlendMode.MULTIPLY (”multiply”): 通常用于创建阴影和深度效果。
效果如下:
blendmode-3.jpg
用display对象的颜色乘以背景颜色,然后通过除以0xFF格式化它,结果将使更暗的颜色。比如,如果display对象的像素和背景对应的像素颜色 组成中(比如R部分)都是0×88,相乘之后是0×4840,除以0xFF后的值是0×48,它比diplay对象和背景颜色中对应部分都暗。

BlendMode.NORMAL (”normal”): 用于指定混合图像的像素值覆盖基图像的像素值。
效果如下:
blendmode-1.jpg
display对象显示在背景之前。display对象像素的颜色值将覆盖背景的。如果display对象是透明的,那么背景将显示出来。

BlendMode.OVERLAY (”overlay”): 通常用来创建阴影效果。
效果如下:
blendmode-13.jpg
根据背景的暗度调整每个像素的颜色。如果背景比灰度50%亮,选择display对象和背景中颜色更亮的那个。如果背景比灰度50%暗,颜色相乘,结果将更暗。

BlendMode.SCREEN (”screen”):
效果如下:
blendmode-4.jpg
用display对象反转的颜色乘以背景反转的颜色,得到漂白的效果。通常用于高光或者删掉display对象中黑色区域。

BlendMode.SUBTRACT (”subtract”):通常用于在两个图像间创建一个变暗相溶的效果。
效果如下:
blendmode-9.jpg
用display对象颜色各部分中减去背景颜色的值,最小值是0。比如,如果display对象某像素的RGB值是0xAA2233,背景像素的RGB值 是0xDDA600,那么最终显示的RGB值就是0×338400(因为0xDD - 0xAA = 0×33, 0xA6 - 0×22 = 0×84, 0×00 - 0×33 < 0×00)

May 24

as3 中的Array

ps.看看什么是震撼.flash3维渲染引擎(反恐版游戏)

as3.0跟javaScript1.6新增了多种方法,其主要为循环数组,调用回调函数对元素进行更简洁的筛选操作.

public dynamic class Array
extends Object

Array 类使您可以访问和处理索引数组。索引数组是一个对象,其属性由表示该属性在数组中位置的数字来标识。此数字称为索引。所有索引数组都从零开始,这意味着数 组中的第一个元素为 [0],第二个元素为 [1],依此类推。若要创建一个 Array 对象,请使用构造函数 new Array()。若要访问数组中的元素,请使用数组访问运算符 ([])。

您可以在数组元素中存储各种各样的数据类型,包括数字、字符串、对象,甚至是其它数组。您可以创建一个多维 数组,方法是创建一个索引数组,然后给它的每个元素分配不同的索引数组。这样的数组被视为是多维的,原因是它可用于表示表中的数据。

数组是松散的排列,意味着可能在索引位置 0 和索引位置 5 是同一个元素(数), 但是在那二者数值之间和索引位置中是无关的。 在这种情况下,元素在索引位置 1 直到 索引位置4 也是不明确的, 哪些是缺少元素, 数值和索引位置也是不明确的.

数组分配是按引用而不是按值进行的:当您将一个数组变量分配给另一个数组变量时,这两个变量都引用同一数组:

CODE:

var oneArray:Array = new Array("a", "b", "c");//初值化
var twoArray:Array = oneArray; // 转递数组.
twoArray[0] = "z";             //赋值twoArray[0].
trace(oneArray);               // 输出: z,b,c.


Array 类不应该用于创建关联数组,关联数组是不同的数据结构,它们包含命名元素而不是编号元素。您应该使用 Object 类创建关联数组(也称为 哈希)。虽然 ActionScript 允许您使用 Array 类创建关联数组,但您不能使用 Array 类的任何方法或属性。关键是,关联数组是 Object 类的实例,而每个键/值对由属性及属性的值表示。要将关联数组声明为 Object 数据类型还有另一个原因:您可以使用对象文本来填充关联数组(但只能在您声明它时)。

构造函数摘要

长度 : uint

方法摘要

1. Array(numElements:int = 0)
创建一个长度为 0 或更大的新数组,或者创建由一列指定的元素(这些元素可能具有不同的数据类型)填充的数组。

使用 Array() 创建下列各项之一:

空数组
具有特定长度,但其元素未定义值的数组
其元素具有特定值的数组
使用此函数类似于使用 Array 构造函数创建数组。

您可以传递一个数字 (numElements) 或者传递包含一个或多个不同类型的一列元素 (element0, element1, ... elementN)。

能够接受一种以上数据类型的参数以 Object 类型在签名中列出。

参数:
numElements:int(默认:0) [可选] - 一个指定数组中元素数量的正整数。您可以指定 numElements,也可以指定元素列表,但不能同时指定两者。

实例一:
创建一个长度为0的空数组

CODE:

package {
    import flash.display.Sprite;

    public class Array_Array extends Sprite {

        public function Array_Array() {
            var myArr:Array = new Array();
            trace(myArr.length); // 0
        }
    }
}


实例二:
创建一个长度为5的数组,0索引为字符串"one",并添加新元素--字符串"six"[需调用数组函数push()]

 
CODE:

package {
    import flash.display.Sprite;

    public class Array_Array_2 extends Sprite {

        public function Array_Array_2() {
            var myArr:Array = new Array(5);
            trace(myArr.length); // 5
            myArr[0] = "one";
            myArr.push("six");
            trace(myArr);         // one,,,,,six
            trace(myArr.length); // 6
        }
    }
}


2. Array(... values)
创建一列新数组,并直接赋值.
语法:public function Array(numElements:int = 0)

参数:
... values --从0索引直接赋值到更多索引
实列:

创建一个长度为3的新数组,并赋值--字符串"one","two","three"

CODE:

package {
    import flash.display.Sprite;

    public class Array_Array_3 extends Sprite {

        public function Array_Array_3() {
            var myArr:Array = new Array("one", "two", "three");
            trace(myArr.length); // 3
            trace(myArr);          // one,two,three
        }
    }
}


3. concat()
将参数中指定的元素与数组中的元素连接,并创建新的数组
as3.0语法: function concat(... args):Array

参数:
... args :可以是存储各种各样的数据类型,包括数字、字符串、对象,如果赋值为空,将复制原数组并创建新数组.

返回:数组

实例:
创建numbers数组,并赋值--1,2,3
创建letters数姐,并赋值--a,b,c
创建numbersAndLetters,并从Letters数组复制所有元素到numbers数组
创建lettersAndNumbers,并从numbers数组复制所有元素到Letters数组

CODE:

var numbers:Array = new Array(1, 2, 3);
var letters:Array = new Array("a", "b", "c");
var numbersAndLetters:Array = numbers.concat(letters);
var lettersAndNumbers:Array = letters.concat(numbers);

trace(numbers);       // 1,2,3
trace(letters);       // a,b,c
trace(numbersAndLetters); // 1,2,3,a,b,c
trace(lettersAndNumbers); // a,b,c,1,2,3


4.every() 方法[as3.0新增]

检测是否数组所有元素都满足 callback 函数方法指定的条件。
as3.0语法:function every(callback:Function, thisObject:* = null):Boolean


参数:
callback:Function --检测函数
thisObject:* (default = null) --判断条件

返回:布尔值

实例:

创建数组arr1和数组arr2并调检测用函数isNumeric

CODE:

isNumeric函数--检测是否全部为Number
    import flash.display.Sprite;
    public class Array_every extends Sprite {
        public function Array_every() {
            var arr1:Array = new Array(1, 2, 4);
            var res1:Boolean = arr1.every(isNumeric);
            trace("isNumeric:", res1); // true

            var arr2:Array = new Array(1, 2, "ham");
            var res2:Boolean = arr2.every(isNumeric);
            trace("isNumeric:", res2); // false
        }
        private function isNumeric(element:*, index:int, arr:Array):Boolean {
            return (element is Number);
        }
    }
}

4.filter 方法[as3.0新增]
as3.0语法:filter(callback:Function, thisObject:* = null):Array
根据 callback 方法指定的条件过滤数组,返回由符合条件的元素组成的新数组

参数:
callback:Function--检测函数
function callback(item:*, index:int, array:Array):void;
thisObject:* = null--判定条件

返回:数组

实例:

创建employees数组,并调用push函数添加元素(二维),使用

创建managers

CODE:

package {
    import flash.display.Sprite;
    public class Array_filter extends Sprite {
        public function Array_filter() {
            var employees:Array = new Array();//创建employees数组
            employees.push({name:"Employee 1", manager:false});//调用push函数添加二维元素
            employees.push({name:"Employee 2", manager:true});
            employees.push({name:"Employee 3", manager:false});
            trace("Employees:");
            employees.forEach(traceEmployee);//调用执行函数traceEmployee(?forEach是啥?看下面)
            
            var managers:Array = employees.filter(isManager);//调用挑选函数isManager
            trace("Managers:");
            managers.forEach(traceEmployee);//调用执行函数traceEmployee
        }
        private function isManager(element:*, index:int, arr:Array):Boolean {
            return (element.manager == true);//返回判断布尔值
        }
        private function traceEmployee(element:*, index:int, arr:Array):void {
            trace("\t" + element.name + ((element.manager) ? " (manager)" : ""));//判断manager是否为true,如果是输出空格
        }
    }
}

5. forEach方法[as3.0新增]
as3.0语法: forEach(callback:Function, thisObject:* = null):void
数组的每一个元素执行 callback 方法,不返回任何值
第二个参数 thisObject 是第一个参数 callback 的执行范围,即方法内部的 this ,一般不需指定callback 的参数也都是一样的

参数:
callback:Function--执行函数
function callback(item:*, index:int, array:Array):void;
thisObject:* = null--执行范围

实例一:

创建employees数组,并调用push函数添加元素[二维]
并执行函数traceEmployee

CODE:

package {
    import flash.display.Sprite;
    public class Array_forEach extends Sprite {
        public function Array_forEach() {
            var employees:Array = new Array();//创建数组
            employees.push({name:"Employee 1", manager:false});//调用push添加二维元素
            employees.push({name:"Employee 2", manager:true});
            employees.push({name:"Employee 3", manager:false});
            trace(employees);//输出数组
            employees.forEach(traceEmployee);//调用执行函数traceEmployee
        }
        private function traceEmployee(element:*, index:int, arr:Array):void {
            trace(element.name + " (" + element.manager + ")");//输出:name (manager)
        }
    }
}


实例二:

CODE:

package {
    import flash.display.Sprite;
    public class Array_forEach_2 extends Sprite {
        public function Array_forEach_2() {
            var employeeXML:XML = <employees>
                    <employee name="Steven" manager="false" />
                    <employee name="Bruce" manager="true" />
                    <employee name="Rob" manager="false" />
                </employees>;
            var employeesList:XMLList = employeeXML.employee;//读取节点
            var employeesArray:Array = new Array();//创建employeesArray数组
            for each (var tempXML:XML in employeesList) {
                employeesArray.push(tempXML);//调用push函数添加元素
            }
            employeesArray.sortOn("@name");//?sorton是啥,看下文
            employeesArray.forEach(traceEmployee);//调用执行函数traceEmployee
        }
        private function traceEmployee(element:*, index:Number, arr:Array):void {
            trace(element.@name + ((element.@manager == "true") ? " (manager)" : ""));//判断manager是否为true,为真输出name(manager)为否输出name
        }
    }
}


6.indexOf 方法 [as3.0新增]
as3.0语法:indexOf(searchElement:*, fromIndex:int = 0):int
查找数组元素,若存在返回元素索引位置,若不存在返回-1

参数:
searchElement:*--查找关键字
fromIndex:int = 0--查找开始索引位置(默认:0)
返回:数值

实例:

CODE:


package {
    import flash.display.Sprite;
    public class Array_indexOf extends Sprite {
        public function Array_indexOf() {
            var arr:Array = new Array(123,45,6789);//创建数组arr
            arr.push("123-45-6789");//添加数组元素(字符串)
            arr.push("987-65-4321");//添加数组元素(字符串)
            
            var index:int = arr.indexOf("123");//查寻字符串"123"
            trace(index); // -1
            
            var index2:int = arr.indexOf(123);//查寻123
            trace(index2); // 0
            
            var index2:int = arr.indexOf("123-45-6789");//查寻字符串"123-45-6789"
            trace(index2); // 0
        }
    }
}


7.join 方法
join(sep:*):String
将数组中的元素转换为字符串、在元素间插入指定的分隔符、连接这些元素然后返回结果字符串

参数:
sep:*--插入分隔符

返回:字符串

实例一:

CODE:

var myArr:Array = new Array("one", "two", "three");//不要告诉我看不懂...
var myStr:String = myArr.join(" and ");
trace(myArr); // one,two,three
trace(myStr); // one and two and three


实例二:

CODE:

var phoneString:String = "(888) 867-5309";

var specialChars:Array = new Array("(", ")", "-", " ");
var myStr:String = phoneString;

var ln:uint = specialChars.length;//定义数组specialChars长度
for(var i:uint; i < ln; i++) {
    myStr = myStr.split(specialChars[i]).join("");//分割字符串phoneString并重建数组,再调用join重组字符口串
}

var phoneNumber:Number = new Number(myStr);

trace(phoneString); // (888) 867-5309
trace(phoneNumber); // 8888675309


8. lastIndexOf 方法 [as3.0新增函数]

as3.0语法:lastIndexOf(searchElement:*, fromIndex:int = 0x7fffffff):int
从最后一个索引位置向前查寻数组元素,若存在返回元素索引位置,若不存在返回-1

参数:
searchElement:*--查寻关键字
fromIndex:int = 0x7fffffff--索引开始位置(默认:0x7fffffff)

返回:数值

实例:

CODE:

package {
    import flash.display.Sprite;
    public class Array_lastIndexOf extends Sprite {
        public function Array_lastIndexOf() {
            var arr:Array = new Array(123,45,6789,123,984,323,123,32);
            
            var index:int = arr.indexOf(123);
            trace(index); // 0
            
            var index2:int = arr.lastIndexOf(123);
            trace(index2); // 6
        }
    }
}

9.map() 方法 [as3.0新增函数]
as3.0语法:map(callback:Function, thisObject:* = null):Array   
数组的每一个元素执行 callback 方法,返回新数组
参数:
callback:Function--执行函数
function callback(item:*, index:int, array:Array):void;

thisObject:* = null--执行范围

返回:数组

实例:

CODE:

package {
    import flash.display.Sprite;
    public class Array_map extends Sprite {
        public function Array_map() {
            var arr:Array = new Array("one", "two", "Three");
            trace(arr); // one,two,Three

            var upperArr:Array = arr.map(toUpper);//创建upperArr数组并调用执行toUpper函数
            trace(upperArr); // ONE,TWO,THREE
        }
        private function toUpper(element:*, index:int, arr:Array):String {
            return String(element).toUpperCase();//小写转大字
        }
    }
}


10.pop 方法
as3.0语法:function pop():Object
删除数组中最后一个元素,并返回该元素的值。

返回:对象-- 指定的数组中最后一个元素的值。

11.push 方法
as3.0语法: function push(... args):uint
将一个或多个元素添加到数组的结尾,并返回该数组的新长度。

参数:
... args-- 要追加到数组中的一个或多个值。


返回:新数组长度

实例一:

CODE:

var letters:Array = new Array();

letters.push("a");
letters.push("b");
letters.push("c");

trace(letters.toString()); // a,b,c


实例二:

CODE:

var letters:Array = new Array("a");
var count:uint = letters.push("b", "c");

trace(letters); // a,b,c
trace(count);   // 3


12.reverse 方法
as3.0语法: function reverse():Array
在当前位置倒转数组

返回:数组

实例:

CODE:

var letters:Array = new Array("a", "b", "c");
trace(letters); // a,b,c
letters.reverse();
trace(letters); // c,b,a

13.shift 方法
as3.0语法: function shift():Object
删除数组中第一个元素,并返回该元素

返回:对象

实例:

CODE:

var letters:Array = new Array("a", "b", "c");
var firstLetter:String = letters.shift();
trace(letters);     // b,c
trace(firstLetter); // a


14.slice 方法
as3.0语法:function slice(startIndex:int = 0, endIndex:int = -1):

返回由原始数组中某一范围的元素构成的新数组,而不修改原始数组。返回的数组包括 startIndex 元素以及从其开始到 endIndex 元素(但不包括该元素)的所有元素。

如果您没有传递任何参数,则创建原始数组的一个副本。


参数:
startIndex:int = 0--指定片段起始点索引的数字。如果 start 是负数,则起始点从数组的结尾开始,其中 -1 指的是最后一个元素
endIndex:int = -1--指定片段终点索引的数字。如果省略此参数,则片段包括数组中从开头到结尾的所有元素。如果 end 是负数,则终点从数组的结尾指定,其中 -1 指的是最后一个元素。

返回:数组

实例一:

CODE:

var letters:Array = new Array("a", "b", "c", "d", "e", "f");
var someLetters:Array = letters.slice(1,3);

trace(letters);     // a,b,c,d,e,f
trace(someLetters); // b,c


实例二:

CODE:

var letters:Array = new Array("a", "b", "c", "d", "e", "f");
var someLetters:Array = letters.slice(2);

trace(letters);     // a,b,c,d,e,f
trace(someLetters); // c,d,e,f


实例三:

CODE:

var letters:Array = new Array("a", "b", "c", "d", "e", "f");
var someLetters:Array = letters.slice(-2);

trace(letters);     // a,b,c,d,e,f
trace(someLetters); // e,f

15.sort 方法[as3.0新增函数]
as3.0语法:some(callback:Function, thisObject:* = null):Boolean  
检测数组中是否有元素满足 callback 方法指定的条件。
参数:
callback:Function--执行函数
thisObject:* = null--执行范围

返回:布尔值

实例:

CODE:

package {
    import flash.display.Sprite;
    public class Array_some extends Sprite {
        public function Array_some() {
            var arr:Array = new Array();
            arr[0] = "one";
            arr[1] = "two";
            arr[3] = "four";
            var isUndef:Boolean = arr.some(isUndefined);//调用执行函数isUndefined
            if (isUndef) {
                trace("array contains undefined values: " + arr);
            } else {
                trace("array contains no undefined values.");
            }
        }
        private function isUndefined(element:*, index:int, arr:Array):Boolean {
            return (element == undefined);
        }
    }
}


16.sort 方法
as3.0语法:function sort(... args):Array

对数组中的元素进行排序。Flash 根据 Unicode 值排序。(ASCII 是 Unicode 的一个子集。)

默认情况下,Array.sort() 按下面的列表中的说明进行排序:

排序区分大小写(Z 优先于 a)。
按升序排序(a 优先于 b)。
修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
数值字段按字符串方式进行排序,因此 100 优先于 99,因为 "1" 的字符串值比 "9" 的低。
如 果您想通过使用不同于默认设置的设置来对数组进行排序,可以使用 options 参数的条目中描述的排序选项之一,或者,也可以创建自己的自定义函数来进行排序。如果您创建自定义函数,则可以通过调用 sort() 方法来使用它,将您的自定义函数的名称用作第一个参数 (compareFunction)。

参数:
... args-- 一个用来确定数组中元素排序顺序的比较函数。给定元素 A 和 B,compareFunction 的结果可具有以下三个值之一:

-1,如果 A 应在排序后的序列中出现在 B 之前
0,如果 A 等于 B
1,如果 A 应在排序后的序列中出现在 B 之后
options:Number [可选] - 所定义常数的一个或多个数字或名称,相互之间由 |(按位"或")运算符隔开,它们将排序的默认行为更改为其它行为。options 参数可接受以下值:

Array.CASEINSENSITIVE 或 1
Array.DESCENDING 或 2
Array.UNIQUESORT 或 4
Array.RETURNINDEXEDARRAY 或 8
Array.NUMERIC 或 16
有关此参数的更多信息,请参见 Array.sortOn() 方法。

注意: Array.sort() 是在 ECMA-262 中定义的,但 Flash Player 7 中引入的数组排序选项是对 ECMA-262 规范的特定于 Flash 的扩展。


实例一:

CODE:

var vegetables:Array = new Array("spinach",
                 "green pepper",
                 "cilantro",
                 "onion",
                 "avocado");

trace(vegetables); // spinach,green pepper,cilantro,onion,avocado
vegetables.sort();
trace(vegetables); // avocado,cilantro,green pepper,onion,spinach


实例二:

CODE:

var vegetables:Array = new Array("spinach",
                 "green pepper",
                 "Cilantro",
                 "Onion",
                 "Avocado");

vegetables.sort();
trace(vegetables); // Avocado,Cilantro,Onion,green pepper,spinach
vegetables.sort(Array.CASEINSENSITIVE);
trace(vegetables); // Avocado,Cilantro,green pepper,Onion,spinach


实例三:

CODE:

var vegetables:Array = new Array();
vegetables.push(new Vegetable("lettuce", 1.49));
vegetables.push(new Vegetable("spinach", 1.89));
vegetables.push(new Vegetable("asparagus", 3.99));
vegetables.push(new Vegetable("celery", 1.29));
vegetables.push(new Vegetable("squash", 1.44));

trace(vegetables);
// lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44

vegetables.sort();

trace(vegetables);
// asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44

//The following code defines the Vegetable class
class Vegetable {
    private var name:String;
    private var price:Number;

    public function Vegetable(name:String, price:Number) {
        this.name = name;
        this.price = price;
    }

    public function toString():String {
        return " " + name + ":" + price;
    }
}


实例四:

CODE:

var vegetables:Array = new Array();
vegetables.push(new Vegetable("lettuce", 1.49));
vegetables.push(new Vegetable("spinach", 1.89));
vegetables.push(new Vegetable("asparagus", 3.99));
vegetables.push(new Vegetable("celery", 1.29));
vegetables.push(new Vegetable("squash", 1.44));

trace(vegetables);
// lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44

vegetables.sort(sortOnPrice);

trace(vegetables);
// celery:1.29, squash:1.44, lettuce:1.49, spinach:1.89, asparagus:3.99

function sortOnPrice(a:Vegetable, b:Vegetable):Number {
    var aPrice:Number = a.getPrice();
    var bPrice:Number = b.getPrice();

    if(aPrice > bPrice) {
        return 1;
    } else if(aPrice < bPrice) {
        return -1;
    } else  {
        //aPrice == bPrice
        return 0;
    }
}

// The following code defines the Vegetable class and should be in a separate package.
class Vegetable {
    private var name:String;
    private var price:Number;

    public function Vegetable(name:String, price:Number) {
        this.name = name;
        this.price = price;
    }

    public function getPrice():Number {
        return price;
    }

    public function toString():String {
        return " " + name + ":" + price;
    }
}


16.sortOn 方法
as3.0语法:function sortOn(fieldName:Object, options:Object = null):Array

根据数组中的一个或多个字段对数组中的元素进行排序。数组应具有下列特性:

该数组是索引数组,不是关联数组。
该数组的每个元素都包含一个具有一个或多个属性的对象。
所有这些对象都至少有一个公用属性,该属性的值可用于对该数组进行排序。这样的属性称为 field。
如 果您传递多个 fieldName 参数,则第一个字段表示主排序字段,第二个字段表示下一个排序字段,依此类推。Flash 根据 Unicode 值排序。(ASCII 是 Unicode 的一个子集。)如果所比较的两个元素中的任何一个不包含在 fieldName 参数中指定的字段,则认为该字段为 undefined,并且在排序后的数组中不按任何特定顺序连续放置这些元素。

默认情况下,Array.sortOn() 按以下方式进行排序:

排序区分大小写(Z 优先于 a)。
按升序排序(a 优先于 b)。
修改该数组以反映排序顺序;在排序后的数组中不按任何特定顺序连续放置具有相同排序字段的多个元素。
数值字段按字符串方式进行排序,因此 100 优先于 99,因为 "1" 的字符串值比 "9" 的低。

Flash Player 7 添加了 options 参数,您可以使用该参数覆盖默认排序行为。若要对简单数组(例如,仅具有一个字段的数组)进行排序,或要指定一种 options 参数不支持的排序顺序,请使用 Array.sort()。

若要传递多个标志,请使用按位"或"(|) 运算符分隔它们:

my_array.sortOn(someFieldName, Array.DESCENDING | Array.NUMERIC);

Flash Player 8 添加了按多个字段进行排序时为每个字段指定不同的排序选项的功能。在 Flash Player 8 中,options 参数接受一组排序选项,以便每个排序选项对应于 fieldName 参数中的一个排序字段。下面的示例使用降序排序对主排序字段 a 排序,使用数字排序对第二个排序字段 b 排序,使用不区分大小写的排序对第三个排序字段 c 排序:

Array.sortOn (["a", "b", "c"], [Array.DESCENDING, Array.NUMERIC, Array.CASEINSENSITIVE]);

注意:fieldName 和 options 数组必须具有相同数量的元素;否则,将忽略 options 数组。此外,Array.UNIQUESORT 和 Array.RETURNINDEXEDARRAY 选项只能用作数组中的第一个元素;否则,将忽略它们。


参数:
fieldName:Object--一个标识要用作排序值的字段的字符串,或一个数组,其中的第一个元素表示主排序字段,第二个元素表示第二排序字段,依此类推。
options:Object = null-- 所定义常数的一个或多个数字或名称,相互之间由 bitwise or (|) 运算符隔开,它们可以更改排序行为。options 参数可接受以下值:

Array.CASEINSENSITIVE or 1
Array.DESCENDING or 2
Array.UNIQUESORT or 4
Array.RETURNINDEXEDARRAY or 8
Array.NUMERIC or 16
如果您使用标志的字符串形式(例如,DESCENDING),而不是数字形式 (2),则启用代码提示
返回:数组

实例一:

CODE:

var vegetables:Array = new Array();
vegetables.push(new Vegetable("lettuce", 1.49));
vegetables.push(new Vegetable("spinach", 1.89));
vegetables.push(new Vegetable("asparagus", 3.99));
vegetables.push(new Vegetable("celery", 1.29));
vegetables.push(new Vegetable("squash", 1.44));

trace(vegetables);
// lettuce:1.49, spinach:1.89, asparagus:3.99, celery:1.29, squash:1.44

vegetables.sortOn("name");
trace(vegetables);
// asparagus:3.99, celery:1.29, lettuce:1.49, spinach:1.89, squash:1.44

vegetables.sortOn("price", Array.NUMERIC | Array.DESCENDING);
trace(vegetables);
// asparagus:3.99, spinach:1.89, lettuce:1.49, squash:1.44, celery:1.29

class Vegetable {
    public var name:String;
    public var price:Number;

    public function Vegetable(name:String, price:Number) {
        this.name = name;
        this.price = price;
    }

    public function toString():String {
        return " " + name + ":" + price;
    }
}

实例二:

CODE:

var records:Array = new Array();
records.push({name:"john", city:"omaha", zip:68144});
records.push({name:"john", city:"kansas city", zip:72345});
records.push({name:"bob", city:"omaha", zip:94010});

for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// john, omaha
// john, kansas city
// bob, omaha

trace("records.sortOn('name', 'city');");
records.sortOn(["name", "city"]);
for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// bob, omaha
// john, kansas city
// john, omaha

trace("records.sortOn('city', 'name');");
records.sortOn(["city", "name"]);
for(var i:uint = 0; i < records.length; i++) {
    trace(records[i].name + ", " + records[i].city);
}
// Results:
// john, kansas city
// bob, omaha
// john, omaha


实例三:

CODE:

class User {
    public var name:String;
    public var age:Number;
    public function User(name:String, age:uint) {
        this.name = name;
        this.age = age;
    }

    public function toString():String {
        return this.name + ":" + this.age;
    }
}

var users:Array = new Array();
users.push(new User("Bob", 3));
users.push(new User("barb", 35));
users.push(new User("abcd", 3));
users.push(new User("catchy", 4));

trace(users); // Bob:3,barb:35,abcd:3,catchy:4

users.sortOn("name");
trace(users); // Bob:3,abcd:3,barb:35,catchy:4

users.sortOn("name", Array.CASEINSENSITIVE);
trace(users); // abcd:3,barb:35,Bob:3,catchy:4

users.sortOn("name", Array.CASEINSENSITIVE | Array.DESCENDING);
trace(users); // catchy:4,Bob:3,barb:35,abcd:3

users.sortOn("age");
trace(users); // abcd:3,Bob:3,barb:35,catchy:4

users.sortOn("age", Array.NUMERIC);
trace(users); // Bob:3,abcd:3,catchy:4,barb:35

users.sortOn("age", Array.DESCENDING | Array.NUMERIC);
trace(users); // barb:35,catchy:4,Bob:3,abcd:3

var indices:Array = users.sortOn("age", Array.NUMERIC | Array.RETURNINDEXEDARRAY);
var index:uint;
for(var i:uint = 0; i < indices.length; i++) {
    index = indices[i];
    trace(users[index].name, ": " + users[index].age);
}

// Results:
// Bob : 3
// abcd : 3
// catchy : 4
// barb : 35


17.splice  方法
as3.0语法:function splice(startIndex:int, deleteCount:uint, ... values):Array

给数组添加元素以及从数组中删除元素。此方法会修改数组但不制作副本。

参数:
startIndex:int--一个整数,它指定插入或删除动作开始处的数组中元素的索引。您可以指定一个负整数来指定相对于数组结尾的位置(例如,-1 是数组的最后一个元素
deleteCount: uint--一个整数,它指定要删除的元素数量。该数量包括 startIndex 参数中指定的元素。如果没有为 deleteCount 参数指定值,则该方法将删除从 startIndex 元素到数组中最后一个元素之间的所有值。如果该参数的值为 0,则不删除任何元素。

... values--指定要在 startIndex 参数中指定的插入点处插入到数组中的值

返回:数组

实例:

CODE:

var vegetables:Array = new Array("spinach",
                 "green pepper",
                 "cilantro",
                 "onion",
                 "avocado");

var spliced:Array = vegetables.splice(2, 2);
trace(vegetables); // spinach,green pepper,avocado
trace(spliced);    // cilantro,onion

vegetables.splice(1, 0, spliced);
trace(vegetables); // spinach,cilantro,onion,green pepper,avocado


18.toLocaleString  方法 [as3.0新增函数]
as3.0语法:public function toLocaleString():String
类似toString(),与它区别?研究中...,

返回:字符串


19.toString 方法

语法:toString():String
返回一个字符串值,该值表示所指定的 Array 对象中的元素。数组中的每一个元素(从索引 0 开始到最高索引结束)均会转换为一个连接字符串,并以逗号分隔。若要指定自定义的分隔符,请使用 Array.join() 方法。

返回:字符串

实例:

CODE:

var vegetables:Array = new Array();
vegetables.push(1);
vegetables.push(2);
vegetables.push(3);
vegetables.push(4);
vegetables.push(5);
var vegnums:String = vegetables.toString();
trace(vegnums+",6");
// 1,2,3,4,5,6

20.unshift  方法
as3.0语法:function unshift(... args):uint

将一个或多个元素添加到数组的开头,并返回该数组的新长度.
参数:
... args--一个或多个要插入到数组开头的数字、元素或变量。

返回

返回:数值

实例:

CODE:

var names:Array = new Array();
names.push("Bill");
names.push("Jeff");

trace(names); // Bill,Jeff

names.unshift("Alfred");
names.unshift("Kyle");

trace(names); // Kyle,Alfred,Bill,Jeff


实例:

CODE:

var letters:Array = new Array("a", "b", "c");
trace(letters); // a,b,c
var letter:String = letters.pop();
trace(letters); // a,b
trace(letter);     // c

April 28

简易涂鸦

  1. //通用函数,设置RGB值  
  2. function mySetRGB(r:Number, g:Number, b:Number):Number {  
  3. return r << 16 | g << 8 | b;  
  4. }  
  5. //通用函数,规整颜色数值  
  6. function colorToStr(_color:Number):String {  
  7. var _str:String = _color.toString(16).toUpperCase();  
  8. while (_str.length<6) {  
  9. _str = "0"+_str;  
  10. }  
  11. return _str;  
  12. }  
  13. //调色板函数  
  14. function setTempColor(_color:Number, _mc:MovieClip) {  
  15. (new Color(_mc.show_color_mc)).setRGB(_color);  
  16. _mc.color_str.text = colorToStr(_color);  
  17. }  
  18. //调色板函数  
  19. function setNowColor(_color:Number, _mc:MovieClip) {  
  20. (new Color(_mc.show_color_mc)).setRGB(_color);  
  21. _mc.value = _color;  
  22. }  
  23. ////设置调色板的鼠标响应  
  24. function setColorMouseFun(color_mc:MovieClip) {  
  25. color_mc.useHandCursor = false;  
  26. color_mc.onRollOver = function() {  
  27. this.swapDepths(this._parent.getNextHighestDepth());  
  28. (new Color(this.border_mc)).setRGB(0xFFFFFF);  
  29. setTempColor(this.color_num, this._parent);  
  30. };  
  31. color_mc.onRollOut = color_mc.onReleaseOutside=function () {  
  32. (new Color(this.border_mc)).setRGB(0);  
  33. };  
  34. color_mc.onRelease = function() {  
  35. setNowColor(this.color_num, this._parent.parent);  
  36. this._parent.fun();  
  37. this._parent.removeMovieClip();  
  38. };  
  39. }  
  40. //生成调色板(_mc:宿主,now_color:初始颜色,d_width:色块宽度,fun:结束时调用的函数)  
  41. function crtColorBoard(_mc:MovieClip, now_color:Number, d_width:Number, fun:Function) {  
  42. _mc.fun = fun;  
  43. var color_array:Array = new Array(0, 0x333333, 0x666666, 0x999999, 0xCCCCCC, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF);  
  44. for (i=0; i<12; i++) {  
  45. var color_mc:MovieClip = _mc.attachMovie("color_dot", "dot"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());  
  46. color_mc._width = color_mc._height=d_width;  
  47. color_mc._x = 0;  
  48. color_mc._y = i*d_width;  
  49. color_mc.color_num = color_array[i];  
  50. (new Color(color_mc.dot)).setRGB(color_mc.color_num);  
  51. setColorMouseFun(color_mc);  
  52. }  
  53. for (var R = 0; R<6; R++) {  
  54. for (var G = 0; G<6; G++) {  
  55. for (var B = 0; B<6; B++) {  
  56. var color_mc:MovieClip = _mc.attachMovie("color_dot", "dot"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());  
  57. color_mc._width = color_mc._height=d_width;  
  58. color_mc._x = B*d_width+R%3*6*d_width+d_width;  
  59. color_mc._y = G*d_width+Math.floor(R/3)*6*d_width;  
  60. color_mc.color_num = mySetRGB(0x33*R, 0x33*B, 0x33*G);  
  61. (new Color(color_mc.dot)).setRGB(color_mc.color_num);  
  62. setColorMouseFun(color_mc);  
  63. }  
  64. }  
  65. }  
  66. setTempColor(now_color, _mc);  
  67. //设置颜色手动输入,回车结束  
  68. _mc.color_str.onSetFocus = function() {  
  69. this.text = "";  
  70. this.onChanged = function() {  
  71. (new Color(_mc.show_color_mc)).setRGB(parseInt(this.text, 16));  
  72. };  
  73. _mc.onEnterFrame = function() {  
  74. if (Key.isDown(13)) {  
  75. setNowColor(parseInt(this.color_str.text, 16), this.parent);  
  76. this.fun();  
  77. this.removeMovieClip();  
  78. }  
  79. };  
  80. };  
  81. _mc.color_str.onKillFocus = function() {  
  82. delete this.onChanged;  
  83. delete _mc.onEnterFrame;  
  84. };  
  85. }  
  86. //初始化滑杆(_mc:宿主,value:初始值, min_num:最小值, max_num:最大值,len:滑杆长度,is_int:是否取整数)  
  87. function initBar(_mc:MovieClip, value:Number, min_num:Number, max_num:Number, len:Number, is_int:Boolean) {  
  88. _mc.line._width = len;  
  89. _mc.value = value;  
  90. _mc. min_num = min_num;  
  91. _mc. max_num = max_num;  
  92. _mc.depth = ( max_num- min_num)/len;  
  93. _mc.is_int = is_int;  
  94. _mc.dot._x = (value- min_num)/_mc.depth;  
  95. _mc.dot._y = 0;  
  96. _mc.dot.useHandCursor = false;  
  97. _mc.dot.onPress = function() {  
  98. this.startDrag(false, 0, 0, len, 0);  
  99. this.onMouseMove = function() {  
  100. this._parent.value = this._parent. min_num+this._x*this._parent.depth;  
  101. if (this._parent.is_int) {  
  102. this._parent.value = Math.round(this._parent.value);  
  103. }  
  104. updateAfterEvent();  
  105. };  
  106. };  
  107. _mc.dot.onRelease = _mc.dot.onReleaseOutside=function () {  
  108. this.stopDrag();  
  109. delete this.onMouseMove;  
  110. };  
  111. }  
  112. //开始画线  
  113. function crtNewLine(width:Number, color_num:Number, alpha:Number):MovieClip {  
  114. var line:MovieClip = canvas.createEmptyMovieClip("line"+canvas.getNextHighestDepth(), canvas.getNextHighestDepth());  
  115. line.lineStyle(width, color_num, alpha);  
  116. line.moveTo(line._xmouse, line._ymouse);  
  117. return line;  
  118. }  
  119. //设置背景色  
  120. function setBG() {  
  121. (new Color(canvas.bg)).setRGB(bg_color_mc.value);  
  122. }  
  123. //清除_mc中所有_name以_str开始的MC  
  124. function clearAll(_mc:MovieClip, _str:String) {  
  125. var str_len:Number = _str.length;  
  126. for (i in _mc) {  
  127. if (_mc[i]._name.substr(0, str_len) == _str) {  
  128. _mc[i].removeMovieClip();  
  129. }  
  130. }  
  131. }  
  132. //回放  
  133. function replay(_mc:MovieClip, _array:Array, speed:Number) {  
  134. if (_array.length) {  
  135. var line = _array.shift();  
  136. var current_mc:MovieClip = _mc.createEmptyMovieClip("line"+_mc.getNextHighestDepth(), _mc.getNextHighestDepth());  
  137. var style:Object = line.shift();  
  138. var pos:Object = line.shift();  
  139. current_mc.lineStyle(style.width, style.color, style.alpha);  
  140. current_mc.moveTo(pos.x, pos.y);  
  141. onEnterFrame = function () {  
  142. drawALine(current_mc, line, speed);  
  143. };  
  144. }  
  145. }  
  146. function drawALine(_mc:MovieClip, _array:Array, speed:Number) {  
  147. for (var i = 0; iif (_array.length == 0) {  
  148. delete onEnterFrame;  
  149. replay(canvas, replay_array, speed);  
  150. break;  
  151. }  
  152. var pos:Object = _array.shift();  
  153. _mc.lineTo(pos.x, pos.y);  
  154. }  
  155. }  
  156. //拷贝记录数组  
  157. function copyArray(_array):Array {  
  158. var out_array = new Array();  
  159. for (var i = 0; i<_array.length; i++) {  
  160. out_array[i] = new Array();  
  161. for (var j = 0; j<_array[i].length; j++) {  
  162. out_array[i][j] = new Object();  
  163. for (name in _array[i][j]) {  
  164. out_array[i][j][name] = _array[i][j][name];  
  165. }  
  166. }  
  167. }  
  168. return out_array;  
  169. }  
  170. //main  
  171. var width_num:Number = 2;  
  172. var alpha_num:Number = 80;  
  173. var color_num:Number = 0x000000;  
  174. var bg_color_num:Number = 0xFFFFFF;  
  175. var replay_speed:Number = 5;  
  176. setNowColor(color_num, line_color_mc);  
  177. setNowColor(bg_color_num, bg_color_mc);  
  178. initBar(width_bar, width_num, 0, 50, 100, true);  
  179. initBar(alpha_bar, alpha_num, 0, 100, 100, true);  
  180. initBar(speed_bar, replay_speed, 1, 30, 100, true);  
  181. line_color_mc.onRelease = function() {  
  182. attachMovie("color_board", "color_board", 10);  
  183. color_board._x = this._x;  
  184. color_board._y = this._y+50;  
  185. color_board.parent = this;  
  186. crtColorBoard(color_board, this.value, 10);  
  187. };  
  188. bg_color_mc.onRelease = function() {  
  189. attachMovie("color_board", "color_board", 10);  
  190. color_board._x = this._x;  
  191. color_board._y = this._y+50;  
  192. color_board.parent = this;  
  193. crtColorBoard(color_board, this.value, 10, setBG);  
  194. };  
  195. setBG();  
  196. //回放数组  
  197. var history_array:Array = new Array();  
  198. //SO  
  199. var his_so:SharedObject = SharedObject.getLocal("cg001_canvas", "/");  
  200. if (!his_so.data._array) {  
  201. his_so.data._array = history_array;  
  202. } else {  
  203. history_array = his_so.data._array;  
  204. replay_array = copyArray(history_array);  
  205. replay(canvas, replay_array, speed_bar.value);  
  206. }  
  207. //canvas交互  
  208. canvas.setMask(canvas_mask);  
  209. canvas.useHandCursor = false;  
  210. canvas.onPress = function() {  
  211. var current_mc:MovieClip = canvas.createEmptyMovieClip("line"+canvas.getNextHighestDepth(), canvas.getNextHighestDepth());  
  212. current_mc.lineStyle(width_bar.value, line_color_mc.value, alpha_bar.value);  
  213. current_mc.moveTo(this._xmouse, this._ymouse);  
  214. //  
  215. history_array.push(new Array({width:Number=width_bar.value, color:Number=line_color_mc.value, alpha:Number=alpha_bar.value},  
  216. {x:Number=this._xmouse, y:Number=this._ymouse}));  
  217. current_array = history_array.length-1;  
  218. //  
  219. this.onMouseMove = function() {  
  220. current_mc.lineTo(this._xmouse, this._ymouse);  
  221. history_array[current_array].push({x:Number=this._xmouse, y:Number=this._ymouse});  
  222. updateAfterEvent();  
  223. };  
  224. };  
  225. canvas.onRelease = canvas.onReleaseOutside=function () {  
  226. his_so.flush();  
  227. delete this.onMouseMove;  
  228. };  
  229. //clear btn  
  230. clear_btn.onRelease = function() {  
  231. clearAll(canvas, "line");  
  232. history_array = new Array();  
  233. replay_array = new Array();  
  234. his_so.data._array = history_array;  
  235. };  
  236. replay_btn.onRelease = function() {  
  237. clearAll(canvas, "line");  
  238. replay_array = copyArray(history_array);  
  239. replay(canvas, replay_array, speed_bar.value);  
  240. };