2012-09-19 40 views
5

Làm cách nào để tạo bộ đếm thời gian trong as3? Một số tìm kiếm đơn giản trên google sẽ chỉ cho bạn lớp AS3 Timer thực sự là bộ đếm các sự kiện và không phải là thời điểm thích hợp tính tiện ích.tạo bộ đếm thời gian (thích hợp) trong AS3

Tôi đã thấy điều này http://blogs.adobe.com/pdehaan/2006/07/using_the_timer_class_in_actio.html và tôi hơi lo lắng vì thực tế rằng đó là tài liệu chính thức nên hoạt động.

Q: Trường hợp chính xác là vấn đề?

A: Lớp Timer thực hiện các thao tác trong một chồng sự kiện và nếu bạn có ứng dụng khá nặng, tôi có thể đặt thời gian của bạn nếu bạn sử dụng nó để tính giây, mili giây hoặc bất kỳ thứ gì.

Trả lời

1

Bạn ghi đè điều này như thế nào?

Chúng tôi chỉ đơn giản sử dụng lớp Ngày cũng trong một tập lệnh sẽ đếm đúng thời gian.

  1. Tạo một tài liệu AS3 mới
  2. thêm 3 textbox tên minText, secText, MilText và một nút gọi là start_btn
  3. Thêm mã này vào frame đầu tiên:

var stt: int; // chúng tôi sử dụng biến này để theo dõi thời gian bắt đầu dưới dạng dấu thời gian
var myTimer: Timer = new Timer (1); // đây là bộ hẹn giờ của chúng tôi

var starttime:Date; // pretty obvious 
var actualtime:Date; // pretty obvious 

myTimer.addEventListener(TimerEvent.TIMER, stopWatch); // we start counting with this counter 

start_btn.addEventListener(MouseEvent.CLICK, startClock); // add a button listener to start the timer 

function startClock(event:MouseEvent):void 
{ 
    starttime = new Date(); // we get the moment of start 
    stt = int(starttime.valueOf().toString()); // convert this into a timestamp 
    myTimer.start(); // start the timer (actually counter) 
} 

function stopWatch(event:TimerEvent):void 
{ 
    actualtime = new Date(); // we get this particular moment  
    var att:int = int(actualtime.valueOf().toString()); // we convert it to a timestamp 

    // here is the magic 
    var sec:int = (Math.floor((att-stt)/1000)%100)%60; // we compute an absolute difference in seconds 
    var min:int = (Math.floor((att-stt)/1000)/60)%10; // we compute an absolute difference in minutes 
    var ms:int = (att-stt)%1000; // we compute an absolute difference in milliseconds 

    //we share the result on the screen 
    minText.text = String(min); 
    secText.text = String(sec); 
    milText.text = String(ms); 
} 

Tại sao bạn cần dấu thời gian và không sử dụng các chức năng của lớp Ngày?

Bởi vì nếu bạn muốn đếm sự khác biệt giữa hai sự kiện mà bạn có thể dùng chương trình này:

 endEvent.seconds - startEvent.seconds 

Đó là rất sai nếu sự kiện bắt đầu của bạn xảy ra trong 57'th thứ hai và sự kiện xảy ra trong cuối Thứ hai thứ 17, bạn sẽ nhận được -40 giây thay vì 20 và cứ tiếp tục như vậy.

+1

'flash.utils.getTimer() 'là hiệu quả hơn, theo một câu trả lời – BadFeelingAboutThis

5

Nếu bạn đang tìm một cách chính xác biện pháp khoảng thời gian ngắn bạn chỉ cần sử dụng chức năng getTimer() (flash.utils.getTimer), mà trả về số mili giây trôi qua kể từ Flash player bắt đầu. Lớp đơn giản StopWatch nguyên mẫu là:

public class StopWatch { 
    private var _mark:int; 
    private var _started:Boolean = false; 

    public function start():void { _ 
     mark = getTimer(); 
     _started = true; 
    } 

    public function get elapsed():int { 
     return _started ? getTimer() - _mark : 0; 
    } 
} 

More Info:

+0

này chắc chắn là tốt hơn so với việc sử dụng' Date' lớp – BadFeelingAboutThis

+0

Tôi có một chút nghi ngờ vì Date() dựa vào thời gian hệ thống nhưng getTimer() dựa trên máy ảo Flash runtime. Nó nên được thử nghiệm nhưng tôi nghĩ rằng trên các ứng dụng nặng nó có thể rơi phía sau quá. – Mike

+0

@mugur Bạn dựa vào nền tảng nào? Dù bằng cách nào, nó yêu cầu hệ điều hành cơ bản cho thời gian hệ thống cụ thể hoặc các dấu tích hệ thống (xem ví dụ http://en.wikipedia.org/wiki/GetTickCount) –

Các vấn đề liên quan