Хитрости одной строкой #1

Май 11th, 2010 автор: Oleg Antipov

Ввожу новую рубрику – хитрости одной строкой. В ней буду писать сразу о нескольких маленьких хитростях, т.к. выделять для каждой отдельный пост это слишком жирно будет)

Итак, поехали.

Очистка массива
Если нужно очистить весь массив то не надо использовать splice или pop и удалять поэлементно, достаточно написать (спасибо комрадам в комментах что подсказали):

myArray = [];

или

myArray.splice(0);

или

myArray.length=0;

Удаление мовиклипа из контейнера
По началу при разработке нового проекта я сильно затупил и начал сохранять в самом классе мовиклипа ссылки на хранящий его контейнер. Чтобы потом его правильно удалить. Но потом вспомнил что есть магическое свойство parent! Возможно кого-то тоже натолкнёт на путь истинный:

if(myMovieClip) if(myMovieClip.parent)  myMovieClip.parent.removeChild(myMovieClip);

Преобразование координат из пространства одного мовиклипа в пространство другого
Да, довольно часто приходится это делать. Для этого во флеше есть два замечательных метода у мовиклипов localToGlobal и globalToLocal. Они делают соответствующее преобразование координат из пространства мовиклипа в пространство сцены (Stage, т.е. где основной таймлайн флешки) и обратно. Следовательно чтобы преобразовать координаты из пространства одного мовиклипа в пространство другого надо:

var newXY:Point= MovieClipTo.globalToLocal(
                          MovieClipFrom.localToGlobal(new Point(old_x,old_y)));

Преобразуем координаты (old_x,old_y) мовиклипа MovieClipFrom в координаты newXY мовиклипа MovieClipTo. Одно плохо – эти методы работают с классом Point, поэтому приходится делать лишние преобразования структур…

Категория: Хитрости

11 Комментариев

  1. Стёпа

    Отчистить массив можно еще вот так:

    myArray = [];

    И букав меньше, и производительность больше.

  2. Claymore

    Хм.. Очищать весь массив не то что “сплайсом”, да и “попом” в цикле – это некомильфо.

    Как на счет myArray = [];

    P.S. AS3

  3. Platon

    myArray.splice(0);

    :|

  4. Oleg Antipov

    Да, вы правы, так наверно даже лучше будет. Всё время забываю что в AS3 есть garbage collector ))

    Поправил в тексте поста.

  5. Zloba

    ))Олег ещё вариант напиши:
    myArray.length=0

  6. jk

    myArray = [];
    и
    myArray = new Array();

    не одно и тоже?
    зачем всё оставлять на совесть gc, когда можно всё ручками?
    не понимаю, разъясните

  7. Zloba

    jk дело в том что первым случаем ты назначаешь элементы данному массиву, а вторым способом резервируешь заного память и создаешь новый экземпляр класса Array. В общем всячески избегай второго случая

  8. Oleg Antipov

    Думаю не всё так просто. []- по сути это константный массив. Мы присваиваем myArray ссылку на пустой массив. Вполне возможно что там происходит выделение памяти,т.к. иначе бы, если не происходило выделение памяти под массив:

    myArray1 = [2,4,56,45];
    myArray2 = [2,4,56,45];
    myArray1.push(33);

    тогда myArray2 содержал бы тоже 33, но это же не так.
    Поэтому я думаю что операция

    myArray = [2,4,56,45];

    Эквивалентна

    myArray = new Array([2,4,56,45]);

  9. Oleg Antipov

    Кстати я тут подумал по идее
    myArray.splice(0)
    делает тоже что и я написал в начале –

    while(myArray.length > 0) myArray.pop();

    Только за нас это делает внутренняя функция Array.

  10. James Nouk

    if(myMovieClip) if(myMovieClip.parent) myMovieClip.parent.removeChild(myMovieClip);

    Не бойтесь объединять if’ы в коде, || и && – ленивые.

    if (myMovieClip && myMovieClip.parent) myMovieClip.parent.removeChild(myMovieClip);

  11. Jroslav.K

    и всё-же, возвращаясь к разнице
    myArray = [];
    и
    myArray = new Array();
    ****************

    провел тест

    var arrA:Array = new Array(["f", "l", "a", "s", "h"]);
    var arrB:Array = arrA;

    tracing();

    arrA = [];

    tracing();

    function tracing():void
    {
    trace(”—————-”);
    trace(”size of arrA: ” + getSize(arrA));
    trace(”size of arrB: ” + getSize(arrB));

    trace(”arrA === arrB: ” + String(arrA === arrB));
    }
    ****************

    его результат

    —————-
    size of arrA: 36
    size of arrB: 36
    arrA === arrB: true
    —————-
    size of arrA: 32
    size of arrB: 36
    arrA === arrB: false

    ****************

    вывод: a = [] – создание нового пустого массива

Оставить комментарий