Увага. Для роботи з цією лекцією необхідні навчальні файли, які Ви можете завантажити тут.
В "Інтерфейси AсtionScript" ми розглянули деякі способи взаємодії користувача з об'єктами на екрані. Тепер ми розглянемо, як об'єкти можуть реагувати один на одного при виявленні колізій. Ціла лекція, присвячена виявленню колізій? Так, оскільки ми розповімо про багатьох супутні моменти, розібравшись в яких, ви будете прекрасно розбиратися в колізіях.
У той час, коли я створював навчальні посібники і відкриті вихідні файли в якості прикладів, багато людей надсилали мені цікаві файли, створені ними на базі основних принципів, описаних в книзі. З огляду на цей факт, я не буду використовувати складну графіку і занадто великі файли. Я розповім про деякі основні принципи, щоб ви насправді розібралися в них, після чого ви зможете випробувати свої навички на створення декількох нескладних ігор. Додайте до цього порцію вашої уяви і насолоджуйтеся програмуванням собі на втіху!
метод hitTest
Спочатку ми розповімо про найпростішому з усіх методів виявлення колізій - hitTest. Якщо ви читаєте цю книгу, то, можливо, вам уже доводилося використовувати hitTest. Так чи інакше, ми користувалися цим методом в попередній лекції, проте існує кілька способів його використання, і зараз ми їх розглянемо.
Є два способи використання hitTest. причому другий має дві можливості, разом виходить трьома різними способами роботи з hitTest. Ми розглянемо їх в порядку зростання складності.
Найбільш проста інтерпретація hitTest. як ви пам'ятаєте з попередньої лекції, така.
Тут просто перевіряється факт колізії двох фільмів. Не має абсолютно ніякого значення, на якій позиції знаходиться кожен з фільмів. Якщо два фільми перекривають один одного, буде повернуто значення "істина", в іншому випадку - "брехня". Отже, hitTest використовується майже виключно в вираженні if наступним чином.
граничні прямокутники
При використанні hitTest необхідно знати про так званих граничних прямокутниках. Це невидимі прямокутники, які повністю відповідають кордонів фільму. Верх прямокутника відповідає самому верхньому мабуть елементу фільму, низ - самому нижньому мабуть елементу, а лівий і правий краї прямокутника відповідають найдальших лівої і правої точкам фільму. Якщо ви розташуєте фільм на робочому місці і потім клацнете на ньому, щоб виділити його, ви побачите синю рамку навколо фільму (якщо ви не змінили колір рамок за замовчуванням). Це і буде прямокутник, який є кордоном фільму:
Цей граничний прямокутник є тим елементом, який використовується hitTest для перевірки колізій. З його допомогою цей процес здійснюється швидко і ефективно, проте, на жаль, у багатьох випадках він може давати досить неточні результати. За винятком випадку, коли розглядається фільм є прямокутним, тобто граничний прямокутник містить тільки сам фільм, граничний прямокутник завжди містить у собі зайве місце, крім самого фільму. Тому hitTest може нерідко виявляти колізії, коли малюнки в фільмах візуально не торкаються один одного. Ось типовий приклад описуваного випадку:
Як можна обійти цей недолік? Ніяк, якщо ви збираєтеся використовувати тільки цю версію hitTest. Це і є та ціна, яку ви платите за швидкість і простоту використання даного методу. Хоча для багатьох додатків цей спосіб цілком годиться. У невеликій грі-стрелялке, створеної нами в попередній лекції, все рухалося досить швидко, і ви не помітили б які-небудь неточності. Але уявіть собі гру, наприклад, Atari's Asteroids, де об'єкти можуть рухатися досить повільно. Ви збираєтеся підвести ваш корабель близько до краю астероїда, але тут він раптово вибухає. "Я ж його не торкався!" - скажете ви. Так, як бачите, ця версія hitTest не була б хорошим рішенням в даній ситуації.
Ви напевно використовували цей метод раніше, по крайней мере, в попередній лекції, тому ми не будемо втрачати час на розгляд прикладів з його використанням. Перейдемо до наступного способу використання hitTest.
Використання shapeFlag
Наведемо основний синтаксис для реалізації hitTest за допомогою shapeFlag.
Я знаю, що ви відразу звернули увагу на параметр shapeFlag. але не поспішайте. Давайте прочитаємо вираз зліва направо.
На початку ми бачимо movieClip_mc. який, очевидно, є ім'ям перевіряється фільму. Зауважте, що ми в цей раз перевіряємо тільки один фільм. Отже, було попадання в цьому фільмі? Відповідь є просто точкою. Ця точка визначається наступними двома параметрами x та y. Тут задаємо питання, чи знаходиться точка (x, y) всередині області фільму movieClip_mc.
Тепер переходимо до параметру shapeFlag. З його допомогою ми можемо вибирати, потрібно або не потрібно використовувати граничний прямокутник фільму. Якщо shapeFlag встановлений на значення "брехня" або 0, hitTest буде просто перевіряти, чи знаходиться точка всередині фільму. Але якщо ви встановите shapeFlag на значення "істина" або будь-який ненульовий чисельне значення, ми зможемо вийти за рамки обмежень використання способу граничних прямокутників і перевіряти, чи знаходиться точка у видимій частині фільму.
Так, цей спосіб набагато ефективніше. Використання shapeFlag в якості альтернативи методу hitTest досить широко поширене. Насправді я дуже рідко користувався hitTest без shapeFlag.
Тепер все виглядає набагато пристойніше, однак перш ніж зробити висновок, що всі наші проблеми успішно вирішені, потрібно з'ясувати, звідки беруться ці значення x і y. Згадайте, що за допомогою першого розглянутого нами способу фільм перевірявся в сопопоставленіі з іншим фільмом. Ми можемо імітувати це за допомогою використання одного фільму як фільму, що виконує функцію, а параметри _x і _y другого фільму в якості параметрів x і y hitTest. Це буде виглядати так.
Подивившись на наступний малюнок, ви зрозумієте, з якою проблемою ми зараз зіткнемося.
Влучення не буде зареєстровано, так як параметри x і y тут посилаються на центр movieClip2_mc. яка не перебуває всередині потрібної області попадання.
Отже, ми потрапили з вогню та в полум'я: Так, я люблю метафори. Я хотів би дати вам вичерпну пораду з приводу того, як обійти цю проблему, однак так і не знайшов воістину ефективного способу. Це завдання на зразок пошуку Св. Грааля: представити фільм за допомогою shapeFlag для перевірки попадання фільму. Насправді вихід існує завжди, тому не бийтеся головою об стіну, думаючи, що ви втратили щось очевидне. Я дам вам кілька порад, щоб вам було легше.
- Найважливіший момент цілком зрозумілий: всякі методи гарні в різних ситуаціях, тому поекспериментуйте з усіма трьома способами і виберіть найбільш підходящий.
- У більшості випадків, якщо у вас є великий і маленький об'єкт, найкраще використовувати великий об'єкт в якості фільму, що виконує hitTest. і маленький для надання параметрів X і Y.
- Якщо ви маєте справу з об'єктом неправильної форми, особливо якщо його розміри великі, краще викликати hitTest з цього об'єкта, так як вам потрібна форма видимої області цього об'єкта.
- Якщо у вас два більш-менш прямокутних об'єкта, використовуйте основний метод метод двох фільмів.
Це, за великим рахунком, все, що необхідно знати про hitTest. Тепер я хочу відразу перейти до більш складних методів виявлення колізій, однак якщо у вас є сумніви в тому, що ви добре розбираєтеся в різних типах hitTest. поекспериментуйте з наступною вправою до тих пір, поки не усвідомите для себе всі питання.