Хитрости одной строкой #1
Ввожу новую рубрику – хитрости одной строкой. В ней буду писать сразу о нескольких маленьких хитростях, т.к. выделять для каждой отдельный пост это слишком жирно будет)
Итак, поехали.
Очистка массива
Если нужно очистить весь массив то не надо использовать 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, поэтому приходится делать лишние преобразования структур…

Май 11th, 2010 at 6:48
Отчистить массив можно еще вот так:
myArray = [];
И букав меньше, и производительность больше.
Май 11th, 2010 at 10:23
Хм.. Очищать весь массив не то что “сплайсом”, да и “попом” в цикле – это некомильфо.
Как на счет myArray = [];
P.S. AS3
Май 11th, 2010 at 10:32
myArray.splice(0);
Май 11th, 2010 at 11:02
Да, вы правы, так наверно даже лучше будет. Всё время забываю что в AS3 есть garbage collector ))
Поправил в тексте поста.
Май 11th, 2010 at 13:14
))Олег ещё вариант напиши:
myArray.length=0
Май 11th, 2010 at 13:28
myArray = [];
и
myArray = new Array();
не одно и тоже?
зачем всё оставлять на совесть gc, когда можно всё ручками?
не понимаю, разъясните
Май 12th, 2010 at 0:55
jk дело в том что первым случаем ты назначаешь элементы данному массиву, а вторым способом резервируешь заного память и создаешь новый экземпляр класса Array. В общем всячески избегай второго случая
Май 12th, 2010 at 1:20
Думаю не всё так просто. []- по сути это константный массив. Мы присваиваем 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]);
Май 12th, 2010 at 1:32
Кстати я тут подумал по идее
myArray.splice(0)
делает тоже что и я написал в начале –
while(myArray.length > 0) myArray.pop();
Только за нас это делает внутренняя функция Array.
Июнь 18th, 2010 at 6:46
if(myMovieClip) if(myMovieClip.parent) myMovieClip.parent.removeChild(myMovieClip);
Не бойтесь объединять if’ы в коде, || и && – ленивые.
if (myMovieClip && myMovieClip.parent) myMovieClip.parent.removeChild(myMovieClip);
Июнь 30th, 2010 at 0:47
и всё-же, возвращаясь к разнице
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 = [] – создание нового пустого массива