MovieClips не сохраняют свой базовый класс, если они прикреплены к мувиклипу, который добавляется динамически. - PullRequest
1 голос
/ 20 декабря 2010

У меня есть мувиклип-держатель, его базовый класс - foo.

package {
    import flash.display.MovieClip;

    public class Foo extends MovieClip {
        public function Foo() {
            trace("foo");
        }
    }
}

В foo есть ряд других видеоклипов с базовым классом bar.

package {
    import flash.display.MovieClip;

    public class Bar extends MovieClip {
        public function Bar() {
            trace("bar");
        }
    }
}

Iпоместите трассировку в конструктор bar, чтобы я мог сказать, правильно ли она загружается, и когда я перетаскиваю foo на сцену и запускаю клип, все маленькие полоски внутри него корректно срабатывают.Однако, когда я добавляю его на сцену динамически, например, как это в классе Main:

package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        public function Main() {
            this.addChild(new Foo());
        }
    }
}

Внезапно все маленькие клипы бара в foo возвращаются к обычным старым мувиклипам и не запускаются.Что интересно, если в какой-то момент вы ввели их как Bar, а их нормальный класс установлен на Bar (внутри самого мувиклипа, а не в базовом классе), он работает, и все конструкторы срабатывают, как здесь:

    public function Main() {
        var foo:Foo = new Foo();
        stage.addChild(foo);
        foo.x = 0;
        foo.y = 0;

        trace(foo.getChildAt(1) as Bar);
    }//Main()

Однако, если вам нужно несколько различных типов клипов Бар и назначить каждому базовый класс Бар, это не сработает.Все они появляются как общие видеоклипы.Это работает, если вы проходите через них и вводите их как Bar1 или Bar2, но на практике это означает, что на практике вам придется пытаться настраивать каждый дочерний тип каждого объекта верхнего уровня каждый раз, когда вы добавляете клип на сцену..

Вы также не можете иметь несколько видеороликов одного и того же типа, поскольку Flash не позволяет этого, поэтому каждый из них должен быть новым классом и иметь этот тип, приведенный к типу, когда родительский объект помещен вэтап.Вид поражения цели ООП.

Кажется, это ошибка в самой Flash, но есть ли способ исправить это?

1 Ответ

1 голос
/ 20 декабря 2010

Проблема заключается в вашем объявлении членов класса Foo. Если вы хотите, чтобы Flash создавал элементы как что-либо еще, кроме MovieClip или Sprite, вы должны правильно добавить объявление члена в класс или объявить тип при использовании ключевого слова new.

Это работает:

package {
import flash.display.MovieClip;
import flash.utils.describeType;

public class Foo extends MovieClip {
    public var bar1:Bar1;
    public var bar2:Bar2;
    public var bar3:Bar1;
    public var bar4:Bar2;

    public function Foo() {
        trace("foo", this.numChildren);

    }
}
}

Вы также можете просто установить в настройках ActionScript значение «Автоматически объявлять экземпляры сцены» и опустить объявление класса, если ваш класс на самом деле не делает ничего особенного.

ActionScript довольно терпим с типами, но кажется, что компилятор игнорирует типы, объявленные на панели, пока не найдет какую-то ссылку в коде, вероятно, чтобы предотвратить случайное раздувание двоичного файла, если кто-то забыл удалить имя класса в библиотеке.

...