Вход

Просмотр полной версии : JSFL - Дублирование клипов из библиотеки


vitlance
10.06.2008, 20:50
Знатоки JSFL..

Такая задача:

this.createEmptyMovieClip("tile",13);
for (i=1;i<=1000;i++){
mc_type = random(30);
tile.attachMovie("ps"+mc_i,"ps"+i,i);
tile["ps"+i]._x = random(300);
tile["ps"+i]._y = random(300);
tile["ps"+i]._rotation = random(360);
}


Помогите плз организовать такое на JSFL

vitlance
11.06.2008, 08:52
Или подкинте пожалуста хорошую статью по JSFL с примерами..

iNils
11.06.2008, 14:53
if (!fl.getDocumentDOM().library.itemExists("tile")) {
fl.getDocumentDOM().library.addNewItem("movie clip", "tile");
}
fl.getDocumentDOM().library.editItem ("tile");
for (i = 1; i < 1001; i++){
obj = {};
obj.x = (Math.random () * 300) >> 0;
obj.y = (Math.random () * 300) >> 0;
angle = Math.random () * 360 * Math.PI / 180;
fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + (Math.random () * 30) >> 0);
fl.getDocumentDOM().selectAll();
sel = fl.getDocumentDOM().selection[0];
matrix = sel.matrix;
matrix.a = Math.cos (angle);
matrix.b = Math.sin (angle);
matrix.c = -Math.sin (angle);
matrix.d = Math.cos (angle);
sel.matrix = matrix;
}

vitlance
11.06.2008, 18:14
Чего-то то он пишет ошибку:
At line 14 of file "super.jsfl":
TypeError: sel has no properties

iNils
11.06.2008, 20:00
Никаких ошибок не должно быть, проверяйте как скопировали. Тем более в строчке 14 вообще нет sel.
Только строчку
fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + i); замените на
fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + (Math.random () * 30) >> 0);

vitlance
11.06.2008, 23:23
Никаких ошибок не должно быть, проверяйте как скопировали. Тем более в строчке 14 вообще нет sel.
[/CODE]

Я просто добавил там ещё одну переменую type...

if (!fl.getDocumentDOM().library.itemExists("tile")) {
fl.getDocumentDOM().library.addNewItem("movie clip", "tile");
}
fl.getDocumentDOM().library.editItem ("tile");
for (i = 1; i < 1001; i++){
obj = {};
obj.x = (Math.random () * 300) >> 0;
obj.y = (Math.random () * 300) >> 0;
angle = Math.random () * 360 * Math.PI / 180;
type = (Math.random () * 30) >> 0;
fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + type);
fl.getDocumentDOM().selectAll();
sel = fl.getDocumentDOM().selection[0];
matrix = sel.matrix;
matrix.a = Math.cos (angle);
matrix.b = Math.sin (angle);
matrix.c = -Math.sin (angle);
matrix.d = Math.cos (angle);
sel.matrix = matrix;
}
несуть, всё равно неработет, и жалуется на эту строчку...
matrix = sel.matrix;
TypeError: sel has no properties

iNils
11.06.2008, 23:29
Понял в чем дело.
Такая ошибка происходит, когда fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + type);не добавляет элемент, поэтому выбирать на сцене нечего и selection[0] равен undefined.
Для работы данного кода, у вас в библиотеке должны быть элементы с именами ps0 .. ps29, именно именами, а не идентификаторами которыми пользуются в attachMovie (это все таки JSFL, а не AS)

vitlance
11.06.2008, 23:50
Всё переименовал... Всё равно выдает ту же ошибку..

Дальше я решил попробывать добавлять определённый клип "ps13"... он всё сдублировал отлично, но самое интересное что в конечном итоге всё равно выдал ту же ошибку..

Значит насколько я понимаю ошибка в:fl.getDocumentDOM().library.addItemToDocument (obj, "ps" + (Math.random () * 30) >> 0);

Может к (Math.random () * 30) >> 0 , надо применить что то типа toString()?

iNils
12.06.2008, 00:01
Не надо. При тестировании я использовал имена: ps0, ps1, ps2, ps3, ps4 и (Math.random () * 5) >> 0все прекрасно работало. Проверьте еще раз имена, диапазон 0-29, а не 0-30 или 1-30.
Также после строчки fl.getDocumentDOM().library.addItemToDocument вставьте
fl.trace ("ps" + type);и посмотрите какое имя вызвает ошибку.

vitlance
12.06.2008, 00:15
Всё я понял, у меня просто был ляп с именами небольшой... Спасибо большое.. Только одна просьба, можите сказать в 2 словах что делает эта часть кода:
sel = fl.getDocumentDOM().selection[0];
matrix = sel.matrix;
matrix.a = Math.cos (angle);
matrix.b = Math.sin (angle);
matrix.c = -Math.sin (angle);
matrix.d = Math.cos (angle);
sel.matrix = matrix;

iNils
12.06.2008, 00:23
Выбираем самый верхний (последний добавленый) элемент
sel = fl.getDocumentDOM().selection[0];
В JSFL нет такого понятия как rotation, поэтому поворот осуществляется с помощью матрицы (http://livedocs.macromedia.com/flash/8/main/00002389.html). Сначала мы берем текущую матрицу элемента, устанавливаем в ней значения для поворота и измененную матрицу присваиваем элементу
matrix = sel.matrix;
matrix.a = Math.cos (angle);
matrix.b = Math.sin (angle);
matrix.c = -Math.sin (angle);
matrix.d = Math.cos (angle);
sel.matrix = matrix;

vitlance
12.06.2008, 00:46
Thanks