ема 8. Об'єкти середовища Flash
(тривалість 12 години)
Навчальні питання.
1. Key — клавіатура
Завдання для роботи: Створити кліп «Ракета». Малюємо зоряне небо й поверхню планети. Створюємо об'єкт «Ракета», яким можна управляти клавішами «стрілками» нагору, униз, вправо, уліво, а також переміщати мишею. Ракета повинна самостійно опускатися на поверхню планети при відсутності натискання клавіш нагору й униз. При натисканні клавіші Ctrl швидкість руху збільшується. Також потрібно, щоб Ракета не могла полетіти вниз за межі екрана.
Приклад:
Практика: Створюємо новий шар Фон. Малюємо зоряне небо й поверхню планети.
Створюємо графічний об'єкт «Ракета1».
Приклад:
Створюємо об'єкт Movie Clip «Ракета» і вставимо наш об'єкт «Ракета1».
Створюємо новий шар Ракета й вставляємо в нього об'єкт Movie Clip «Ракета.
Практика:Додайте код, пов'язаний з ракетою:
onClipEvent (keyDown) {
trace(Key.getCode());
trace(Key.isDown(Key.CONTROL));
trace(Key.isDown(Key.SHIFT));
trace(Key.isDown(Key.ALT));
}
Перевірте роботу кліпу, натискаючи на різні клавіші.
Тепер подивимося, як можна управляти ракетою із клавіатури. Подія keyDown відбувається тільки при натисканні клавіші, а нам потрібно, щоб ракета рухалася постійно, якщо ми нажали клавішу й не відпускаємо неї. Для цього ми використаємо подію enterFrame, де за допомогою методу Key.isDown будемо перевіряти, які клавіші натиснуті, і міняти відповідним чином координати _x і _y кліпу.
Швидкість руху запишемо в змінну v, її початкове значення задамо в оброблювачі load (за час одного кадру ракета зміщається на 3 пикселя в заданому напрямку).
Практика: Додайте нові оброблювачі подій для ракети:
onClipEvent (load) {
v = 3;
}
onClipEvent (enterFrame) {
if (Key.isDown(Key.RIGHT)) {
_x += v;
} else if (Key.isDown(Key.LEFT)) {
_x -= v;
}
}
Аналогічно запишіть оброблювачі для клавіш-стрілок «нагору» і «униз» (коди Key.UP і Key.DOWN).
Помітьте, що ракета може рухатися одночасно у двох напрямках, наприклад, нагору й уліво.
Тепер зробимо так, щоб при натисканні клавіші Home ракета верталася у вихідний стан (де вона була на початку). Для цього в оброблювачі події load треба запам'ятати її координати в змінних x0 і y0, а при натисканні клавіші Home привласнювати ці значення координатам кліпу _x і _y.
Практика:Додайте рядка в оброблювач load:
x0 = _x;
y0 = _y;
Зміните оброблювач події keyDown на такий:
onClipEvent (keyDown) {
if (Key.isDown(Key.HOME)) {
_x = x0;
_y = y0;
}
}
Запустивши ролик, ви можете з подивом виявити, що це не працює. Якщо вставити рядок
trace("Ку-ку");
в оброблювач keyDown, ми виявимо, що при натисканні клавіші Home цей оброблювач не викликається.
Справа в тому, що ми запускаємо кліп із середовища розробки, що перехоплює деякі клавіші, наприклад, Enter і Home. При перегляді цього ролика в окремому вікні Flash-програвача або в браузері все буде нормально.
Однак є простий спосіб позбутися від цієї незручності.
Практика: Запустите ролик і відзначте прапорець Disable Keyboard Shortcuts у меню Control у вікні програвача. Перевірте, чи реагує тепер кліп на натискання клавіші Home.
Тепер зробимо так, щоб при натисканні клавіші Ctrl швидкість руху ракети збільшувалася в 3 рази. Початкову швидкість ми позначимо через v0.
Практика:Додайте в початок оброблювача події enterFrame код
if (Key.isDown(Key.CONTROL)) {
v = v0*3;
} else {
v = v0;
}
і зміните перший рядок в оброблювачі load на
v0 = 3;
Практика:Самостійно зробіть так, щоб ракета опускалася вниз, якщо не натиснута ні стрілка «нагору», ні стрілка «униз». Також потрібно, щоб вона не могла полетіти вниз за межі екрана.
Далі ми зробимо так, щоб ракету можна було перетаскувати по екрані мишею. У темі 7.11 ми розглядали код для переміщення об'єкта миша. Використайте його.
Практика: Підказка
//переміщення об'єкта мишею
on (press) {
startDrag(this);
}
on (release, releaseOutside) {
stopDrag();
}
2. Робота з текстом (String, Selection)
Завдання для роботи: Побудувати невеликий редактор тексту, що вміє робити виділені букви заголовні або рядковими, уважати кількість символів і шукати в тексті задане слово.
Приклад:
Об'єкт String — рядок
Символьні рядки в програмі полягають у подвійні лапки і являють собою об'єкти класу String (рядок). У рядка є одна властивість
- length — довжина рядка,
і кілька методів, з яких найчастіше застосовуються
- charAt(n) — символ у позиції n (номера символів починаються з нуля);
- charCodeAt(n) — код символу в позиції n (ціле число);
- substring(from, to) — подстрока, що починається з позиції from і закінчується перед позицією to (тобто, символ з номером to у неї не входить); якщо другий аргумент не зазначений, виділяється фрагмент до кінця рядка;
- indexOf(sub) — шукає подстроку sub, повертає номер її першого символу; якщо такий подстроки ні, повертає -1;
- toLowerCase() — перетворити в рядкові (маленькі) букви;
- toUpperCase() — перетворити в заголовні (більші) букви.
Для того, щоб з'єднувати рядки, використається знак +, наприклад, так:
s = "123";t = s + 45 + "6789";trace ( t ); // одержимо "123456789"У другому рядку число 45 було автоматично перетворене до символьної форми.
У наступному проекті ми побудуємо невеликий редактор тексту, що вміє робити виділені букви заголовн або рядковими, уважати кількість символів і шукати в тексті задане слово.
Приклад:
Практика:Створюємо новий проект, малюємо тло для текстового редактора. Створюємо чотири кнопки / , / , / , / . Розмістити кнопки як у прикладі.
Практика:Створіть новий шар Текст і розмістите велике текстове поле в середині сцени. Установите тип напису Input Text (поле уведення), ім'я main і параметр Multiline (многострочный текст), як показано на малюнку нижче.
Уміст текстового поля — це теж рядок, тобто, об'єкт класу String. Вона має ім'я text, це значить, що адреса текстового рядка поля main запишеться як main.text.
Зробимо так, щоб при натисканні кнопок / і / всі букви тексту ставали заголовними (або відповідно рядковими).
Практика :Додайте до кнопки код
on ( release ){
main.text = main.text.toUpperCase();
}
а до кнопки / - код
on ( release ){
main.text = main.text.toLowerCase();
}
Перевірте роботу кнопок.
У нижній частині поля зробимо інформаційний рядок (динамічне текстове поле) і при натисканні на кнопку будемо виводити там кількість символом у тексті, тобто довжину рядка main.text.
Практика:Додайте в нижню частину сцени однорядковий динамічний текст (Dynamic Text, Single line) з ім'ям info. Для кнопки / уведіть оброблювач події
on ( release ){
info.text = "Символів: " + main.text.length;
}
б'єкт Selection
Об'єкт Selection — це виділена частина тексту в одному з полів уведення. Він пов'язаний з тим елементом, що у цей момент має фокус, тобто приймає команди від клавіатури.
Методы об'єкта Selection:
- setFocus("адреса") — передати фокус уведення текстовому полю, адреса якого зазначений у лапках;
- getBeginIndex() — повертає номер першого виділеного символу;
- getEndIndex() — повертає номер символу, на якому виділення закінчується (цей символ уже не входить у виділення);
- setSelection(start,end) — виділити область від символу з номером start до символу з номером end.
Додамо можливість пошуку слова в тексті.
Практика :Додайте у верхню частину сцени (ліворуч від кнопки ) однорядкове поле уведення (Input Text, Single line) з ім'ям find.
Пошук починається по щиглику на кнопці / .
Практика :Для кнопки задайте ведіть оброблювач події
on (release) {
if ( find.text == "" ) return;
n = main.text.indexOf ( find.text );
if ( n < 0)
info.text = "Нічого не знайдено.";
else {
info.text = "Знайшли в позиції " + n;
Selection.setFocus ( "main" );
Selection.setSelection ( n, n + find.text.length );
}
}
Спочатку перевіряємо, чи уведено щось у поле для пошуку (якщо воно порожно, нічого робити не треба, і відбувається вихід з оброблювача).
Потім, за допомогою методу indexOf шукаємо зразок у тексті. Якщо такого слова ні, виводить повідомлення про це в інформаційний рядок. Якщо є, то встановлюємо фокус на поле main і виділяємо знайдене слово.
Використовуючи методи об'єкта Selection, можна поліпшити роботу кнопок і
: якщо щось виділене, вони будуть міняти тільки виділену частину тексту.
Спочатку ми визначимо початок і кінець виділеної частини й запишемо номера цих символів у змінні nStart і nEnd. Якщо вони рівні, то нічого не виділено й перетвориться весь текст. Якщо ці значення не рівні, новий рядок будується так: уміст main.text «розрізається» на 3 частині за допомогою методу substring, до другої частини застосовується метод toUpperCase.
Важливо:Ця частина програми буде працювати тільки для Flash Player версії 9 і вище, оскільки в ранніх версіях під час щиглика по кнопці текстове поле втрачає фокус.
Практика :Зміните оброблювач кнопки на такий:
on (release) {
nStart = Selection.getBeginIndex();
nEnd = Selection.getEndIndex();
if (nStart == nEnd) {
main.text = main.text.toUpperCase();
} else {
s = main.text;
s = s.substring ( 0, nStart ) +
s.substring ( nStart, nEnd ).toUpperCase() +
s.substring ( nEnd );
main.text = s;
}
}
Аналогічно зміните код кнопки / .
Зверніть увагу, що при виклику substring(nEnd) другий аргумент не зазначений, тобто виділяється фрагмент із символу nEnd до кінця рядка.
Заметим, що алгоритм працює навіть тоді, коли поле main не має фокуса уведення (і обидві функції getBeginIndex і getEndIndex повернуть -1).
3. Color — кольори
Завдання для роботи: Намалюйте знак долара, перетворите його в об'єкт Movie Clip з ім'ям logo. Застосуєте до нього фільтри Bevel і Glow. Створіть кнопку й розмістите внизу сцени дев'ять таких кнопок. Написати програму для керування кольорами об'єкта за допомогою кнопок у нижній частині сцени.
Об'єкт Color дозволяє змінювати кольори кліпів із програми. Для цього потрібно спочатку створити в пам'яті новий об'єкт, зв'язавши його із кліпом:
col = new Color ( адреса кліпу );Таким чином, ми одержуємо доступ до кольорів об'єкта. Потім можна використати два методи:
- setRGB(кольори) — установити нові кольори;
- getRGB() — одержати кольори, установлений останньою командою setRGB.
Кольори кліпів задається у форматі RGB (R=red, червоний; G=green, зелений; B=blue, синій) як довге ціле число, у якому «упаковані» значення складових R, G і B, кожна з яких являє собою ціле число від 0 до 255.
Щоб зручно було розбиратися у квітах, прийнято записувати їх у шестнадцатеричной системі числення, так що молодші дві цифри — це B, що випливають дві — G, а дві старших — R. Наприклад, для кольори 0x660000 маємо R=6616=102, G=B=0.
Приклад:
Розташування об'єкта й кнопок :
Практика:Намалюйте знак долара, перетворите його в об'єкт Movie Clip з ім'ям logo. Застосуєте до нього фільтри Bevel і Glow. Створіть кнопку й розмістите внизу сцени дев'ять таких кнопок.
Практика :Виділите саму ліву кнопку й перейдіть на панель Properties. У списку Color виберіть варіант Tint (колірний відтінок), кольори з кодом #000033 і змішання 100% (повна заміна вихідних кольорів).
Практика :Виділите першу кнопку й уведіть код оброблювача, що викликається при відпусканні кнопки миші:
on ( release ) {
cLogo = new Color(_root.logo);
cLogo.setRGB(0x000033);
}
Аналогічно задайте параметри й оброблювач другої кнопки з кольорами 0x000066. Перевірте роботу фільму.
Звичайно, можна застосувати ті ж кроки для інших кнопок, але цю нудотну роботу можна значно спростити, якщо використати масиви й цикли.
Масиви
Масив — це набір елементів, що мають загальне ім'я. Кожний елемент має власний номер, починаючи з нуля. Для звертання до елемента масиву використаються квадратні дужки.
Важливо:Нумерація елементів масиву з нуля незвична для звичайних людей, але широко використається в програмуванні (мови Си, JavaScript, Java, ActionScript).
На відміну від багатьох мов програмування, в одному масиві можуть бути різнотипні елементи: цілі числа, речовинні числа, рядки, логічні змінні.
Масив із трьох елементів можна оголосити й заповнити так:
A = new Array(3);
A[0] = 12;
A[1] = 4.56;
A[2] = "Ку-ку!";
або так:
A = new Array (12, 4.56, "Ку-ку!");
або так:
A = [12, 4.56, "Ку-ку!"];
При роботі з масивами, як і з іншими об'єктами (крім чисел, рядків і логічних змінних), є один тонкий момент. Розглянемо приклад коду:
A = [1, 2, 3];
B = A;
B[1] = 99;
trace ( A );
Тут створюється масив A, потім він копіюється в масив B. Потім змінюється B[1] і масив A виводиться у вікно Output. Начебто б масив A не повинен змінитися, однак ми побачимо у вікні Output рядок:
1,99,3
Чому ж змінився масив A? Справа в тому, що оператор B=A НЕ створює новий масив, а просто копіює в B адреса масиву A, тобто A і B звертаються до однієї області пам'яті. Тому, змінивши B, ми змінили й A. Щоб дійсно створити копію масиву, потрібно замінити оператор B=A на код
B = new Array();
for(i=0; i<A.length; i++) B[i] = A[i];
Тут використається убудована властивість length об'єкта Array — довжина масиву.
У нашому прикладі ми створимо масив, у якому будуть зберігатися коди квітів всіх кнопок.
Практика :Видалите раніше створені оброблювачі. Створіть новий шар Програма й у перший кадр уведіть код, що заповнює масив кодами квітів:
colors = [0x000033, 0x000066, 0x000099,
0x003300, 0x006600, 0x009900,
0x330000, 0x660000, 0x990000];
Оборотний увага, що оброблювачі події release для всіх кнопок майже однакові й відрізняються тільки кодом кольорів. Тому можна створити для них одну єдину функцію, що будуть викликати всі кнопки.
Важливо :Шар Програма можна відразу ж заблокувати, клацнувши по значку в стовпці . Це дозволить додавати код ActionScript, але не дасть випадково додати щось ще.
Практика :Додайте функцію, що змінює кольори логотипа відповідно до кольорів кнопки, на якій клацнули мишкою:
function changeColor() {
c = new Color(this);
col = c.getRGB();
cLogo = new Color(_root.logo);
cLogo.setRGB(col);
}
У цій функції ми спочатку визначаємо кольори кнопки, одержавши доступ до нього через змінну з і використовуючи метод getRGB. Потім ці кольори переноситься на логотип.
Створена функція поки не працює, оскільки ми не визначили, у яких випадках вона викликається. Для того, щоб вона стала оброблювачем події release деякої кнопки, досить написати
Кнопка.onRelease = changeColor;
Далі ми за допомогою циклу, у якому змінна i (номер кнопки) міняється від 0 до 8, настроїмо всі кнопки відразу: перефарбуємо їх у потрібні кольори й додамо оброблювач події.
Щоб у циклі звертатися до кнопки по її номері, можна використати спеціальну форму _root[ім'я]. Таким чином, _root["color0"] це те ж саме, що й _root.color0, але перевага першого методу в тім, що ім'я кнопки можна побудувати динамічно, під час виконання, наприклад, так:
_root["color"+chr(48+i)]
Функція chr перетворить код символу в символ. З огляду на, що цифри 0-9 мають коди 48-57, при i=2 одержуємо _root["color2"].
Щоб ця ідея спрацювала, кнопкам потрібно дати відповідні імена color0, color1 і т.д.
Практика :Дайте імена кнопкам color0, color1 і т.д., починаючи з лівої. На панелі Properties, виділивши яку-небудь кнопку.
Практика :Додайте до коду кадру 1 цикл:
for (i=0; i<9; i++){
obj = _root["color"+chr(48+i)];
c = new Color(obj);
c.setRGB(colors[i]);
obj.onRelease = changeColor;
}
Перевірте роботу фільму й збережете його.
Тут змінна obj — це адреса кнопки з номером i.
4. Sound — звук
Об'єкти класу Sound служать для керування звуком. З їхньою допомогою можна
- змінювати гучність звуку;
- змінювати розподіл звуку між лівим і правим каналами, коли джерело звуку переміщається по екрані;
- створювати звуки динамічно, тобто із програми без використання тимчасової шкали.
Спочатку навчимося програвати звук з бібліотеки й зупиняти його в потрібний момент.
риклад.
Практика:Знайдіть звук у бібліотеці й натисніть на ньому праву кнопку миші. У контекстному меню виберіть команду Linkage... (зв'язування), у вікні, що з'явилося, відзначте прапорці Export for ActionScript і Export in frameframe, уведіть ім'я звуку наприклад - hey у полеIdentifier.
Флажок Export for ActionScript робить звук доступним із програми, ми будемо звертатися до нього по імені hey. Прапорець Export in first frame завантажує звук разом з першим кадром, таким чином, звук буде доступний із самого початку фільму.
Тепер треба
- створити новий об'єкт типу Sound за допомогою конструктора new Sound();
- завантажити в нього звук за допомогою методу attachSound;
- запустити звук на програвання (метод start)
- зупинить звук за допомогою методу stop.
Ми зв'яжемо цей код із кліпом, оскільки він буде одержувати події mouseDown і keyDown поза залежністю від того, де перебуває мишка. Об'єкт Sound будується відразу після завантаження в оброблювачі load, звук запускається в оброблювачі mouseDown і зупиняється у випадку події keyDown.
Практика:Виділите кліп і додайте у вікно Actions наступний код:
onClipEvent (load) {
snd = new Sound();
}
onClipEvent (mouseDown) {
snd.attachSound ("hey");
snd.start(0, 1);
}
onClipEvent (keyDown) {
snd.stop();
}
При виклику методу start перше число позначає час від початку звукового файлу в секундах (0 — із самого початку), а другий — кількість повторів.
Важливо:Якщо програвати звук не з початку, після завершення звукової доріжки буде програна початкова частина.
Важливо:За допомогою виклику stopAllSounds(); можна припинити програвання всіх звуків відразу.
Щоб «добратися» до звуку усередині кліпу, потрібно вказати адресу кліпу при створенні об'єкта Sound. Наприклад, у коді самого кліпу можна використати this:
bounce = new Sound(this);Для зміни гучності використається метод setVolume, у дужках потрібно вказати гучність звуку у відсотках від вихідної.
Звуковий баланс регулюється за допомогою методу setPan (set panoram — установити баланс), у дужках потрібно задати величину від -100 (ліва границя зони, тільки лівий канал) до 100 (права границя, тільки правий канал).
5. Дата й час
Завдання для роботи : Побудувати ролик, що показує сьогоднішню дату, день тижні й час, а також може служити будильником.
б'єкт Date
У цьому розділі ми вивчимо засоби для роботи з датами й часом:
- об'єкт Date (дата);
- функцію getTimer() (одержати час таймера).
Створити новий об'єкт класу Date можна так:
d = new Date(2013, 4, 09);
Перше число — рік, друге — номер місяця, третє — число. Ця дата — 09 травня 2013 року. Тут немає помилки, номера місяців починаються з нуля, тому місяць 4 у програмі Flash — це травень.
Якщо параметри не використаються:
today = new Date();
створюється об'єкт із сьогоднішньою датою.
За допомогою методів об'єкта Date можна визначити рік, місяць, число й день тижня:
- today.getFullYear() — рік;
- today.getMonth() — місяць;
- today.getDate() — число;
- today.getDay() — день тижня;
- today.getHours() — годинники;
- today.getMinutes() — хвилини;
- today.getSeconds() — секунди.
Дні тижня, так само, як і місяці, нумеруються з нуля, причому тиждень починається з неділі (день 0), понеділок має номер 1 і т.д.
Приклад :
Практика :Намалюйте фон й стилізацію відривного календаря.
Практика :Додайте динамічні текстові поля (Dynamic Text) для виводу дня тижня, числа, місяця року так, як на зразку. Дайте їм імена day, date, month і year, установите вирівнювання по центрі, виберіть кольори й розмір шрифту.
Практика:Додайте шар Програма й у першому кадрі введіть код
stop();
today = new Date();
weekDays = ["неділя", "понеділок", "вівторок",
"середовище", "четвер", "п'ятниця", "субота"];
months = ["січня", "лютого", "березня", "квітня",
"травня", "червня", "липня", "серпня", "вересня",
"жовтня", "листопада", "грудня"];
day.text = weekDays[today.getDay()];
date.text = today.getDate();
month.text = months[today.getMonth()];
year.text = today.getFullYear();
Перевірте роботу фільму.
У першому рядку ми зупинили програвання, оскільки всі зміни виконуються із програми. Потім у масиви weekDays і months записані назви днів тижня й місяців (з огляду на, що тиждень в американців починається з неділі).
Потім у текстові поля записуються дані сьогоднішнього дня, причому деякі з них вибираються з масивів.
З виводом часу справа обстоит трохи складніше, його треба обновляти раз у секунду. Спочатку додамо текстове поле й напишемо функцію, що повинна виводити в нього час.
Практика :Додайте текстове поле під аркушем календаря й дайте йому кодове ім'я time. У код кадру 1 додайте функцію
function showTime() {
function str2 ( n ) {
var s = String(n);
if ( n < 10) s = "0" + s;
return s;
}
today = new Date();
h = today.getHours();
m = today.getMinutes();
s = today.getSeconds();
time.text = str2(h) + ":" + str2(m) + ":" + str2(s);
}
Ця функція містить внутрішню функцію str2, що приймає ціле число n і переводить його в рядок за допомогою функції String. Потім, якщо число було менше 10, до рядка попереду додається нуль. Це зроблено потім, щоб, скажемо, час 5 годин 3 хвилини й 2 секунди зображувалися як 05:03:02, а не 5:3:2.
В основній частині функції створюється новий об'єкт Date, що містить поточну дату й час. За допомогою методів getHours, getMinutes і getSeconds з нього витягають годинники, хвилини й секунди. Далі вони переводяться в символьний вид за допомогою функції str2 і об'єднаний рядок записується у властивість text поля time.
Всі б добре, але функцію showTime треба викликати періодично з інтервалом не менш 1 секунди. На щастя, у середовищі Flash є такий засіб.
Практика :Додайте до коду кадру 1 рядок
setInterval ( showTime, 200 );
і перевірте роботу кліпу.
Перший параметр функції setInterval — це функція, яку треба викликати, а другий — інтервал між викликами в миллисекундах.
Таймер
Займемося будильником.
Практика :Додайте на поле напису (Static Text): Будильник, час, сек, повторити й раз, а також два поля уведення (Input Text) з іменами alarmTime (час сигналу) і loops (повтори). Створіть кнопку ПУСК. Додайте в потрібне місце кнопку Пуск.
Практика :У кадр 1 шаруючи Програма додайте присвоєння початкових значень:
alarmTime.text = "10";
loops.text = "1";
Для відстеження часу будемо використати внутрішній таймер. Виклик функції
t = getTimer();
записує в змінну t кількість миллисекунд, що пройшла з початку програвання фільму. Для будильника нам потрібна різниця між поточним часом і часом початку відліку, що ми запам'ятаємо в спеціальної змінної startTime.
В інший змінної, alarmOn будемо запам'ятовувати станів будильника (включений або виключений). Тепер можна написати код для кнопки: при її натисканні включається будильник і запам'ятовується час початку відліку.
Практика :Додайте код оброблювача для кнопки:
on (release) {
clock.alarmOn = true;
clock.startTime = getTimer();
}
Інша робота виконується кліпом clock: обертання стрілки, цокання раз у секунду й видача сигналу будильника.
Практика:Створити об'єкт Movie Clip з ім'ям clock. Намалювати білий круглий циферблат із вказівкою 0, 15, 30 і 45 секунд.
Практика:Створити об'єкт Movie Clip з ім'ям hand. Намалювати стрілку секундоміра.
Практика :Вставити стрілку в циферблат.
Практика:Розмістити готовий секундомір на головній сцені.
Практика:З теми 7 проект ship взяти звук click.wav. Перейменувати його в tick. З теми 6 взяти звук kuranty.mp3. Перейменувати його в alarm.
Практика :У контекстному меню виберіть команду Linkage... (зв'язування), у вікні, що з'явилося, відзначте прапорці Export for ActionScript і Export in frameframe, уведіть ім'я звуків відповідно tick і alarm у полеIdentifier.
Практика :Додайте до кліпу-секундоміра код оброблювача enterFrame:
onClipEvent (enterFrame) {
if ( !alarmOn ) return;
t = Number(_root.alarmTime.text);
diff = Math.round((getTimer()-startTime)/1000);
if (hand._rotation != diff*6) {
hand._rotation = diff*6;
tick = new Sound();
tick.attachSound("tick");
tick.start(0,1);
}
if (diff == t) Alarm();
}
Якщо будильник не включили, нічого робити не треба й функція закінчує роботу.
У змінну t записується числове значення встановленого часу, для перекладу із символьного рядка в число використається функція Number.
Різниця між поточним і стартовим часом переводиться в секунди з миллисекунд (розподілом на 1000) і округляється до найближчого цілого числа за допомогою функції Math.round, що ставиться до об'єкта Math (математика).
Якщо згадати, що за 1 секунду стрільця повинна повернутися на 6(=360/60) градусів, то потрібний кут повороту стрілки дорівнює diff*6. Якщо стрілку треба «довернуть», змінюємо її властивість _rotation і 1 раз програємо звук tick з бібліотеки.
Якщо різниця diff збіглася із установленим часом t, викликається функція Alarm, що ми зараз напишемо. У ній треба відключити будильник, повернути стрілку у вихідне положення й програти звук alarm з бібліотеки потрібне число раз.
Практика :Уведіть код оброблювача собятия load для кліпу-секундоміра:
onClipEvent (load) {
function Alarm() {
alarmOn = false;
hand._rotation = 0;
snd = new Sound();
snd.attachSound("alarm");
snd.start(0,_root.loops.text);
}
}
Перевірте роботу будильника.
Помітимо, що ця функція розташована в оброблювачі load, тобто вона доступна з моменту завантаження кліпу на згадку.
Періодичний виклик функції
Тепер додамо напис «Настав час вставати!», що повинна зникати через 2 секунди після початку сигналу.
Практика :Додайте динамічний текст «Настав час вставати!» на сцену з годинниками й дайте йому ім'я wakeup. Виберіть шрифт і застосуєте фільтри на ваш смак.
Спочатку цей напис треба сховати.
Практика :Додайте в код кадру 1 шаруючи Програма рядок
wakeup._visible = false;
Коли дзенькає будильник, ми відкриємо цей напис, змінивши її властивість _visible на true.
Згадаємо, що ми вже використали засіб, що дозволяє викликати функцію періодично із заданим інтервалом. Наприклад, обертання деякого кліпу qq можна організувати так:
function rot() {
qq._rotation += 10;
}
setInterval ( rot, 1000 );
Через 1000 мс (або через 1 сек) буде викликатися функція rot, так що щосекунди кліп буде повертатися на 10 градусів.
Зсылку на інтервал можна запам'ятати в змінній:
i = setInterval ( rot, 1000 );
Тоді для припинення цих викликів потрібно викликати функцію clearInterval:
clearInterval ( i );
або просто видалити з пам'яті цю змінну:
delete i;
Тепер застосуємо цей спосіб до нашого випадку.
Практика :Додайте в кінець функції Alarm рядка
_root.wakeup._visible = true;
i = setInterval ( removeText, 2000 );
Після цієї функції (усередині оброблювача події load) додайте ще одну функцію:
function removeText() {
_root.wakeup._visible = false;
delete i;
}
Перевірте роботу кліпу й збережете його.
Питання для самостійної роботи.
- Що означає властивість length об'єкта класу String ?
- Що означають методи setRGB(кольори) і getRGB() ?
- Що можна зробити зі звуком за допомогою об'єкта класу Sound ?
- Як нумеруються дні тижня й місяці в ActionScript ?