Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=101)
-   -   ActionScript 3 Tips and Tricks (http://www.flasher.ru/forum/showthread.php?t=85645)

MerlinTwi 16.10.2006 12:51

40. Событие Render
 
В AS3 добавлено новое событие Event.RENDER (flash.events.Event.RENDER), которое рассылается после enterFrame, но перед тем, как экран флеш-плеера обновится. Это событие не генерится автоматически, его нужно активировать самостоятельно, вызвав метод stage.invalidate(); (flash.display.Stage.invalidate()), после чего, перед обновлением экрана все объекты приаттаченные на stage (и только они) получат событие Event.RENDER. Если флэш плеер не занимается рендерингом (например окно минимизировано в таск бар), то Event.RENDER не рассылается.

Пример:
Код:

var sprite:Sprite = new Sprite();
stage.addChild(sprite);

sprite.addEventListener(Event.ENTER_FRAME, enterFrame);
sprite.addEventListener(Event.RENDER, render);
stage.addEventListener(MouseEvent.CLICK, click);

function enterFrame(event:Event):void {
    trace("enter frame");
}
function render(event:Event):void {
    trace("render");
}
function click(event:MouseEvent):void {
    trace("click");
    stage.invalidate();
}

Output:
Код:

enter frame
enter frame
enter frame
click
enter frame
render
enter frame
enter frame
enter frame
enter frame
...


MerlinTwi 16.10.2006 12:52

47. Картинки из библиотеки (library)
 
Еще во Flash 8 была добавлена возможность загрузить картинку из библиотеки (library) используя linkage ID и метод BitmapData.loadBitmap(). В ActionScript 3 это делается несколько иначе, т.к. все мувиклипы, фреймы и объекты в библиотеке ассоциированы с классами. Классы для картинок в библиотеке являются потомками BitmapData ( flash.display.BitmapData) и перед добавлением картинки к какому-либо визуальному объекту нужно ее связать с классом Bitmap (flash.display.Bitmap), поскольку непосредственно BitmapData приаттачить нельзя.
В качестве примера, добавьте в библиотеку картинку, в диалоге linkage поставьте галочку «Export for ActionScript» и укажите название класса «RomeImage» (этот класс будет сгенерирован автоматически при публикации SWF). Далее нужно написать код для добавления этой картинки на экран:
Код:

// создаем класс RomeImage с содержимым картинки
var romeImageData:RomeImage = new RomeImage();

// Создаем Bitmap на основе нашей картинки
var romeImageBitmap:Bitmap = new Bitmap(romeImageData);

// и добавляем этот Bitmap на экран
addChild(romeImageBitmap);


MerlinTwi 16.10.2006 13:08

48. Изменения в typeof
 
Оператор typeof позволяет узнать базовый тип любого объекта/переменной. Это не информация о классе, а просто тип переменной связанной с объектом. Для детальной информации о классе следует использовать instanceof, getQualifiedClassName, describeType.
В ActionScript 1 и 2, typeof возвращал такие значения:
  • boolean
  • function
  • movieclip
  • null
  • number
  • object
  • string
  • undefined
ВActionScript 3 typeof возвращает:
  • boolean
  • function
  • number
  • object
  • string
  • xml
  • undefined
Убрали MovieClip и null, теперь это тоже самое, что object. Добавили xml. Новые типы переменных int и uint распознаются как number. И простейшие типы переменных boolean, number, string, созданные через конструктор распознаются правильно, а не как object, как было в AS1/AS2.
Код:

// AS1 & AS2
trace(typeof new XML()); // object

trace(typeof my_mc); // movieclip

trace(typeof null); // null

trace(typeof true); // boolean
trace(typeof 1); // number
trace(typeof ""); // string

trace(typeof new Boolean()); // object
trace(typeof new Number()); // object
trace(typeof new String()); // object

Код:

// AS3
trace(typeof new XML()); // xml

trace(typeof my_mc); // object

trace(typeof null); // object

trace(typeof true); // boolean
trace(typeof 1); // number
trace(typeof ""); // string

trace(typeof new Boolean()); // boolean
trace(typeof new Number()); // number
trace(typeof new String()); // string

trace(typeof int(1)); // number
trace(typeof uint(1)); // number


MerlinTwi 17.10.2006 12:06

49. getBounds() и getRect()
 
Как и в ActionScript 1 и 2, в ActionScript 3 есть метод getBounds() (flash.display.DisplayObject.getBounds()), который вычисляет границу мувиклипа в системе координат любого объекта на timeline. Но в ActionScript 3 метод getBounds возвращает Rectangle (flash.geom.Rectangle) вместо Object со свойствами xMin, xMax, yMin, yMax, как это было раньше.
В ActionScript 3 еще добавлен новый метод getRect() (flash.display.DisplayObject.getRect()), который выполняет аналогичную задачу, но в отличие от getBounds не учитывает толщину линий (strokes on shapes).
В качестве наглядного примера, красный прямоугольник высчитывается по getBounds, а синий по getRect:
Код:

var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0x999999);
sprite.graphics.lineStyle(10, 0x333);
sprite.graphics.drawCircle(100, 100, 50);
sprite.graphics.endFill();
addChild(sprite);

addChild(createRectShape(sprite.getRect(this), 0x0000FF));
addChild(createRectShape(sprite.getBounds(this), 0xFF0000));

function createRectShape(rect:Rectangle, color:uint):Shape {
    var rectShape:Shape = new Shape();
    rectShape.graphics.lineStyle(0, color);
    rectShape.graphics.drawRect(rect.left, rect.top, rect.width, rect.height);
    return rectShape;
}


MerlinTwi 17.10.2006 12:19

