Спонсор запису:
Толковое поисковое продвижение сайтов от SeoProfy
Створюючи практично будь-яку програму в середовищі ActionScript, програміст рано чи пізно стикається з необхідністю вимірювати час. В іграх ця функція може бути особливо корисною, коли потрібно створити затримку між діями персонажа, встановити інтервал між анімаціями, вибрати час “народження” (respawn) ворогів, додати в гру таймер зворотнього відліку тощо.
Наприклад, в грі Turtle Dreams to Fly, розробкою якої я зараз активно займаюся, головний герой має кілька “активних умінь”, які діють протягом 2-5 секунд. Але як точно виміряти цей час?
У процедурних мовах програмування колись існував простий метод паузи, який встановлював часовий інтервал між двома діями. В інших мовах для вимірювання часу потрібно створювати власні схеми числення чи інструкції циклів for чи do…while.
Втім, у ActionScript інструкції циклів діють з максимальною швидкістю, яку дозволяє комп’ютер. А це значить, що на сучасних комп’ютерах навіть цикл зі ста тисяч ітерацій буде виконаний менше, ніж за секунду. Окрім того, на різних комп’ютерах код виконуватиметься з різною швидкістю. Тож виникає потреба надійного механізму відліку, який працюватиме однаково не залежно від конфігурації комп’ютера.
В ActionScript 3 для цих потреб був створений клас Timer.
Заради справедливості варто відзначити, що керувати часовими інтервалами у Flash можна і з допомогою більш простого методу setInterval, який прийшов з другої версії мови, але навіть розробники ActionScript 3 не рекомендують його використовувати. До AS3 цей метод потрапив внаслідок необхідності підтримувати зворотню сумісність (адже у AS2 класу Timer не існувало).
Тому в рамках цієї статті я не зупинятимусь на методі setInterval і постараюся якомога детальніше описати новий потужний клас, який дозволяє робити з часом практично все, що завгодно – Timer.
Імпорти
Передусім, потрібно прописати в нашій програмі імпорти класів Timer та TimerEvent, які будуть необхідні для коректної роботи:
import flash.events.TimerEvent; import flash.utils.Timer;
Створення таймера
Для того, щоб мати змогу використовувати функції класу Timer (тобто керувати часом) в рамках своєї програми, необхідно створити таймер. По суті таймер – це змінна, яку слід спершу слід оголосити. Виглядає оголошення змінної наступним чином:
var ім'я = new Timer(затримка, [кількість повторів (необов'язковий параметр)]);
Ім’я – це ім’я вашої змінної, до якої ви звертатиметесь кожного разу, коли потрібно запустити чи зупинити таймер. У моєму прикладі я дав таймеру ім’я myTimer.
Затримка – це час між повторами дії таймера. Вона вимірюється в мілісекундах. Наприклад, якщо встановити затримку 1000 – то час між “тіками” таймера буде дорівнювати одній секунді.
Кількість повторів – це кількість “тіків”, які зробить таймер після запуску перед тим, як зупинитися. Цей параметр необов’язковий. Якщо не вказати кількість повторів, то таймер працюватиме вічно (до тих пір, поки ви програмно його не зупините).
А тепер, як може виглядати оголошення таймера в реальній програмі:
var myTimer:Timer = new Timer(1000,10);
У наведеному вище прикладі таймер буде спрацьовувати кожну секунду і повториться десять разів.
Додавання слухача подій
Таймер готовий. Втім, наразі він не виконує жодних дій. Для того, щоб прив’язати конкретні програмні події до таймера, потрібно створити слухач подій (event listener).
За посиланням, наведеним вище, ви знайдете базову інформацію про слухачі подій, тому наступний код не повинен викликати у вас жодних ускладнень:
myTimer.addEventListener(TimerEvent.TIMER, someFunction);
someFunction – це функція, яка виконуватиметься кожного разу при спрацюванні таймера (тобто у нашому випадку – щосекунди).
Давайте створимо цю функцію:
function someFunction(event:TimerEvent) { trace("Tick"); }
З функціями ми також ознайомилися в статті про слухачі подій та кількох інших попередніх публікаціях. Додам лише, що у дужках вказано тип події, яка викликатиме цю функцію: event:TimerEvent або можна використати скорочений варіант: e:TimerEvent
Інструкція trace виводить текст “Tick” кожного разу при спрацюванні таймера. Щоправда, цей текст буде видно тільки під час тестування програми у Flash IDE (тобто середовищі розробки флеш).
По суті наш таймер готовий. Останнє, що залишилося зробити – це запустити його. Для цього використовується конструкція:
myTimer.start();
Її можна використати у будь-якому місці коду після оголошення таймера та додавання до нього слухача події. Це значить, що ви можете спершу розмістити код запуску таймера, а потім опис функції.
Загальний код виглядатиме так:
var myTimer:Timer = new Timer(1000,10); myTimer.addEventListener(TimerEvent.TIMER,someFunction); myTimer.start(); function someFunction(event:TimerEvent) { trace("Tick"); }
Він буде виводити напис “Tick” у вікні trace щосекунди протягом 10 секунд.
Зупинка та рестарт таймера
Ви можете зупинити таймер у будь-який час, використавши наступну конструкцію:
myTimer.stop();
Якщо ви зупините таймер, а потім запустите його функцією start, то відлік знову почнеться з початку. Втім, якщо таймер зупиниться самостійно (оскільки закінчив виконувати свою роботу), то функція start не зможе перезапустити його.
Для того, щоб перезапустити таймер, спершу треба встановити його на нуль з допомогою функції:
myTimer.reset();
А потім знову запустити:
myTimer.start();
Інші функції таймера
getTimer() – виводить кількість мілісекунд, які минули з часу запуску або перезапуску таймера;
delay – дозволяє змінювати затримку між “тіками” таймера. Реалізовується наступним чином: myTimer.delay = 2000;
repeatCount – дозволяє змінити кількість повторів. Працює за аналогією з delay: myTimer.repeatCount = 20;
currentCount – виводить кількість “тіків” після старту чи рестарту таймера. Реалізація: myTimer.currentCount;
running – може використовуватися тільки за межами функції, прив’язаної до подій таймера. Виводить булеве (boolean) значення (true/false), яке вказує, чи працює в даний момент таймер.
М’ячик, який стрибає
З теорією розібралися, тепер давайте спробуємо застосувати методи таймера на практиці.
Я вирішив повернутися до багатостраждального м’ячика, який ми навчили стрибати і навіть реагувати на кліки мишкою. Сьогодні ми прив’яжемо наш м’ячик до подій таймера і змусимо його стрибати раз в 3 секунди.
Оскільки програма надзвичайно проста, ми не будемо створювати для неї окремого as-файлу (до цього ми ще повернемося в майбутньому), а напишемо весь код в першому кадрі часової шкали.
Власне, сам код виглядатиме наступним чином:
import flash.events.TimerEvent; import flash.utils.Timer; stop (); var myTimer:Timer = new Timer(3000); myTimer.addEventListener(TimerEvent.TIMER,someFunction); myTimer.start(); function someFunction(event:TimerEvent) { play(); }
Зверніть увагу, що я не вказав кількість повторів таймера. Це значить, що він працюватиме безкінечно.
На початку програми я вказую інструкцію stop (), щоб кліп не почав програватися відразу після старту. А у функції події додаю інструкцію play (), щоб м’ячик стрибав при кожному спрацюванні таймера.
Результат ви можете спостерігати нижче:
Як бачите, все дійсно дуже просто.
Якщо у вас залишилися будь-які питання щодо роботи классу Timer, не соромтесь задавати їх у коментарях.
І не забудьте підписатися на RSS цього блога. Далі буде тільки цікавіше!
Березень 1, 2011 о 23:59
що за ліричний відступ з вимірюванням часу з допомогою циклів?