Архів для Січень 17, 2008

Блоха з DisplayObject.alpha

четвер, Січень 17, 2008

Ми всі знаємо, що DisplayObject.alpha в ActionScript 3.0 працює з числами від 0 до 1. Але:

  1. DisplayObject.alpha приймає числа з рухомою комою від -128 до 127.
  2. DisplayObject.alpha має тип Number, але в нього така-ж поведінка при переповненні як і в int. Тобто якщо Ви подасте значення 128, то alpha буде дорівнювати -128.
  3. Якщо alpha більше ніж 1, то по краях усіх Bitmap-ів будуть помітні неприємні артефакти.

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

  4. Оновлення: Якщо для контейнеру виставляти alpha, наприклад, 0.5, а для його дитини 127/2, то дитина не буде прозора. Добто тут має місце компенсація прозорості. Але вона перестає діяти, якщо у контейнера alpha дорівнює 0. На прикладі зрозуміліше (потягайте повзунок):

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

    Дякую за підказку Іллю Паніна.

Оператор if керує поведінкою компілятора :)

четвер, Січень 17, 2008

Якщо в тілі умовного оператора є не серьозна помилка, а умова така, що тіло ніколи не виконається, то компілятор нічого не скаже про помилку.

Приклад:

var t:Number;
if (false){
	t = "hello";
}

Якщо Ви змінете false на true, то отримаєте помилку “1067: Implicit coercion of a value of type String to an unrelated type Number.”.

Це стосується тільки ActionScript 3.0, тобто така поведінка має місце в Flash CS3 та Flex Builder 2. В ActionScript 2.0 такої блохи немає.

Також це не стосується умовного оператора ?:.

Оновлення: 

Деякі не серьозні помилки можуть призвести до такої-ж поведінки як в попередній блосі.

var t:Number;
if (false){
	1 == null;
}

Умовний оператор ?: та оператор віднімання не товаришують

четвер, Січень 17, 2008

Маємо наступний код:

  1. trace(”begin”);
  2. var bool:Boolean = true;
  3. var flea:Number = -(bool ? 10 : 20);
  4. trace(”flea: “+flea.toString());

При спробі компіляції у Flex 2 ви отримаєте

“An internal build error has occurred. Please check the Error Log.” або

“1131: Classes must not be nested.”. Тобто, нічого працюючого Ви не отримаєте.

А Flash Вам взагалі нічого не скаже, але в output Ви не побачите навіть “begin”.

Це стосується тільки ActionScript 3.0. В ActionScript 2.0 наведений код скомпілюється як треба.

P.S. Про наведену помилку у Flex 2 Ви можете почитати тут (англійською). Вона трапляється іще в декількох випадках.