50. Разница между for..in и for each..in
 
В ActionScript 3 добавлен новый вид цикла for each..in который работает аналогично прежнему for..in, но перебираются значения объекта, а не ключи. Пример:
Код:

var object:Object = new Object();
object.name = "senocular";
object.id = 2867;
object.isModerator = true;
for each (var value:* in object){
    trace(value);
}
/* Output:
true
2867
senocular
*/

// А прежний for..in:
for (var key:String in object){
    trace(key + ": " + object[key]); // object[key] is value
}
/* Output:
isModerator: true
id: 2867
name: senocular
*/

Учтите, в цикле for each..in нельзя получить значение ключа.
Так же обратите внимание, что ActionScript 3 в циклах (for..in и for each..in) сохраняет порядок элементов в массиве, а ActionScript 1 и 2 перебирал в порядке обратном добавлению элементов. См. пример:
Код:

var array:Array = new Array();
array[1] = 1;
array[0] = 2;
array[2] = 3;
for (var key:String in array){
    trace("array[" + key + "] = "+ array[key]);
}

Output AS 1 & AS 2:
Код:

array[2] = 3
array[0] = 2
array[1] = 1

Output AS 3:
Код:

array[0] = 2
array[1] = 1
array[2] = 3


MerlinTwi 17.10.2006 12:25

51. Значения по умолчанию для параметров функции
 
ActionSript 3 дает возможность присвоить значения по умолчанию для параметров функций. Такие параметры становятся необязательными при вызове функции.
Код:

function method(required:String, optional:String = "default"):void {
    trace(required +" "+optional);
}
method("Hello"); // "Hello default"

Необязательные параметры со значениями по умолчанию должны стоять после обязательных параметров.
Код:

// Так неправильно:
function method(required:String = "default", optional:String):void { ... }
// [Compiler] Error #1138: Required parameters are not permitted after optional parameters.


MerlinTwi 18.10.2006 12:18

52. Неопределенное количество аргументов
 
Для того, чтобы в ActionSript 3 функция могла принимать любое количество аргументов необходимо использовать специальный параметр три точки
«... название_переменной» (Keyword: ...(rest)), который всегда располагается последним, после перечисления обязательных аргументов. Переданные аргументы записываются в указанную переменную в виде массива:
Код:

usingRest(1, 2, 3, 4);
function usingRest(required:Number, ... optionalArgs):void {
    trace(required); // 1
    trace(optionalArgs); // [2, 3, 4]
}


MerlinTwi 18.10.2006 12:25

53. arguments
 
В ActionScript 3, как и в ActionScript 1 и 2, любая функция содержит arguments (Top level arguments), куда в виде массива записываются все переданные аргументы. Но в ActionScript 3 убрали свойство arguments.caller, для получения ссылки на вызвавшую функцию советуют передавать эту ссылку самостоятельно в виде аргумента функции.
Код:

args("a", 1);
function args(str:String, num:Number):void {
    trace(arguments); // ["a", 1]
}


MerlinTwi 18.10.2006 13:06

54. Поддержка пространства имен (Namespaces)
 
ActionScript 3 поддерживает пространство имен (namespaces) в классах по аналогии с namespaces в XML. Пространство имен можно сравнить с пакетами (packages), поскольку пакеты позволяют создать несколько различных классов с одинаковым названием, но описанных в разных пакетах, так и пространство имен дает возможность определить несколько разных методов и свойств с одним названием внутри одного класса.
Для использования пространства имен необходимо этому пространству присвоить уникальное название с помощью ключевого слова namespace (namespace Keyword). После объявления пространства имен его название можно использовать аналогично public, private…
Пример:
Код:

package {
   
    public class UsingNameSpaces {
       
        public namespace company;
        public namespace individual;
       
        company var value:int = 10;
        individual var value:int = 2;
       
        public function UsingNameSpaces(){
        }
       
        company function showValue() {
        }
       
        individual function showValue() {
        }
    }
}

Здесь было объявлено два пространства имен «company» и «individual», которые использовались для разделения свойств «value» и методов «showValue», которые хоть они и имеют одинаковые названия, конфликта не возникает, поскольку расположены в разных пространствах имен.
При объявлении пространства имен можно дополнительно указать URI.
Код:

package {
   
    public class UsingNameSpaces {
       
        public namespace company = "http://www.example.com/company";
        public namespace individual = "http://www.example.com/individual";
       
        company var value:int = 10;
        individual var value:int = 2;
       
        public function UsingNameSpaces(){
        }
       
        company function showValue() {
        }
       
        individual function showValue() {
        }
    }
}


MerlinTwi 18.10.2006 13:18

55. Оператор (::) для уточнения пространства имен
 
При вызове метода класса, или обращении к свойству, описанному внутри пространства имен, необходимо уточнить из какого именно пространства имен нужно вызвать метод. Один из способов сделать это - использовать оператор :: (name qualifier operator). Указываете название пространства имен, два двоеточия и название метода (namespace::member).
Код:

package {
   
    public class UsingNameSpaces {
       
        public namespace company = "http://www.example.com/company";
        public namespace individual = "http://www.example.com/individual";
       
        company var value:int = 10;
        individual var value:int = 2;
       
        public function UsingNameSpaces(){
            company::showValue(); // traces 10
            individual::showValue(); // traces 2
        }
       
        company function showValue() {
            trace(company::value);
        }
       
        individual function showValue() {
            trace(individual::value);
        }
    }
}

Несмотря на то, что метод showValue расположен внутри такого же пространства имен, что и выводимое свойство value, необходимо уточнять пространство имен.


Часовой пояс GMT +4, время: 02:33.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.