PDA

Просмотр полной версии : Видимые/невидимые объекты


Seyonn
13.07.2007, 13:27
Возможно мне надо удалить мозг, но в FAQ не нашел.

1. Первый вопрос.

Есть объект. Объект исчезает из видимости. Например, клип переходит во фрейм, где этот объект отсутствует.

Проблема: после этого он перестает быть доступен для Action Script.
А мне нужно изменить его свойства в ДРУГИХ фреймах. НЕ текущих.

Что делать?

(сейчас использую костыль - объект не удаляю, а просто увожу его далеко-далеко за границы сцены, и делаю невидимым. Адски неудобно! Потому что клип постоянно изменяется.)

2. Второй вопрос.

Мне нужно выполнить действие ПОСЛЕ того как фрейм полностью отрендерился. Ну, или как вариант - после того как они уже стали доступны Action Script'у. События OnRender и OnEnterFrame работают именно при входе во фрейм. Когда еще ничего нету. Есть какое-нибудь событие, которое работает "на завершении" фрейма?

(таким образом, кажется, работает код, вписанный в сам фрейм. Но этого делать нельзя в силу идеалогии третьей версии языка. Сейчас я все действия выполняю с помощью приаттаченного к клипу файла с исходником всех действий. Все события обрабатываю именно как события. Поэтому вариант "пиши код в кадрах" большая просьба не предлагать. Мне интересно как можно именно перехватить момент, когда фрейм уже отрисован)

chingachgoog
13.07.2007, 13:33
1. Первый вопрос.

Есть объект. Объект исчезает из видимости. Например, клип переходит во фрейм, где этот объект отсутствует.

Проблема: после этого он перестает быть доступен для Action Script.
А мне нужно изменить его свойства в ДРУГИХ фреймах. НЕ текущих.

Что делать?


Объект по-любому должен быть на фреймах.
Далее есть два варианта:
1) _visible=false
2) Делать в объекте пустой кадр и переводить на этот кадр при необходимости.


2. Второй вопрос.

Мне нужно выполнить действие ПОСЛЕ того как фрейм полностью отрендерился.

А не будет ли это моментом перехода на следующий фрейм?

Seyonn
13.07.2007, 13:41
Объект по-любому должен быть на фреймах.
Да? Печально. Значит, всё что имеет состояния придется кодить вручную, без редактора :(
Убиться, хоть свой редактор пиши.

А не будет ли это моментом перехода на следующий фрейм?

Нет, не будет.
Там такое дело - один кадр - одно состояние грубо-говоря-меню... Каждый следующий кадр в общем-то ничем кроме идеи с предыдущим не связан. Поэтому вся навигация производится с помощью gotoAndStop, а значит на следующие кадры он не переходит.

Конечно, можно будет сделать "дырчатый" мувик. Типа, каждый кадр дублируется два раза. Ссылка ссылается на первый кадр, делает goToAndStop на второй кадр, а уже на enterFrame ко второму кадру приписывать собственно действие. Но это неправильный стиль программирования, просто ужасный.

Блин, ну должно, должно быть такое событие! В WinAPI например оно есть :))

etc
13.07.2007, 13:46
Это ошибка в организации, раз такие сложности возникают.

chingachgoog
13.07.2007, 13:50
Может оно все гораздо проще, но можно сделать так:
создать самым верхним слоем мувик - т.к. его код будет выполняться самым последним в фрейме, то следовательно, как только код начнет выполняться - значит все до этого уже отрисовано-выполнено.

Seyonn
13.07.2007, 13:53
Это ошибка в организации, раз такие сложности возникают.

Это бесспорно ошибка в организации.
И в моей, и во флеше.

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

То есть если есть клип, то им можно выразить любой объект, имеющий состояния.

Дальше - организация как у любого графического интерфейса.
Один кадр клипа - один кусок интерфейса.
Каждый элемент интерфейса, в т.ч. не только кнопки, но и движущиеся элементы, анимации и прочее - постоянно кидают события, в зависимости от того, что произошло.

К мувику приложен файл на AS3. В файле прописано соответствие ловящихся событий и функций, которые выполняет клип.

По-моему логично.

Но нерабоче :(

Где-то я читал о DisplayLists... Может быть, как-нибудь вручную можно внести объект в DisplayList?

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

Я сделал так.

Состояния рисую все так же в одном клипе, но по типу одно состояние - один слой. Удобно для редактирования. В то время, как редактирую какое-либо состояние, просто ручками на таймлайне делаю невидимыми все остальные ненужные слои.

Все подконтрольные объекты имеют свои instance-имена.

Дальше делаю массивы с этими объектами, в которые группирую по смыслу. По сути, один слой - один массив.

Массивы регистрируются при старте мувика в приаттаченном скрипте.

Далее есть функции DisplayWindow и HideWindow которые присваивают visible=false нужному массиву.

Таким образом, все еще можно рисовать ручками :)

Но всё равно обидно. Ищется событие onFrameValidated :)

chingachgoog
13.07.2007, 14:05
Много вещей сделано именно таким образом.
Что мешает сделать в клипе еще один слой - самый верхний, с пустым мувиком, который будет при инициализации отдавать команду (флаг)?

Seyonn
13.07.2007, 14:05
Много вещей сделано именно таким образом.
Что мешает сделать в клипе еще один слой - самый верхний, с пустым мувиком, который будет при инициализации отдавать команду (флаг)?

Идеалогия. Нельзя писать код в кадрах клипов :)

chingachgoog
13.07.2007, 14:18
А зачем обязательно писать в клипе? Назначьте извне

Seyonn
13.07.2007, 14:21
А зачем обязательно писать в клипе? Назначьте извне
Да, это идея. Спасибо :)
Адский хак.