尝试用AS3做一个简单的计数器。先来看看最后的效果:(查看类代码)
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
initMc();
}
AS3里新加了很多的常量来代替字符串。这给我们带来了很大的方便。比如要限制影片的缩放模式为固定尺寸,AS2时的代码为
值是一个字符串,在输入的时候是没有代码提示的,很容易输错(我经常是到帮助文档里把字符串复制过来)。而在AS3里的代码为
原来的字符串 “noScale” 由常量 StageScaleMode.NO_SCALE 代替。这样可以使用代码提示自动完成,有效避免了因为输错而造成的程序bug(而且很方便
)。同样的字符串常量还有一些事件类型比如 MouseEvent.CLICK 代替”click” 等等。
showTxt = new TextField();
addShow(showTxt,10,10,310,20);
addLabel(setDelayLabel,10,40,"delay:");
//...other code
}
添加文本框和按钮。注意,需要再次引用的文本框必须显式初始化,否则在其他地方引用此变量将返回 null 。
txt = new TextField();
txt.x = x;
txt.y = y;
txt.text = text;
addChild(txt);
}
AS3里所有的东西都是 new 出来的。仅仅 new 出来还不行,必须使用 addChild() 把它添加到显示列表里。
mc.mouseChildren = false;
mc.graphics.beginFill(0x000000,0.3);
mc.graphics.drawRect(0,0,w,h);
mc.buttonMode = true;
mc.addEventListener(MouseEvent.CLICK,clickHanlder);
addChild(mc);
//
txt = new TextField();
txt.name = "btnText";
mc.addChild(txt);
}
在AS3里想要 mc 成为一个按钮必须设置
这时看到鼠标经过mc时并没有变成手形,原因在最后一行,把 txt 添加到了 mc 里用来显示按钮文字,以致鼠标事件的目标对象为txt而不是期望的mc。为了解决这个问题需要加上一句
以保证mc为鼠标事件的目标对象(target objects)。
AS3里所有的可见对象都是DisplayObject的子类,而DisplayObject是EventDispatcher的子类
也就是说所有的可见对象都可以直接addEventListener。
这里用常量 MouseEvent.CLICK 代替了事件类型 “click” 。此类常量以后不再赘述。
mc.graphics.drawRect(0,0,w,h);
AS3里所有的绘图方法都放在了 Graphics 里。Sprite的graphics属性就是一个Graphics。除了基本的 beginFill ,beginBitmapFill 之类,又增加了新的 drawCircle 、drawEllipse、drawRect 等方法,再也不用没完没了地 moveTo 、lineTo 了。
//...code here
}
下面是主要的内容了:Timer。
var repeatCount:uint = setRepeatCountTxt.text;
if(timer == null){
timer = new Timer(delay,repeatCount);
}
uint是AS3新加的数据类型,表示32位的正整数(int 表示32位有符号的整数)。Timer的构造函数接受两个参数,delay 是 “timer” 事件延迟的毫秒数,repeatCount 是循环的次数,默认为0,即一直循环下去直到 stop 或者 reset 。
timer.addEventListener(TimerEvent.TIMER_COMPLETE,timerCompleteHandler);
timer广播两个事件,每隔 delay 指定的毫秒广播一次 “timer” 事件,循环repeatCount次之后广播 “timerComplete” 事件。
startBtn.getChildByName("btnText").text = " stop ";
timer 在 start 之后开始执行,此时 running 属性为 true 。把 startBtn 设置为 “stop”,注意AS3是拿不到startBtn的child的,因为 Sprite 不是动态类,无法声明它的child。这时候想要拿到startBtn内的文本框就要使用 getChildByName 方法。当然要先给child一个name:
txt.name = "btnText";
最后是 stop 和 reset 的区别:reset 在 stop 之后把 currentCount 属性设为 0 。可以通过 最后编译的swf 体会一下。
rar 4.83K


顶一个先
![[still_dreaming]](http://eidiot.net/wp-content/plugins/smilies-themer/JBIG/still_dreaming.gif)
很好!楼主的代码有个地方少写了两句话,
if( timer.delay != delay || timer.repeatCount != repeatCount ){
timer = new Timer(delay, repeatCount);
//下面两句也要,要不然新的计时器不响应事件
timer.addEventListener( TimerEvent.TIMER, timerHandler);
timer.addEventListener( TimerEvent.TIMER_COMPLETE, timerCompleteHandler); }
今天按照您的教程进行了制作,始终得不到和下载源文件一样的效果,提示这样的错误:
1067: Implicit coercion of a value of type String to an unrelated type uint.
1067: Implicit coercion of a value of type String to an unrelated type uint.
1119: Access of possibly undefined property text through a reference with static type flash.display:DisplayObject.
(第3 个错误 有3 个,共五个),我用您的 .fla 就可以,用我自己的就有这样的错误。
文档类也是一样的,实在是奇怪,(另外:看别人的例子 代码多的时候,也发生过这样的情况);
什么原因呢?请帮忙解答一下,谢谢!
学习了…很好很详细
谢谢了
出错了哦
1119: 访问可能未定义的属性 text (通过 static 类型 flash.display:DisplayObject 引用)。
是什么原因呢 ?