Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   обращение сразу ко всем экземплярам определенного класса (http://www.flasher.ru/forum/showthread.php?t=145685)

Dr_Bra 16.10.2010 15:07

обращение сразу ко всем экземплярам определенного класса
 
Всем привет!

У меня вот такой вопрос:
Можно ли, каким-то образом, обратиться сразу ко всем экземплярам определенного класса, которые отображены на сцене?

i.o. 16.10.2010 15:40

Пройтись по каждому экземпляру и проверить, является ли он наследником определенного класса, с помощью оператора is

alatar 16.10.2010 15:41

Обратиться к экземпляру класса, можно только имея ссылку на него.
Т.е. вам необходимо сделать статическое "хранилище" ссылок на экземпляры этого класса и при создании экземпляра (в конструкторе) заносить ссылку на экземпляр в хранилище. Для оптимизации и возможности удаления объектов, ссылки можно сохранять по ADDED и удалять по REMOVED.

3p.station 16.10.2010 15:48

если я правильно понял то возможно вам будет интересно посмтреть в сторону либо наблюдателя или
компоновщика

i.o. 16.10.2010 16:00

3p.station, в данной задаче это перегиб

Котяра 16.10.2010 18:25

можно
например в конструкторе регистрировать экземпляр в каком нибудь статичном массиве.
Код AS3:

package ru.k0t0vich 
{
    import flash.display.Sprite;
 
    /**
    * Регистрируемые спрайты
    * @author k0t0vich
    */

    public class RegisteredSprite extends Sprite
    {
        static private var _instanceArray:Array;
 
        public function RegisteredSprite()
        {
            super();
            // можно регистрировать в конструкоре, но можно и добавлятьудалять по событиям добавления/удаления на сцену.
            RegisteredSprite.instanceArray.push(this);
        }
 
        static public function get instanceArray():Array { 
            if (!_instanceArray){
                _instanceArray = new Array();
            }
            return _instanceArray;
        }
 
    }
 
}

UPD 2alatar - написал не увидев твоего сообщения..

chabapok 16.10.2010 18:56

люди, какой наблюдатель? Какое регистрить? Все гениальное - просто, а сложное - не нужно.
Код AS3:

for(var i=0; i<numChildren;i++)
if ( !(getChildAt(i) is MyClass) ) continue;
else{обработать getChildAt(i) }

если объекты расположены вложено - можно вызывать такую функцию рекурсивно

TanaTiX 16.10.2010 19:08

ну это во первых только если все экземпляры находятся в одном контейнере
во-вторых, смысл перелопачивать дохерища объектов (а их может быть еще больше:) ), когда можно взять только нужное?
Ну и рекурсия тут явно не оправдана

i.o. 16.10.2010 19:24

Цитата:

во-вторых, смысл перелопачивать дохерища объектов (а их может быть еще больше ), когда можно взять только нужное?
TanaTiX, читаем вопрос внимательно:
Цитата:

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

TanaTiX 16.10.2010 20:30

i.o., зачем перелопачивать ВСЕ, когда можно иметь список нужного? Нет желания использовать статик - юзаем сингл. А если соответствующему классу (экземпляру) при добавлении на сцену прописать автоматическое добавление в массив (напр. метод register), а удалять другим методом (к примеру destroy), удаляя его при этом из соответствующего массива. Думаю что это более привлекательное решение.


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

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