PDA

Просмотр полной версии : jsfl - pasteFrames() выдает ошибку


ladon
15.10.2008, 20:42
Есть задача, надо взять кусок таймлайна и запихать его в символ.
для этого написана следующая jsfl конструкция

function Select( y, x, dy, dx )
{
var tl = fl.getDocumentDOM().getTimeline();
var a = new Array();
for (var i = y; i< y + dy; i++) {
a.push(i);
a.push(x)
a.push(x+dx);
}
tl.setSelectedFrames(a);
}

function ToMovieClip(name, y, x, dy, dx, prefix) {
var tl = fl.getDocumentDOM().getTimeline();
Select(y, x, dy, dx);
tl.copyFrames();

var lib = fl.getDocumentDOM().library;
if (lib.itemExists(prefix+name)) {
lib.deleteItem(prefix+name);
}
lib.addNewItem("movie clip",prefix+name);
lib.editItem(prefix+name);
fl.getDocumentDOM().getTimeline().selectAllFrames();

fl.getDocumentDOM().getTimeline().pasteFrames();
fl.getDocumentDOM().exitEditMode();
}


Все это богатство вызывается из функции Start() в данном jsfl файле.
Проблема заключается в том что при запуске lsfl файла все проходит нормально, а если Start вызвать из другого скрипта то функция

fl.getDocumentDOM().getTimeline().pasteFrames();

выдает Unknown error и соотвественно не вставляет кадры в символ.

То что такую ошибку дает именно pasteFrames выяснено путем покомандных alert().

Как можно с этим бороться ктонибудь знает?

Дополнительные изыскания показали что jsfl скрит работает нормально только если его вызвать через меню Commands->run command при уже открытом файле.
Если файл запустить просто из проводника при открытом файле - ситуация повторяется полностью, т.е. pasteFrames() выдает unknown error.

Как оказалось работа pasteFrames имеет замечательные особенности.
pasteFrames может вставить только непрерывный кусок кадров.

И еще более замечательные особенности нашлись у метода
fl.getDocumentDOM().getTimeline().setSelectedFrames(array);
по неизвестной мне причине применение этого метода дает разные результаты при срабатывании на только что открытом файле и на уже давно открытом. А именно на только что открытом файле этот метод не выделяет слои в которых только пустые кадры.


fl.openDocument("file:///testFile.fla");
Select(0,17,81,23);
fl.trace(fl.getDocumentDOM().getTimeline().getSelectedFrames()+"\n");


получается примерно следующее
на только что отрытом в скрипте файле

y 0 x 17 dy81 dx 23
6,17,40,7,17,40,8,17,40,9,17,40,11,17,40


на открытом во флеше файле и запущеном через Run Command скрипте

y 0 x 17 dy81 dx 23
0,17,40,1,17,40,2,17,40,3,17,40,4,17,40,5,17,40,6,17,40,7,17,40,8,17,40,9,17,40,10,17,40,11,17,40,12,17,40,13,17,40,14,17,40,15,17,40,16,17,40,17,17,4 0,18,17,40,19,17,40,20,17,40,21,17,40,22,17,40,23,17,40,24,17,40,25,17,40,26,17,40,27,17,40,28,17,40,29,17,40,30,17,40,31,17,40,32,17,40,33,17,40,34,1 7,40,35,17,40,36,17,40,37,17,40,38,17,40,39,17,40,40,17,40,41,17,40,42,17,40,43,17,40,44,17,40,45,17,40,46,17,40,47,17,40,48,17,40,49,17,40,50,17,40,5 1,17,40,52,17,40,53,17,40,54,17,40,55,17,40,56,17,40,57,17,40,58,17,40,59,17,40,60,17,40,61,17,40,62,17,40,63,17,40,64,17,40,65,17,40,66,17,40,67,17,4 0,68,17,40,69,17,40,70,17,40,71,17,40,72,17,40,73,17,40,74,17,40,75,17,40,76,17,40,77,17,40,78,17,40,79,17,40,80,17,40


:eek::wacko:

так же было установлено
после открытия файла fl.openDocument команда fl.getDocumentDOM().getTimeline().setSelectedFrames не может выбирать пустые ключевые кадры.
команда fl.getDocumentDOM().getTimeline().selectAllFrames(); замечательно выбирает все кадры, fl.getDocumentDOM().getTimeline().setSelectedLayers(1,true); так же нормально выбирает пустые кадры.

в качестве решения рассмотрен алгоритм - копируем весь таймлайн и отрезаем лишнее спереди и сзади нужного куска. неподходит, нельзя удалить то что неполучается выделить :)

единственный вариант покадровое перенесение. :bye:

iNils
16.10.2008, 10:13
ladon, пользуйтесь кнопкой "изменить".

ladon
16.10.2008, 10:49
Алилуйя братья! Есть, есть решение данной проблемы...
1. Открываем flash ide.
2. Создаем новый файл.
3. Запускаем скрипт через run command.

Эта фигня с выделением себя проявляет только как визуальный глюк. Кадры пустые кадры нормально выделяются и копируются.

Главное только скрипт жестко не привязывать к номеру документа, т.е. избегать конструкций fl.documents[0]. и тому подобных. fl.getDocumentDOM(). вполне решает вопрос.

Прошу прощения за несколько сообщений, просто очень уж наболело.