但大多是抓取 client 端時間,
本篇加入 server 端時間校正,
防止使用者更改系統時間造成問題。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package | |
{ | |
import flash.display.MovieClip; | |
import flash.display.Sprite; | |
import flash.events.Event; | |
import flash.net.URLLoader; | |
import flash.net.URLLoaderDataFormat; | |
import flash.net.URLRequest; | |
import flash.utils.getTimer; | |
/** | |
* ... | |
* @author jacky | |
*/ | |
public class Main extends Sprite | |
{ | |
public var counter:MovieClip; | |
private var loader:URLLoader; | |
private var eventDate:Date; | |
private var eventMillisecs:Number; | |
private var serverTime:Number; | |
private var msecs:Number; | |
private var secs:Number; | |
private var mins:Number; | |
private var hours:Number; | |
private var days:Number; | |
private var str_msecs:String; | |
private var str_secs:String; | |
private var str_mins:String; | |
private var str_hours:String; | |
private var str_days:String; | |
private var arrTxt:Array; | |
private var _active:Boolean = false; | |
public function Main():void | |
{ | |
if (stage) | |
init(); | |
else | |
addEventListener(Event.ADDED_TO_STAGE, init); | |
} | |
private function init(e:Event = null):void | |
{ | |
removeEventListener(Event.ADDED_TO_STAGE, init); | |
// entry point | |
/* | |
* 顯示日期格示 | |
* arrTxt = ["MovieClip name"...] | |
* 000.00.00.00 | |
* arrTxt = ["days_0", "days_1", "days_2", "hours_0", "hours_1", "mins_0", "mins_1", "secs_0", "secs_1"]; | |
* 000.00.00.00.000 | |
* arrTxt = ["days_0", "days_1", "days_2", "hours_0", "hours_1", "mins_0", "mins_1", "secs_0", "secs_1", "msecs_0", "msecs_1", "msecs_2"]; | |
*/ | |
arrTxt = ["days_0", "days_1", "days_2", "hours_0", "hours_1", "mins_0", "mins_1", "secs_0", "secs_1", "msecs_0", "msecs_1", "msecs_2"]; | |
setEventDate(); | |
getServerTime(); | |
} | |
/* | |
* 設定日期 | |
* Date( year, month-1, date [, hour [, minute [, second [, millisecond]]]]) | |
* ie: 2011 11 15 15:40 | |
*/ | |
private function setEventDate():void | |
{ | |
eventDate = new Date(2011, 11, 17, 10, 00); | |
eventMillisecs = eventDate.getTime(); | |
} | |
/* | |
* 取得 server 時間 | |
* <?php | |
* echo "time=" . time(); | |
* ?> | |
*/ | |
private function getServerTime():void | |
{ | |
loader = new URLLoader(); | |
loader.dataFormat = URLLoaderDataFormat.VARIABLES; | |
loader.addEventListener(Event.COMPLETE, loadComplete); | |
var request:URLRequest = new URLRequest(); | |
request.url = "http://wwwins.phpfogapp.com/gettime.php"; | |
loader.load(request); | |
} | |
private function loadComplete(e:Event):void | |
{ | |
// php time() returns seconds and not milliseconds | |
serverTime = Number(e.target.data.time) * 1000 - getTimer(); | |
if (!_active) { | |
_active = true; | |
addEventListener(Event.ENTER_FRAME, countDown); | |
} | |
} | |
private function countDown(e:Event):void | |
{ | |
// 用 getTimer 計算時間 | |
var currentMillisecs:Number = serverTime + getTimer(); | |
msecs = eventMillisecs - currentMillisecs; | |
if (msecs <= 0) { | |
trace("END"); | |
return; | |
} | |
secs = Math.floor(msecs / 1000); // 1000 milliseconds make a second | |
mins = Math.floor(secs / 60); // 60 seconds make a minute | |
hours = Math.floor(mins / 60); // 60 minutes make a hour | |
days = Math.floor(hours / 24); // 24 hours make a second | |
str_msecs = String(msecs % 1000); | |
str_secs = String(secs % 60); | |
str_mins = String(mins % 60); | |
str_hours = String(hours % 24); | |
str_days = String(days); | |
while (str_msecs.length < 3) str_msecs = "0" + str_msecs; | |
if (str_secs.length < 2) str_secs = "0" + str_secs; | |
if (str_mins.length < 2) str_mins = "0" + str_mins; | |
if (str_hours.length < 2) str_hours = "0" + str_hours; | |
while (str_days.length < 3) str_days = "0" + str_days; | |
//trace(str_days, str_hours, str_mins, str_secs) | |
updateCounter(); | |
} | |
private function updateCounter():void | |
{ | |
var i:int = 0; | |
var mc:MovieClip; | |
var mcn:String; | |
var c:String; | |
var n:String; | |
var len:int = arrTxt.length; | |
for (i = 0; i < len; i++) { | |
n = arrTxt[i]; | |
mc = counter[n]; | |
mcn = n.split('_')[0]; | |
c = n.split('_')[1]; | |
var frame:uint = 1 + uint(this["str_" + mcn].charAt(c)); | |
if (mc.currentFrame != frame) mc.gotoAndStop(frame); | |
} | |
} | |
} | |
} |
沒有留言:
張貼留言