Динамические имена экземпляров AS 3.0

#actionscript-3 #dynamic #instances

#actionscript-3 #динамический #экземпляры

Вопрос:

Привет, я создал пользовательский класс, в котором я хотел бы создать x экземпляров видеоролика. Но следующее не работает:


package {

 import flash.display.MovieClip;
public class CustomClass extends MovieClip {

    public function CustomClass(amount:uint) {  
        var Collector:Array = new Array(); 

        //Add and position Tiles to stage.
        for (var i:uint = 1; i <= amount; i  ){ 
            var newMovieClip:MovieClip = new MovieClip;
            newMovieClip.y = amount * 10;
            Collector.push(newMovieClip); 
        }
        addChild(Collector);
    }
}
  

}

Я хотел бы разместить их на временной шкале с

переменная customClass_mc:CustomClass = новый пользовательский класс(10);
addChild(customClass_mc);

// попробуйте отследить позицию x одного из экземпляров. 
трассировка (customClass_mc.Коллектор[5].x);

Я продолжаю получать ошибку: Сцена 1, слой ‘Layer 1’, кадр 1, строка 5 1119: Доступ к, возможно, неопределенному сборщику свойств через ссылку со статическим типом CustomClass.

Ответ №1:

Во-первых, вам нужно объявить Collector как общедоступный:

 public var Collector:Array = new Array(); 
  

Ваш коллектор представляет собой массив, а не отображаемый объект, и поэтому его нельзя добавить в дерево отображения. Вместо этого вы должны помещать каждый newMovieClip на дисплей пользовательского класса и размещать их внутри вашего цикла for. Тогда вам вообще не нужен сборщик, потому что вы можете настроить таргетинг на видеоролики с помощью getChildAt() :

 trace(customClass_mc.getChildAt(5).x);
  

Комментарии:

1. Потрясающе, метод getChildAt работает! Кроме того, предоставление коллектору общедоступности дает мне: 1114: Общедоступный атрибут может использоваться только внутри пакета. Хорошо, что мне это больше не нужно!

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

3. Привет, shanethehat, я нашел другой способ (я также добавил ответ). Согласны ли вы, что это еще проще в использовании?

4. Да, безусловно, ваш способ чище и проще, если вы решили, что массив не требуется ни для чего другого.

Ответ №2:

Я сам нашел другой ответ, который, на мой взгляд, еще лучше!

Контейнер вам вообще не нужен.

при использовании следующего

 package {

    import flash.display.MovieClip;
    public class CustomClass extends MovieClip {

        public function CustomClass(amount:uint) {  

            //Add and position Tiles to stage.
            for (var i:uint = 1; i <= amount; i  ){ 
                var newMovieClip:MovieClip = new MovieClip;
                newMovieClip.y = amount * 10;
                newMovieClip.name = "clip" i;
                addChild(newMovieClip); 
            }
        }
    }
}
  

Нет, я могу получить доступ к видеороликам, используя:

 var customClass_mc:CustomClass = new CustomClass(10);
addChild(customClass_mc);

//try to trace the x position of the fifth instance. 
trace(customClass_mc.getChildByName("child5").y);
  

Ответ №3:

Переменная ‘Collector’ доступна только внутри конструктора в том виде, в каком она есть у вас. Сборщик должен быть общедоступным, чтобы быть доступным из-за пределов временной шкалы. Лучше всего было бы создать общедоступный метод получения для доступа к этому. Итак, что-то вроде:

 import flash.display.MovieClip;
public class CustomClass extends MovieClip {

    private var Collector:Array = new Array(); 

    public function get Collector():Array
    {
        return Collector;
    }

    public function CustomClass(amount:uint) {  

        //Add and position Tiles to stage.
        for (var i:uint = 1; i <= amount; i  ){ 
            var newMovieClip:MovieClip = new MovieClip;
            newMovieClip.y = amount * 10;
            Collector.push(newMovieClip); 
        }
        addChild(Collector);
    }
}
  

Комментарии:

1. ответ shanethehat сработал, с вашим я получаю 2 ошибки: 1067: Неявное приведение значения типа Array к несвязанному типу flash.display:DisplayObject. amp; 1114: Общедоступный атрибут может использоваться только внутри пакета. В любом случае спасибо