我想每天調用eventX
14:30
,如何在actionscript 3
做這種工作?如何在actionscript 3的固定時間調用一些事件?
2
A
回答
1
Adobe AS3 Alarm Clock example應該告訴你所有你需要知道的。特別是,setAlarm
方法將是有趣的。
0
您可以使用日期對象 編輯 有人認爲閃存可能會凍結一秒鐘導致事件不火。這是有效的 - 我已經更新它,所以這不再是一個問題。
var currDate:Date = new Date();
var targetHour:int = 14;
var targetMinute:int = 30;
var startHour:int = currDate.getHours();
var startMinute:int = currDate.getMinutes();
var eventTriggered:Boolean = false;
// you can use an enterframe or a timer event here, doesn't matter which
addEventListener(Event.ENTER_FRAME, onCheckTime);
function onCheckTime(evt:Event):void{
currDate = new Date();
var hours:int = currDate.getHours();
var minutes:int = currDate.getMinutes();
// in order for this not to work flash would need to freeze for an entire minute
// not likely
if (hours == 14 && minutes == 30){
trigger();
}
// if flash froze for a whole minute
if (!eventTriggered){
if (startHour <= targetHour && startMinute < targetMinute){
if (hours > targetHour && minutes > targetMinute){
trigger();
}
}
}
}
function trigger():void{
// do anything you want here
eventTriggered = true;
dispatchEvent(new Event("eventX"));
removeEventListener(Event.ENTER_FRAME, onCheckTime);
}
0
使用日期()作爲觸發點的重複事件的原因提及並且是不可靠的,因爲也Date類被綁定的本地機器的時間,這可以由用戶來改變。雖然不太可能,但用戶可以更改本地計算機上的日期,絕不允許它達到目標日期。
但是,如果你使用日期(),我可能接近它像下面這樣,這將讓你一分鐘(或任何你設置timeOutLength變量),有觸發( )叫。 其他塊調用觸發器()如果觸發器窗口以某種方式傳遞,但不觸發trigger()正在調用。其餘的函數會創建一個等待期,直到觸發器窗口過期,然後有一天向前滾動日期並重新啓動該過程。
var timeOutLength:Number = 1;
var minutesToWaitUntilReset:Number = timeOutLength + 1;
var hasBeenTriggered:Boolean = false;
var targetHour:Number = 2;
var targetMinute:Number = 38;
var currentYear:Number = new Date().getFullYear()
var currentMonth:Number = new Date().getMonth();
var currentDay:Number = new Date().getDate();
addEventListener(Event.ENTER_FRAME, onCheckTime);
function onCheckTime(evt:Event):void
{
var currentDate = new Date().getTime();
var targetDate = new Date(currentYear, currentMonth, currentDay, targetHour, targetMinute).getTime();
var timeOutDate = new Date(currentYear, currentMonth, currentDay, targetHour, (targetMinute + timeOutLength)).getTime();
if (currentDate >= targetDate && currentDate < timeOutDate && hasBeenTriggered == false)
{
tiggerDailyEvent();
}
else if(currentDate >= timeOutDate && hasBeenTriggered == false)
{
tiggerDailyEvent();
}
}
function tiggerDailyEvent():void
{
hasBeenTriggered = true;
removeEventListener(Event.ENTER_FRAME, onCheckTime);
addEventListener(Event.ENTER_FRAME, waitForReset);
// this is where you call your daily event
}
function waitForReset(evt:Event):void
{
var currentYear = new Date().getFullYear();
var currentMonth = new Date().getMonth();
var currentDay = new Date().getDate();
var currentDate = new Date().getTime();
var resetDate = new Date(currentYear, currentMonth, currentDay, targetHour, (targetMinute + timeOutLength + minutesToWaitUntilReset)).getTime();
if(currentDate >= resetDate)
{
removeEventListener(Event.ENTER_FRAME, waitForReset);
reset();
}
}
function reset():void
{
hasBeenTriggered = false;
currentYear = new Date().getFullYear();
currentMonth = new Date().getMonth();
currentDay = new Date().getDate() + 1;
addEventListener(Event.ENTER_FRAME, onCheckTime);
}
如何將它編譯成一個swc文件,以便我可以直接在我的flex項目中使用它? – fms 2010-12-05 16:04:13
您只需在Flex項目中使用代碼即可。你爲什麼要打包成SWC? – spender 2010-12-05 23:45:25