Как вызвать какое-то событие в определенное время в ActionScript 3? - PullRequest
2 голосов
/ 05 декабря 2010

Я хочу вызывать eventX каждый день на 14:30, как сделать такую ​​работу в actionscript 3?

Ответы [ 3 ]

1 голос
/ 05 декабря 2010

Пример будильника Adobe AS3 должен рассказать вам все, что вам нужно знать. В частности, будет интересен метод setAlarm.

0 голосов
/ 12 декабря 2010

Использование Date () в качестве триггерной точки для повторяющегося события ненадежно по упомянутым причинам, а также потому, что класс Date привязан ко времени локальной машины, которое может изменить пользователь. Хотя это маловероятно, пользователь может изменить дату на локальном компьютере, не позволяя ему достичь целевой даты.

Однако, если бы вы использовали Date () , я мог бы подойти к этому, как показано ниже, что дало бы вам полную минуту (или что бы вы ни установили для переменной timeOutLength равной ), чтобы вызвать trigger () . Блок else вызывает trigger () , если окно триггера каким-то образом пропущено без вызова 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);
}
0 голосов
/ 05 декабря 2010

Вы можете использовать объект даты. РЕДАКТИРОВАТЬ . Было высказано предположение, что вспышка может замерзнуть на секунду, из-за чего событие не сработает.Это верно - я обновил его, так что это больше не проблема.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...