Просмотр полной версии : Как получить список всех клипов?
Жень Шень
09.08.2007, 19:05
Привет!
Подскажите, как можно получить список или массив имен всех MovieClip определенного пользовательского класса (например, Ball), которые в данный момент находятся на сцене?
Что-то наподобии:
for (i in _root) {
trace("_root."+i+" ("+typeof (_root[i])+")");
}но, желательно и вложеных в другие мувик.
Спасибо.
Жень Шень
09.08.2007, 19:51
Но, приведеный мною код выводит общее название класса: объект, стринг и тд..
Мне надо примерно так: на сцене в данный момент есть клип myBall1 (просто клип) и myBall2 (объкт класса Ball наследник мувиклипа). Вывести надо:
myBall2
function getNames(root) {
for (var i in root) {
var item = root[i];
if (typeof item == 'movieclip') {
getClassName(item, _global);
trace('[object '+(__currentClassName ? __currentClassName : 'MovieClip')+', path='+item+']');
delete __currentClassName;
getNames(item);
}
}
}
function getClassName(mc, scope) {
for (var i in scope) {
var item = scope[i];
if (typeof item == 'function' && mc.__proto__ == item.prototype) {
__currentClassName = i;
return;
} else if (typeof item == 'object') {
getClassName(mc, item);
}
}
}
onEnterFrame = function() {
getNames(this);
delete onEnterFrame;
}
[object MyClass, path=_level0.myClass]
[object AnotherClass, path=_level0.myClass.anotherClass]
Жень Шень
10.08.2007, 11:40
Привет!
__etc код как всегда великолепен. Спасибо. Однако моя проблема не разрешилась. Попрбую еще раз сформулировать.
В фильме участвует постоянно меняющее кол-во клипов (класса MovieClip) и экземпляров класса Ball (тоже клипов, так как изначально определены как class Ball extends MovieClip)
В любой момент времени мне надо обратиться ко всем экземплярам Ball, а не ко всем MovieClip.
Ваш код выдает:
[object MovieClip, path=_level0.myBall2]
[object MovieClip, path=_level0.myBall1]
[object MovieClip, path=_level0.myBall1.myBall3]
[object MovieClip, path=_level0.main_mc]
[object MovieClip, path=_level0.main_mc.myBall4]
[object MovieClip, path=_level0.main_mc.myBall4.myBall3]
[object MovieClip, path=_level0.main_mc.box_mc]
А как обратиться только к 1,2,3,5,6 объектам, то есть код должен распознавать принадлежность к классу Ball.
Как в известном выражении: мухи и котлеты по отдельности, хотя и те и другие мясо.
Еще раз благодарю за попытку помочь.
Так, а вот так:
function getNames(root) {
for (var i in root) {
var item = root[i];
if (typeof item == 'movieclip') {
getClassName(item, _global);
trace('[object '+(__currentClassName ? __currentClassName : 'MovieClip')+', path='+item+']');
delete __currentClassName;
getNames(item);
}
}
}
function getClassName(mc, scope) {
for (var i in scope) {
var item = scope[i];
if (typeof item == 'function' && mc.__proto__ == item.prototype) {
__currentClassName = i;
return;
} else if (typeof item == 'object') {
getClassName(mc, item);
}
}
}
onLoad = function() {
getNames(this);
}
Работает? Судя по MovieClip в трейсе, классы ещё не успели инициализироваться.
Жень Шень
10.08.2007, 17:13
К сожалению тот же результат.
Проблему можно решить по другому, но у меня нет (пока!) опыта работать с классами. Если б я смог передать в класс событие "нажатие кнопки на руте" или нажатие мышки в определенной области рута, то не потребывалось бы оттделять "мух от котлет".
А так засел за англо-русский словарь и пытаюсь перевести из ХЭЛПа что есть addEventListener, broadcast, EventDispatcher, и как они могут мне помочь.
Нашел в EventDispatcher.addEventListener() такой код:
myListener = new Object();
myListener.click = function(evt){
trace(evt.type + " triggered");
}
myButton.addEventListener("click", myListener);
Может его как то пробывать прикрутить к классу? Или это не из той оперы?
В догонку к написаному:
Первый код отлично подошел для другой задачи: останока/пуск всех мувиков (включая вложеных) в данный момент времени!!!
Можно.
http://www.actionscript.org/resources/articles/204/1/Using-EventDispatcher/Page1.html
Жень Шень
13.08.2007, 16:32
Привет!
__etc, спасибо за ссылку, сижу разбираю...и возникли 2 "непонятки".
1. В примерах (по вышепреведенной ссылке) в классе есть такая строка в конструкторе:
EventDispatcher.initialize(this);
Но класс EventDispatcher согласно просмотренному хэлпу не имеет метода initialize(), и в объявленых методах его нет. Как происходит инициализация?
2. Непонятен (для меня) синтаксис таких строк в части параметра (передаваемые параметры заключены в фигурные скобки):
dispatchEvent({target:this, type:'rollOver'});
Предпологаю, что это передача объектов с определенными свойствами. Так ли это?
Спасибо.
ЗЫ
И, последнее. Это относится к теме топика. Чисто теоретически хочется удовлетвориться, как все-таки получить список любого пользовательского класса, а не список классов верхнего уровня. Повторюсь, для решения своей проблемы я попытаюсь использовать событие кнопки и обработка его в моем классе.
1. Метод initialize активно используется в компонентах, но не описан в хелпе. Этот метод присваивает экземпляру класса методы EventDispatcher, чтобы этот экземпляр мог слать события;
2. Это объект со свойстами target и type, стандартными свойствами объекта-события.
Чисто теоретически хочется удовлетвориться, как все-таки получить список любого пользовательского класса, а не список классов верхнего уровня. Повторюсь, для решения своей проблемы я попытаюсь использовать событие кнопки и обработка его в моем классе.
не вижу почему бы не хранить этот список в статическом массиве, в конструкторе нужных классов его заполнять, перед использованием массива проверять реальное присутствие элементов и корректировать..
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.