Архів для январь 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 Вы можете почитать тут (на английском). Она появляется ещё в некоторых случаях.