主题:  从一个时钟程序看flash5的对象

手工感情

职务:普通成员
等级:3
金币:10.0
发贴:556
注册:2001/1/3 2:50:20
#12001/1/28 21:00:44
flash5一经推出,立即引起各方面专业人士的关注。他包含了功能强大的action,将其功能提升至网站应运程式发展工具的层次。最重要的,它是号称面向对象的。
那么什么是面向对象呢?这里先不解释面向对象编程的概念,来看看在flash5中怎样做一个时钟。
我们先来定义这个时钟的功能,很简单,只要它有三个指针,以24小时制显示数字,并且能够按照你系统中的时间准时运行就可以了。至于这个时钟是否漂亮,那就需要读者发挥自己的想象力,而不是这篇教程所要表述的内容了。
那么好,let's go!
  第一步,我们先来做三个Dynamic text(动态文本框),将他们的Variable(变量)分别设置为hour,minute,second;因为我们需要他们进行时间的输出显示。
  第二步,开始编写action(第一帧):
      //第一段: 声明now为一个Date对象。获取当前的时,分,秒。
      now = new Date();             
      hour = now.getHours();
      minute = now.getMinutes();
      second = now.getSeconds();
      // 第二段:当数值小于10时,前位加0
      if (second<10) {
      second = "0" add second;
      }
      if (minute<10) {
      minute = "0" add minute;
      }
      if (hour<10) {
      hour = "0" add hour;
      }
  注意,这里我提到了now是一个对象,以“now = new Date()"这种格式进行申明。那么我们就从这里开始接触flash5中的对象。用alt+Ctrl+A打开action面板,会看见右边部分有一个Objects的下拉菜单,flash5中所有的对象基本上都集成在这里。在这个action中我们就用到了其中的Date对象,Date对象能够使你获得相对与国际标准时间(即格林威治标准时间,UTC—Universal Coordinated Time)或者是flash播放器正运行的操作系统的时间和日期。
要了解对象起何作用,可用电视机打一个比方,一个电视机有很多内部部件:显象管,集成电路,信号接收器等等。但是我们使用电视机的的时候是不用关心电视机的内部结构的,因为一些操作如接受信号,显示像素等等是不用我们亲自动手的。那么剩下的我们可以使用电视机的方法就简单多了,开,关电源,调节频道……那么象“now = new Date();hour = now.getHours();”这两句就很好理解了。我们用new Date()这个构造函数初始化了一个名为now的Date对象,(就好象要使用电视机的话,首先要买一个电视机一样)然后就可以调用".getHours()"这种方法获取当前本机系统时间的小时数,其获得的值为24进制,传递给了变量hour;以此类推,我们就可以先后获取了当前时间的分钟数和秒数,分别将值赋予变量minute和second。
这时候你预览一下动画,画面上显示的就是当前的时间(因为动态文本的变量和action中的一致,所以文本框中显示的就是变量值的字符串形式),不过它并不是即时反映的,因为动画到这个时候还只有一帧。我们知道,如果没有Movie Clip(影片片段)在场景中的话,只有一帧动画是静止的。处于这篇文章的结构考虑,在后面我将会讲述即时显示时间的方法。
第二段的意思只是为了避免当数值小于1的时候,各变量的显示位数只有一位而写的;
第三步,就是我们要做的显示钟表指针的工作了。
用flash中的线条工具或钢笔工具画出三个指针,按f8把指针转成Movie Clip,依次在实例面板中设置它们的名字为hourp;minutep;secondp;中心点要设置在指针的下端,排列指针的时候,要将它们的中心点对齐;然后再用画圆工具画出时钟的表面。相信接触flash有一段时间的人做到这一步不是很难,注意一下画时钟表面时的渐变色要适当处理就可以了。
现在写第三段action:
//第三段:设置各指针的旋转角度
setProperty ("secondp", _rotation, second*6);
setProperty ("minutep", _rotation, minute*6);
setProperty ("hourp", _rotation, hour*30);
解释一下,因为分和秒都是60进制的,旋转一周的角度为360,那么它们每次旋转的度数就是360/60=6,如果现在是第36秒,那么所需要旋转的度数就是36(即当前变量second)*6=216;而小时是24进制的,所以时针每次旋转的度数就720/24=30度。这里顺便提一句,在flash5中,已经命名的Movie Clip实际上已经被默认为一个对象,那么mc的一些属性如_x,_y,_rotation等等都可以作为方法来使用,因此第三段的action也可以这样写:
secondp._rotation=second*6;
minutep._rotation=minute*6;
hourp.rotation=hour*30;
事实上这种写法是flash5所鼓励的,虽然开始可能有一些不习惯,但是这样是符合面向对象的格式,如果用专家模式(Expert Mode)写action的话,不仅便于编写,而且便于阅读。ok!现在终于将一切工作做完了,我们把timeline(时间线)中所有的第二帧加上关键帧,预览一下看看,那些指针是否开始工作了?
现在把所有的action列出来:
now = new Date();             
      hour = now.getHours();
      minute = now.getMinutes();
      second = now.getSeconds();
      if (second<10) {
      second = "0" add second;
      }
      if (minute<10) {
      minute = "0" add minute;
      }
      if (hour<10) {
      hour = "0" add hour;
      }
secondp._rotation=second*6;
minutep._rotation=minute*6;
hourp.rotation=hour*30;
关于action中各个对象的使用,方法,以及参数的详细介绍,在天极网(www.yesky.com.cn)有教程下载,就不用我在这里累叙,如果读者还有什么不明白的地方,或者是对action有自己的独到的理解,欢迎来信和我联系,我的邮箱是:handmade@21cn.com,也可以直接到闪盟的flash编程论坛(www.flashsun.com),提出问题,交流经验。
祝大家新年快乐,闪得开心


黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛
————————————————
◆5d.cn互动论坛◆
------|xml版主|------

Blackflash.Qi

职务:版主
等级:7
金币:17.0
发贴:6028
注册:2000/11/7 13:08:15
#22001/1/29 11:48:44
这个是很不错.还有没有别的什么的



网络蚂蚱

职务:普通成员
等级:1
金币:1.0
发贴:157
注册:2000/12/19 20:46:01
#32001/1/30 11:52:39
呵呵,很好呀!
写的很详细呀!
不过我提一点意见,就是你开始说的那三个文本框,我认为没有必要加!!~
呵呵,只要你宣告变量就行了,不用在作为文本出现了!!~
:)



手工感情

职务:普通成员
等级:3
金币:10.0
发贴:556
注册:2001/1/3 2:50:20
#42001/1/30 13:20:32
确实没有必要,加文本的用意是为了随时检测当前时间的数字显示。。。对于初学者来说,还是有好处的:)


黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛
————————————————
◆5d.cn互动论坛◆
------|xml版主|------

Dawn_5d

职务:普通成员
等级:1
金币:1.0
发贴:165
注册:2000/9/14 21:11:48
#52001/2/1 12:45:26
不好意思请注意您的flash签名…………