#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: Общедоступный атрибут может использоваться только внутри пакета. В любом случае спасибо