使用ActionScript 3.0的Timer類別製作計時器

使用ActionScript 3.0的Timer類別製作計時器
文∕趙英傑

本文旨在補充《碼上就會:Flash CS3動畫設計寶典》書本第十二章的迴圈敘述,說明定時器程式的寫法。請按此連結下載本文範例檔(請用Flash CS3軟體開啟)。

計時器是許多遊戲動畫不可或缺的元素,它可以顯示玩家花了多少時間過關,或者倒數經過的時間。在ActionScript 2.0中,計時器通常採用getTimer()函數撰寫而成,本單元介紹的計時器則採用ActionScript 3.0的Timer類別製作。Timer類別物件的基本語法如下:

ActionScript 3.0的Timer類別語法

每當指定的「間隔毫秒」時間到時,計時器物件就會發出TimerEvent.TIMER事件。「觸發次數」是選擇性參數,若不填寫,則計時器物件將每隔一段「間隔毫秒」發出事件。

例如,底下的程式將在每隔500毫秒(亦即,0.5秒),在輸出面版呈現“你好!”,重複三次:

var t:Timer = new Timer(500, 3);
t.start();
t.addEventListener(TimerEvent.TIMER, onTime);
function onTime(e:TimerEvent):void {
  trace("你好!");
}

基本的計時器

假設讀者想製作一個如下圖外觀的計時器,文字欄位右邊的按鈕是一個包含「啟動」與「暫停」按鈕的影片片段,其實體名稱為“toggle_mc”。當用戶按下「啟動」鈕後,計時器將開始計時,而「啟動」鈕將切換成「暫停」鈕。

計時器的舞台

雙按舞台上的「控制鈕」,進入它的時間軸,即可看見它的時間軸架構,其中,第一格影格的標籤名稱叫做“啟動”,第二格則叫做“暫停”。

「控制鈕」時間軸架構

請在此影片主舞台actions圖層的第一格關鍵影格,建立一個每1000毫秒(即:1秒鐘)觸發一次的Timer物件,以及計算經過秒數的變數counter:

var timer:Timer = new Timer(1000);
var counter:int = 0;
 

接著撰寫計時器物件timer的事件偵聽程式,每過了1000毫秒,onTimer函數將被執行,並將累加後的counter值顯示在time_txt欄位。

timer.addEventListener(TimerEvent.TIMER, onTimer);
   function onTimer(e:TimerEvent):void {
   counter ++;
   time_txt.text = counter;
 }

Timer計時器物件在執行start()方法之後才會啟動;停止計時的方法則是執行其stop()方法。請繼續輸入底下toggle_mc的滑鼠事件程式:

toggle_mc.addEventListener(MouseEvent.CLICK, 
			 startTimer);
function startTimer(e:MouseEvent):void {
  //  如果toggle_mc目前顯示的是“啟動”影格標籤畫面… 
  if  (toggle_mc.currentLabel == '啟動') {
   //  …切換到“暫停”標籤影格 
   toggle_mc.gotoAndStop('暫停');
   //  啟動計時器 
   timer.start();
  } else {
   //  否則,切換到“啟動”標籤影格, 
   toggle_mc.gotoAndStop('啟動');
   //  並停止計時 
   timer.stop();
  }
}

倒數計時

倒數計時程式的邏輯正好和上面的程式相反:先設定預定時間(秒數),每隔一秒鐘減去1,直到時間值等於0為止。本文附件的timer_2.fla原始檔,包含三個關鍵影格畫面,第一格影格畫面包含一個實體名稱為“start_btn”的倒數計時啟動鈕,以及輸入秒數的“time_txt”欄位:

初始變數與按鈕的事件處理程式如下,當用戶輸入倒數時間後,按下「啟動(start_btn)」鈕,程式將在counter變數存入倒數時間,並啟動計時器:

// 計數變數 
var counter:int = 0;
// 建立計時器物件,每隔一秒觸發。 
var timer:Timer = new Timer(1000);
// 按鈕的事件處理程式 
start_btn.addEventListener(MouseEvent.CLICK, 
				countDown);
function countDown(e:MouseEvent):void {
 //  讀取用戶輸入的倒數時間 
 counter  = int(time_txt.text);
 timer.start();
 gotoAndStop(2);
}

第三格的影格標籤名稱為“end”,用於顯示倒數結束畫面:

倒數計時的主體程式碼如下:

timer.addEventListener(TimerEvent.TIMER,  
			onTimer);
function onTimer(e:TimerEvent):void {
 counter  --;
 // 倒數到0時,跳到“end”畫面。 
 if  (counter == 0) {
  timer.stop();
  gotoAndStop("end");
 }
 // 在time_txt欄位顯示倒數秒數
 time_txt.text = counter;
}
Posts created 467

4 thoughts on “使用ActionScript 3.0的Timer類別製作計時器

  1. 你好,老师,我想问一下,两个TIMER同时运行并都读写同一个数组,应该会存在读写冲突,该怎么解决这个问题?谢谢

  2. 在处理SOCKET时,因为发的包太快SWF处理速度来不及就容易缓冲区满了,我想的处理办法是SOCKET读到数据就PUSH到一个数组,再开一个TIMER来专门处理数据,这样就存在读写冲突了

  3. 你好!
    如果我想做一個3分鐘倒數的計時器, 想問如何將倒數的顯示由”180秒”變成”3分鐘”呢?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top