AS3中的倒计时循环失控

时间:2014-03-18 19:24:06

标签: actionscript-3

因为我是AS3中的新手而我刚刚将AS2转换为AS3。倒计时不起作用。现在4位数字循环失控(三位数动画很好 - 忽略它)

请参阅倒计时 - http://magnixsolutions.com/clients/OT/media-buys_scoreboard-redux_160x600_5-8-2009.html

FLA文件 - http://magnixsolutions.com/clients/OT/media-buys_scoreboard-redux_160x600_5-8-2009.fla

AS3

// stop the timeline
stop();

// first get this current year so this example
// remains valid for some time to come
var currentDate:Date = new Date();
var thisYear:int = currentDate.getFullYear();
var thisMonth:int = currentDate.getMonth();
var thisDate:int = currentDate.getDate();
var thisHour:int = currentDate.getHours();
var thisMinute:int = currentDate.getMinutes();
var thisSecond:int = currentDate.getSeconds() + 12;
var thisMSecond:int = currentDate.getMilliseconds();

// define the event date counting down to
// this is constant so it won't need to be
// calculated in the onEnterFrame function below
// currently counting down 'til christmas of 2003
// Date( year, month-1, date [, hour [, minute [, second [, millisecond]]]])
var eventDate = new Date(thisYear, thisMonth, thisDate, thisHour, thisMinute, thisSecond,   thisMSecond);
var eventMillisecs = eventDate.getTime();
this.addEventListener(TimerEvent.TIMER, enterFrameHandler);
function enterFrameHandler(event:TimerEvent) {

// get the current date and time as it exists at
// this instance in time when the frame is entered
currentDate = new Date();
var currentMillisecs = currentDate.getTime();

// the milliseconds between the current time and the
// time of the event can then be calculated by simply
// subtracting the current time's milliseconds from the
// milliseconds of the time of the event
this.msecs = eventMillisecs - currentMillisecs;

// if the msecs variable is less than 0, that means the
// current time is greater that the time of the event
if (this.msecs <= 0){
    // and the event time has been reached!
    // play the next frame for the result of the countdown.     
    play();
    // a return can be used to exit the function since
    // in going to the next frame, there's no need to
    // continue with the remaining operations.
    return;
}

// if the date hasn't been reached, continue to
// devise seconds, minutes, hours and days from
// the calculated milliseconds
this.secs = Math.floor(this.msecs/1000); // 1000 milliseconds make a second
this.mins = Math.floor(this.secs/60); // 60 seconds make a minute
this.hours = Math.floor(this.mins/60); // 60 minutes make a hour
this.days = Math.floor(this.hours/24); // 24 hours make a second

// make sure each value doesn't exceed the range in
// which they exist.  Milliseconds, for example, will
// be shown in a range of 0 - 999.  The modulous
// operator, or %, well help in that.  Here the values
// are also turned into strings preparing for the next step
this.msecs = int(this.msecs % 1000);
this.secs = int(this.secs % 60);
this.mins = int(this.mins % 60);
this.hours = int(this.hours % 24);
this.days = int(this.days);

// add on leading zeros for all the number values (which are
// now strings) that aren't 3 or 2 characters long based on the
// range being used to represent them.  Because mseconds and
// days have up to 3 characters, a while loop is used to
// continuously add 0s until they have 3.  Other values which
// only need 2 leading 0s can get by on a single if check
while (this.msecs.length < 3) this.msecs = "0" + this.msecs;
if (this.secs.length < 2) this.secs = "0" + this.secs;
if (this.mins.length < 2) this.mins = "0" + this.mins;
if (this.hours.length < 2) this.hours = "0" + this.hours;
while (this.days.length < 3) this.days = "0" + this.days;

// finally, display your values.  If you want to put your values
// in a textField, you can pretty much just stop here and throw them
// into your textField as desired.  This example, however will go a step
// further and use images for numbers for each numerical value in the
// countdown to the desired date.

// So, for that, loop through all the movies in this counter clip using the
// evaluateFrameFrom prototype method on each. A single check for a
// _parent variable is used to make sure the property found in a for
// loop is a movieclip and is within the timeline of this counter clip.
// TextFields and buttons would also be true here, but since the contents
// within counter are strictly those numbers movieclips, we won't have to
// be concerned with such complications.  The only movieclips in this counter
// clip are the numbers movieclips with the frames of the imagery making up
// the numbers of 0-9.
for(var movie in this){
    if (this[movie]._parent == this) this[movie].evaluateFrameFrom(this);
}
};

// this function is a MovieClip.prototype meaning its available to be used by
// all movieclips.  It's a sneaky function that saves a lot of work by using
// name each numbers movieclip in the counter movieclip to determine which value
// it needs to display based on the times derived from the previous 
// calculations of the onEnterFrame. What it does is seperates a movieclip's
// _name into a variable word and a number.  The variable word will represent
// the variable to look up a value for in the passed variableClip and the
// number will be used to get a character from that value (a string) which
// represents which number this movieclip should display.
MovieClip.prototype.evaluateFrameFrom = function(variableClip){
// split this _name into an array of 2 values seperated by an underscore
var nameArray = this._name.split("_");
// the first value represents what variable in variableClip (counter clip)
// this movieclip is used to represent whether it be mins or hours etc.
var numberSet = variableClip[nameArray[0]];
// next a number representing which character in that first value this
// movieclip should display.  this will be between 0 and 2 (any one of
// three values).  number() is used to force it to be a number value.
var character:int = parseInt(nameArray[1]);
// a frame number can then be derived from the value of the numberset
// variable based on the character defined by character.  number() is
// used to force it to a number value and 1 is added to offset the
// frame value by one since 0 is at frame 1 and 1 at frame 2 etc.
var frame = 1 + parseInt(numberSet.charAt(character));
// if the movieclip is not already at the frame, move it there!
if (this._currentframe != frame) this.gotoAndStop(frame);
};

并且代码中没有显示任何错误消息。

1 个答案:

答案 0 :(得分:1)

我为你创建了倒计时的例子,毫秒。代码中最有价值的评论。

//30fps update ratio
var rate:Number = 30, dt:Number;
var currentDate:Date = new Date();
//For testing - future date in 5 minutes
var targetDate:Date = new Date(currentDate.time + 5 * 60 * 1000);
var updateTimer:Timer = new Timer(1000 / rate);
var result:String = "";
var seconds:int, minutes:int, hours:int, days:int;
updateTimer.addEventListener(TimerEvent.TIMER, onTimer);
updateTimer.start();

//Display
var textField:TextField = new TextField();
addChild(textField);

function onTimer(e:TimerEvent):void {
    //heavy lifting (new Date, leading zero formatting, etc) only every second
    if ((updateTimer.currentCount - 1) % rate == 0) {
        currentDate = new Date();
        dt = targetDate.time - currentDate.time;

        if (dt <= 0) {
            updateTimer.removeEventListener(TimerEvent.TIMER, onTimer);
            trace("the end!");
            dt = 0;
        }

        seconds = dt / 1000;
        minutes = seconds / 60;
        hours = minutes / 60;
        days = hours / 24;

        hours %= 24;
        minutes %= 60;
        seconds %= 60;

        result = days + ":" + ((hours < 10) ? "0" + hours : hours)
                + ":" + ((minutes < 10) ? "0" + minutes : minutes)
                + ":" + ((seconds < 10) ? "0" + seconds : seconds);
    }

    //Milliseconds, who cares?
    textField.text = result + ":" + Math.random().toString().substr(2, 3);
}