Архів для категорії ‘Спіймані блохи’

MovieClip з “кнопковими” назвами кадрів (_up, _over, _down) перестає бути “чистим” MovieClip’ом

вівторок, Грудень 11, 2007

Якщо в MovieClip’і є кадр з назвою ‘_up’ та/або ‘_over’ та/або ‘_down’, то флеш при компіляції генерує клас для цього MovieClip’у, щоб він міг працювати як SimpleButton. Це можна перевірити подивившись результат методу toString() або функції getQualifiedClassName().

Ця поведінка доволі логічна, тільки мені не зрозуміло одне: якщо для того щоб MovieClip працював як SimpleButton потрібен клас, який реалізує цю можливість, то де приховується ця реалізація коли ми самі визначаємо клас для MovieClip’а в Linkage Properties?

Парадокс з NaN

понеділок, Грудень 10, 2007

НеЧисло є Числом:

trace(NaN is Number); // true

Так, про це пишуть в документації, але це трохи не логічно :)

Має місце тільки в ActionScript 3.0

Не правильне використання ExternalIntarface призводить до його, майже непомітного, падіння

середа, Грудень 5, 2007

Маємо (завантажити приклад):

  1. Дві функції в JavaSript: jsFunc_1 та jsFunc_2.
  2. Дві функції в ActionScript: asFunc_1 та asFunc_2.
  3. Для ActionScript функції додано колбеки через ExternalInterface.addCallback().
  4. В функції jsFunc_1 є виклик asFunc_1.
    В функції asFunc_1 є виклик jsFunc_2.
    В функції jsFunc_2 є виклик asFunc_2.
    Тобто якщо викликати jsFunc_1, то повинен бути такий ланцюг викликів: jsFunc_1 > asFunc_1 > jsFunc_2 > asFunc_2.

Блоха з’являється на другій ланці. При спробі викликати jsFunc_2 нічого не відбувається. Ніякої помилки ні в ActionScript ані в JavaScript немає. І тільки ExternalInterface.call() при цьому Вам поверне null. Але якщо JavaScript функція нічого не повинна повертати, то цей результат не викличе підозри на помилку.

Вирішення:

Уникайте подібних ланцюгів викликів використовуючи, наприклад, setTimeout(), як в цьому прикладі.
Але й тут будьте обережні! Викликати ExternalInterface.call() через setTimeout() не можливо. Отримаєте помилку “SecurityError: Error #2000: No active security context.”. Тож Вам треба буде створити ще одну функцію.

swapDepths + prevFrame = duplicateMovieClip

понеділок, Листопад 19, 2007

У нас є:

  1. .fla файл (AS2.0) з блохою (мувікліп з ім’ям flea на сцені).
  2. Код у першому кадрі:
    flea._x = 113; // щоб побачити ефект
    flea.swapDepths(1000);
    gotoAndStop(3);
  3. Код у третьому кадрі:
    prevFrame();

Маємо:

Ще однин, такий самий, мувікліп.

Чому?

Перше, що приходить до мозку: при переході на попередній кадр Flash player чомусь не бачить, що кліп вже існує (бо він змінив глибину), але на таймлайні він повинен бути, і Flash player вирішує створити ще примірник.

Зауважте, що якщо в першому кадрі змінити ім’я мувікліпа (_name), то на другому кадрі отримаємо два, так якби ми створили дублікат. Але усі властивості будуть такіж самі, як на першому кадрі.

Цей ролик потребує Flash Player 9

Завантажити приклад

Оновлення від 22 листопада 2007 р.

Ми знаємо, що коли ми кладемо символ з бібліотеки на сцену (в Flash IDE), то у цього символа глибина буде від’ємна. Тож, якщо ми в поданому прикладі перекладемо мувікліп на від’ємну глибину, то ефекту дублювання не буде. Тобто, Flash Player “дивиться” тільки на від’ємні глибини. Спіймати блоху допоміг Ілля Панін. Велика йому дяка! :)

Ми також знаємо, що на мувікліп, що лежить на від’ємній глибині, не діє функція removeMovieClip(). Але теж саме має місце також і для дуже великих глибин. Але тут іще одна блоха. За словами адобовців ми маємо у своєму роспорядженні 16000 шарів. Але, навіть, при глибині 1000 000 000 (один мільярд) мувікліп відаляється (це не каже, що в інших випадках, крім видалення, все буде працювати). Більше того, я виявив, що немає чіткої числовой межі, коли мувікліп відаляється, а коли ні. Наприклад, на глибині 2 130 690 031 - видаляється, на одиницу вище вже не видаляється, а приблизно з 6-ти мільярдів знову видаляеться. Найвища глибина, що я знайшов, на якій відаляються - 199 699 185 647. Ще було помічено, що віставляючи велику глибину, мувікліп насправді опинявся на іншій, коли можливо видалати - на додатній, коли не можливо - від’ємній глибині (тому і не можливо відалити :) ).

Нескінченність

четвер, Листопад 15, 2007

Swf може завантажувати сама себе.
А якщо не створювати укладеність, то це можна робити безкінечно. (З укладеністю 256 разів).
Діє як в ActionScript2.0 так і в 3.0.

Цей ролик потребує Flash Player 9

Завантажити приклад