6

如何在 as3 中创建计时器?在 google 上进行一些简单的搜索会将您指向 AS3 类 Timer,它实际上是事件计数器,而不是适当的时间计数实用程序。

我已经看过这个http://blogs.adobe.com/pdehaan/2006/07/using_the_timer_class_in_actio.html并且我有点担心它应该是官方文档。

问:问题究竟出在哪里?

答: Timer 类在一堆事件中执行操作,如果你有一个相当繁重的应用程序,我敢打赌,如果你用它来计算秒数、毫秒数或其他什么,它会扭曲你的时间。

4

2 回答 2

6

如果您希望准确测量较短的时间间隔,您只需使用getTimer()函数 ( flash.utils.getTimer),它会返回自 Flash 播放器启动以来经过的毫秒数。典型的简单 StopWatch 类是:

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; 
    }
}

更多信息:

于 2012-09-19T13:16:10.553 回答
1

你如何覆盖这个?

我们也只是在可以正确计算时间的脚本中使用Date类。

  1. 创建一个新的 AS3 文档
  2. 添加 3 个名为 minText、secText、MilText 的文本框和一个名为 start_btn 的按钮
  3. 在第一帧添加此代码:

var stt:int;// 我们使用这个变量来跟踪开始时间作为时间戳
var myTimer:Timer = new Timer(1); // 这是我们的计时器

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);
}

为什么需要时间戳而不使用 Date 类的功能?

因为如果你想计算两个事件之间的差异,你可能会使用这个:

     endEvent.seconds - startEvent.seconds

如果您的开始事件发生在第 57 秒并且结束事件发生在第 17 秒,这是非常错误的,您将得到 -40 秒而不是 20 秒,依此类推。

于 2012-09-19T08:49:34.093 回答