Як зробити повний stop () мувікліп

Як зробити повний stop () мувікліп

Одного разу зіткнувся я з проблемою - потрібно зупинити мувікліп перед тим, як покласти його назад в пул. Щоб гад не крутився там в небутті і не жер ресурси. Однак метод stop () зупиняє тільки таймлайн самого мувікліпа, а все мувікліп-діти, які на ньому крутяться - продовжують крутитися. Наприклад, якщо у вас є кліп «танк», в якому є анімація крутіння гусеницями, але додатково в ньому є кліп «чоловічок в люку», який махає прапорцем. Те після методу stop () на танку гусениці зупиняться. А маленька людина махає і махає, махає і махає. Танк може вже видалили, але поки його не зачистив гарбадж колектор - він махає і махає, проц напружується і напружується. А якщо у вас реалізований пул танків, то сотні танків в пулі і на кожному чоловічок махає і махає прапорцем ... Ужос!

Як зробити повний stop () мувікліп

Зрозуміло, що треба робити метод, який ієрархічно оббігає все це господарство і робить йому stop (). У разі танка, до речі, теоретично, якщо у вас архітектурно-оопешно в коді все правильно зроблено, то, по ідеї, танк знає про чоловічка і стоп повинен бути не універсальна для всіх кліпів, а реалізований в класі танк. Адже, можливо треба крім стопа анімації чоловічка додатково відключити йому мізки (відв'язатися від квантів або ентерфрейм у кого гірше зроблено). Мізки то теж жеруть ресурси в небутті.

Однак, є маса місць, де добре б мати універсальний метод зупинити намертво все анімації. Наприклад, якщо у вас view для юніта не пов'язане з логікою. Ну типу це художник так зробив, як зручно - не всі анімації в одному таймлайне і гусениці і прапорець. А ієрархічно. Тут можна поміркувати про Graphic vs MovieClip у FlashIDE, але це окрема тема. Досить того, що повно ситуацій коли варіант view складені, але з логікою не пов'язане. Наприклад в складній системі анімованих меню.

І ось, нарешті. Ми можемо зробити універсальний статичний утиліти метод в якомусь класі MovieClipUtility який використовувати кожен раз, коли треба намертво застопорити мувікліп. А можна додати самому в клас MovieClip такий відсутній метод stopAll () (ау адоби!). Я роблю це так - метод upgradeMovieClip смикаю на самому початку конструктора головного класу гри. І все. Тепер можна смикати у кліпів метод stopAll ().

Може комусь стане в нагоді. Або покритикуйте.

Цікаво, візьму собі в скарбничку. Хоча розширювати MovieClip - не найкраща ідея, мені здається. Можуть виникнути проблеми із сумісністю в майбутніх версіях апі.

ну обізву метод не stopAll а myStopAll, customStopAll або навіть elmortemHardStopAll :) - конфлікту точно уникнеш.

1) Тоді мова не про DisplayObject, а DisplayObjectContainer. Метод stopAll приймає як параметр будь DisplayObjectContainer. Але мені жодного разу не було потрібно. Просто якщо у вас є view, то правильно буде якщо його художник компонує (розміщує гусениці, шасі ітд). І швидше за все він буде це робити в FlashIDE. А звідти приходять до нас мувікліп. Ще, в такому варіанті метод можна смикати і з кадрів в IDE. Правда працювати він буде вже тільки в компіляції.

2) Ок - нехай у мене є TankMC - мувікліп з бібліотеки. Там всередині художник в ієрархії використовував мувікліп прапора. Нехай як ви просите - у мене ігровий об'єкт Tank успадкований від BaseObject, він підписується на REMOVED_FROM_STAGE і все таке. При видаленні з дісплейліста Tank зробить stop () свого TankMC. А прапор продовжує махати. Те-є все одно треба пробігати по ієрархії TankMC і гасити stop () всім хто попався. Або заздалегідь один раз пробігти і навісити кожному лістенер на REMOVED_FROM_STAGE що жесть.

я звичайно не перевіряв, але думаю що це дуже не швидкі операції, особливо якщо об'єктів багато - і лістенеров багато. Купи операцій виділення пам'яті (не думаю що для лістенеров є пули), вставка \ видалення ... все це засмучує процесор.

Крім оверхедів, можу навести приклад. Припустимо, у вас є літак. Він летить-летить і сідає на авіаносець. У коді ви його відстебнув від глобального рута і пристебнули до авіаносця. Тепер куди-б не поплив авіаносця - літак залишився стояти на посадочній площадці. Логічно? Логічно. У вашому підході в момент removeChild все анімації літака замруть. Нам це не треба.

Схожі статті