Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как получить список всех клипов? (http://www.flasher.ru/forum/showthread.php?t=99629)

Жень Шень 09.08.2007 19:05

Как получить список всех клипов?
 
Привет!
Подскажите, как можно получить список или массив имен всех MovieClip определенного пользовательского класса (например, Ball), которые в данный момент находятся на сцене?
Что-то наподобии:
Код:

for (i in _root) {
  trace("_root."+i+" ("+typeof (_root[i])+")");
}

но, желательно и вложеных в другие мувик.
Спасибо.

etc 09.08.2007 19:14

Рекурсией, конечно.

Usnul 09.08.2007 19:22

подсказка: функции.

Жень Шень 09.08.2007 19:51

Но, приведеный мною код выводит общее название класса: объект, стринг и тд..
Мне надо примерно так: на сцене в данный момент есть клип myBall1 (просто клип) и myBall2 (объкт класса Ball наследник мувиклипа). Вывести надо:
myBall2

etc 09.08.2007 20:16

Код:

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;
}

Цитата:

Сообщение от Output
[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.
Как в известном выражении: мухи и котлеты по отдельности, хотя и те и другие мясо.
Еще раз благодарю за попытку помочь.

etc 10.08.2007 12:42

Так, а вот так:

Код:

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);

Может его как то пробывать прикрутить к классу? Или это не из той оперы?

В догонку к написаному:
Первый код отлично подошел для другой задачи: останока/пуск всех мувиков (включая вложеных) в данный момент времени!!!

etc 10.08.2007 17:16

Можно.
http://www.actionscript.org/resource...her/Page1.html

Жень Шень 13.08.2007 16:32

Привет!
__etc, спасибо за ссылку, сижу разбираю...и возникли 2 "непонятки".
1. В примерах (по вышепреведенной ссылке) в классе есть такая строка в конструкторе:
Код:

EventDispatcher.initialize(this);
Но класс EventDispatcher согласно просмотренному хэлпу не имеет метода initialize(), и в объявленых методах его нет. Как происходит инициализация?
2. Непонятен (для меня) синтаксис таких строк в части параметра (передаваемые параметры заключены в фигурные скобки):
Код:

dispatchEvent({target:this, type:'rollOver'});
Предпологаю, что это передача объектов с определенными свойствами. Так ли это?
Спасибо.

ЗЫ
И, последнее. Это относится к теме топика. Чисто теоретически хочется удовлетвориться, как все-таки получить список любого пользовательского класса, а не список классов верхнего уровня. Повторюсь, для решения своей проблемы я попытаюсь использовать событие кнопки и обработка его в моем классе.


Часовой пояс GMT +4, время: 01:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.