Архів для категорії ‘ActionScript 3.0’

getter/setter + (increment || decrement) = жук у компіляторі

п’ятниця, Травень 30, 2008

Маємо змінну задану за допомогою get та set функцій:

  1. var _num:Number = 0;
  2. function get num():Number
  3. {
    1. return _num;
  4. }
  5. function set num(value:Number):void
  6. {
    1. _num = value;
  7. }

Створюємо іще одну змінну:

var num2:Number = num++;

Отримуєм помилку компіляції:

1067: Implicit coercion of a value of type void to an unrelated type Number.

Вважаю що виходить так:

var num2:Number = set num(get num() +1);

А так як результат set num() є void, то ми і отримуємо помилку.

flash.trace.Trace

понеділок, Травень 26, 2008

Так, є такий клас, дуже непримітний, але може бути дуже корисним :)

Він робить дивовижну річ. Після “запуску” видає в output імена УСІХ! методів які виконуються, з іменами класів, до яких належать ці методи. Клас не документовано, тобто як з ним працювати не знаю (google теж нічого не каже), але методами спроб та помилок щось таки вдалось зрозуміти.

Ось усі його методи (клас статичний, тобто усі методи статичні):

  • Trace.setLevel(l:int, target:int=2):Object
  • Trace.getLevel(target:int=2):int
  • Trace.setListener(f:Function):Object
  • Trace.getListener():Function;

Trace.setLevel(l:int, target:int=2):Object

Виставляє рівень віщування, та ціль віщування.

Першим параметром може бути одна з констант:

  • Trace.METHODS_AND_LINES_WITH_ARGS = 4
    • Назва методу з вхідними параметрами та номер строчки в коді зі шляхом до класу, в якому виконався метод
  • Trace.METHODS_AND_LINES = 3
    • Назва методу та номер строчки
  • Trace.METHODS_WITH_ARGS = 2
    • Назва методу з вхідними параметрами
  • Trace.METHODS = 1
    • Тільки назва методу
  • Trace.OFF = 0
    • Вимкнуто

Другим параметром може бути:

  • Trace.LISTENER = 2
    • Віщувати у функцію, яка буда додана, за допомогою setListener().
  • Trace.FILE = 1
    • Віщувати у output.

Trace.getLevel(target:int=2):int

Повертає рівень віщування для цілі.

Trace.setListener(f:Function):Object

Виставляє функцію для віщування при цілі віщування = Trace.LISTENER.

Функція має приймати 4 параметри:

  1. private function traceListener(
    1. fileInfo:String,
    2. lineNumber:String,
    3. classAndMethod:String,
    4. methodArguments:String
  2. ):void

fileInfo - тека, де знаходиться файл + “;” + щось іще (в мене була пуста строчка) :) + “;” + ім’я файлу.

Приклад: “D:\Projects\ForTestsF3\src;;ForTestsF3.mxml”

lineNumber - номер строчки

classAndMethod - повне ім’я класу + (”/” || “$/” ) + ім’я методу.

Приклади: “flash.display::DisplayObjectContainer/addChild”

“flash.trace::Trace$/setListener” - “$/” використовується, якщо визваний метод - статичний

methodArguments -вхідні параметри методу, розділені комою (,). Але якщо параметри методу задано за допомогою rest оператору (…), то вони показані не будуть.

Trace.getListener():Function

Повертає заданий раніше лістенер.

Ось приклад:

  1. import flash.trace.Trace;
  2. function test(t:String):String
  3. {
    1. return t;
  4. }
  5. Trace.setLevel(Trace.METHODS_WITH_ARGS, Trace.FILE);
  6. var st:String = “hello!”;
  7. test(st);
  8. stop();

В output отримаєте:

  1. 14554003 AVMINF: MTHD Untitled_fla::MainTimeline/test (”hello!”) @ 0×042F0300
  2. 4554004 AVMINF: MTHD flash.display::MovieClip/stop () @ 0×0EF004D0

Дуже дякую 7thsky за допомогу!

Як за допомогою [embed] вбудувати swf з кодом

п’ятниця, Березень 21, 2008

Ми знаємо, що при вбудуванні swf за допомогою теґу [Embed] увесь код, який був у swf-ці, втрачається. Є один спосіб як зберегти код.

Спочатку створимо у Flash IDE флешку, головним класом якої буде, наприклад, assets.Flea. В цьому класі є метод startJumping(), який просто починає програвання флешки. Назвемо файл flea.swf.

Тепер вбудуємо flea.swf в будь-який клас у Flex-проекті:

  1. [Embed(”assets/flea.swf”, mimeType=”application/octet-stream”)]
  2. private var FleaAsset:Class;

mimeType=”application/octet-stream” дає зрозуміти компілятору Flex, що вбудування потрібно робити без будь-якої конвертації даних.

Тепер в FleaAsset ми маємо клас ByteArrayAsset, тобто, практично ByteArray.

Далі завантажуємо екземпляр FleaAsset до Loader за допомогою loadBytes():

  1. var currLoader:Loader = new Loader();
  2. var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
  3. currLoader.loadBytes( new FleaAsset(), ldrContext );

ldrContext ми використовуємо, щоб бути впевненими, що клас, який знаходиться в FleaAsset буде тим самим, що і в Flex проекті.

Далі, щоб клас із FleaAsset з’явився для нашого використання, нам потрібно почекати один кадр. Це не дуже добре, але як це обійти я не знаю.

  1. var sprite:Sprite = new Sprite();
  2. sprite.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

Далі, ми просто створюємо екземпляр класу assets.Flea та використовуємо його як забажаємо. Уся графічна частина цього класу, яку ми створили у Flash IDE, буде присутня :)

  1. import assets.Flea;
  2. function enterFrameHandler(event:Event):void
  3. {
    1. var flea:Flea = new Flea();
    1. addChild(flea);
    1. flea.startJumping();
    2. sprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
  4. }

Я зробив приклад такої собі бібліотеки, яка може спростити роботу з убудованими swf.

Щоб знати більше раджу почитати це (англійською):

DisplayObjectContainer.removeAllChildren()

середа, Березень 19, 2008

Я практично впевнений, що Ви хоч раз шукали метод removeAllChildren() у DisplayObjectContainer :)

Ось, на мою думку, найелегантніша реалізація (підказали Адобовці):

  1. public function removeAllChildren():void
  2. {
    1. while (numChildren > 0)
      1. removeChildAt(0);
  3. }

E4X синтаксис для не XML

п’ятниця, Березень 14, 2008

При використанні синтаксису E4X для не XML об’єктів, компілятор Вам нічого не скаже, але в run-time отримаєте помилку.

var obj:Object = {a:1};
trace( obj.(a == 1) );

TypeError: Error #1123: Filter operator not supported on type Object.