Доступ к экземпляру в динамически добавляемом MC - PullRequest
0 голосов
/ 11 апреля 2011

Я добавил ролик динамически, используя следующий код:

var apie=new cPie()
apie.x=100
apie.y=100
stage.addChild(apie)

Теперь у меня на сцене пирог. Yum. Предполагая, что это работает как фрагмент ролика, помещенный на сцену путем перетаскивания, я добавил это, чтобы изменить экземпляр в круговой диаграмме.

var apie=new cPie()
apie.x=100
apie.y=100
apie.cherry.gotoAndStop(2)
stage.addChild(apie)

Вишня - это экземпляр в видеоролике cPie, который представляет собой еще один мувиклип, состоящий из 3 кадров. Я хочу, чтобы он пошел на второй кадр. Как правило, это будет работать, но при попытке добавить фрагмент ролика через ActionScript я сталкиваюсь со следующей ошибкой во время выполнения:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at pies_fla::MainTimeline/frame1()

Как всегда, возвращаемая ошибка не помогает мне решить эту проблему вообще. Это примерно так же неясно, как «неявное принуждение», что не имеет смысла для меня не быть английским майором. Что я знаю, так это то, что я делаю что-то не так, и в результате я получаю эту ошибку. Мы будем очень признательны за правильное решение этой проблемы.

P.S. Я планирую использовать это в цикле. Пожалуйста, примите это во внимание.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Причина, по которой вы получили эту ошибку, заключается в том, что cherry не является свойством или методом объекта cPie, это имя экземпляра для дочернего экранного объекта вашего контейнера экранных объектов cPie. Для доступа к экранному объекту cherry необходимо использовать унаследованные cPie методы объекта DisplayObjectContainer, а именно метод getChildByName(). К счастью, это уже объясняется в другом ответе frankhermes, поэтому я объясню другой (и, возможно, лучший) подход к доступу к дочернему экранному объекту в следующем примере:

CherryPie.as:

package display
{
    import flash.display.MovieClip;

    public class CherryPie extends MovieClip
    {
        private var _cherry:MovieClip;

        public function get cherry():MovieClip
        {
            return _cherry;

        }// end function

        public function CherryPie()
        {
            _cherry = cherryMC;

        }// end function

    }// end class

}// end package

Main.as:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            init();

        }// end function

        private function init():void 
        {
            var cherryPie:CherryPie = new CherryPie();
            cherryPie.x = 100;
            cherryPie.y = 100;
            cherryPie.cherry.gotoAndStop(2);
            addChild(cherryPie);

        }// end function

    }// end class

}// end package

Создав базовый класс для своего cherryPie_mc мувиклипа, вы можете создать свойство с именем cherry и назначить ему дочерний экранный объект cherry при запуске класса. Таким образом, вы можете напрямую получить доступ к дочернему экранному объекту cherry, например:

cherryPie.cherry.gotoAndStop(2);

вместо:

cherryPie.getChildByName("cherryMC").gotoAndStop(2);

Вы можете установить класс CherryPie в качестве базового класса cherryPie_mc фрагмента ролика следующим образом:

ПРИМЕЧАНИЕ. «Имя» в свойствах символа должно быть «cherryPie_mc» Symbol Properties

Также для тех, кто интересуется, почему я не установил cherry в качестве публичной собственности

public var cherry:MovieClip;

и вместо этого использовал метод получения для доступа к частной собственности

private var _cherry:MovieClip;

public function get cherry():MovieClip
{
    return _cherry;

}// end function

должен был сделать объект cherry доступным только для чтения, что было сделано путем пропуска метода setter. Причина, по которой я сделал это только для чтения, заключалась в том, чтобы избежать чего-то вроде следующего:

cherryPie.cherry = new FakeCherry();
0 голосов
/ 11 апреля 2011

Полагаю, ошибка вызвана строкой apie.cherry.gotoAndStop(2).Возможно, вам придется изменить это на apie.getChildByName("cherry").gotoAndStop(2), но, поскольку ваш пирог - это мувиклип, дети очень часто не создаются сразу.

Способ обойти это путем ожидания перерисовки кадра, прежде чем пытаться получить доступ к дочерним элементам MovieClips.

...