AS3 не может найти правильный способ gotoAndStop экземпляра мувиклипа в as3

У меня есть видеоклип "achtergrond" из моей библиотеки, который я поставил на сцену с помощью такой функции:

function set_game ()
        {
            oefNr = 4;
            var bg:achtergrond = new achtergrond();
            bg.x = 0;
            bg.y = 0;
            bg.name = "bg";
            bg.gotoAndStop ("uit");
            addChild (bg);
            set_next ();
        }

Видеоклип содержит 2 кадра «aan» и «uit» и начинается с кадра «uit». Далее в моей игре я хочу установить рамку на «ан» во время воспроизведения звука, например:

    function playSnd ():void
    {
        getChildByName("bg").gotoAndStop("aan");
        snd = new Sound(new URLRequest("phonetic_" + curArr[curSnd] + ".mp3"));
        cnl = snd.play();
        cnl.addEventListener (Event.SOUND_COMPLETE, completeSnd);
    }

Но хоть убей, я не могу найти правильный способ сделать это. Flash продолжает говорить о displayObjects и других вещах, и я понятия не имею, почему я не могу обратиться к своему мувиклипу. На самом деле, я имею представление, но не более того. Я еще не очень хорошо разбираюсь в этой части Flash.


person silvith    schedule 11.12.2012    source источник


Ответы (2)


Ответ таков: если я попытаюсь получить доступ к своему клипу следующим образом: this ["bg"] или getChildByName ("bg"), я имею в виду DisplayObject. У него нет всех методов MovieClip, таких как gotoAndStop, которые мне нужны в данном случае.

Я объявил новую переменную:

var movie:MovieClip;

Затем я преобразовал свой DisplayObject в MovieClip и поместил его в var movie:

function set_game ()
        {
            oefNr = 4;
            var bg:achtergrond = new achtergrond();
            bg.x = 0;
            bg.y = 0;
            bg.name = "bg";
            bg.gotoAndStop ("uit");
            addChild (bg);
            movie = this.getChildByName("bg") as MovieClip;
            set_next ();
        }

Теперь я могу использовать специальные методы MovieClip, такие как gotoAndStop:

function playSnd ():void
    {
        movie.gotoAndStop("aan");
        snd = new Sound(new URLRequest("phonetic_" + curArr[curSnd] + ".mp3"));
        cnl = snd.play();
        cnl.addEventListener (Event.SOUND_COMPLETE, completeSnd);
    }

Ответ вдохновлен этим ответом

person silvith    schedule 11.12.2012
comment
более простой способ [если ресурсы не создаются динамически] - ссылаться на элементы в квадратных скобках, например this [bg] .stop (), или если вы хотите, чтобы тип подсказывал MovieClip (this [bg]). stop () обычно быстрее записывается, но работает только в том случае, если вы не создавали актив динамически. Однако, если вы это сделали, вы, вероятно, все равно сохранили их в переменной класса, и вам не нужно искать ее через другой фрагмент ролика. - person Daniel MesSer; 11.12.2012
comment
@DanielMesSer Как видите, актив создается динамически в функции set_game (). Я не понимаю этот фрагмент вашего комментария: вы, вероятно, все равно храните их в переменной класса, и вам не нужно искать ее с помощью другого фрагмента ролика. Не могли бы вы это объяснить? - person silvith; 13.12.2012
comment
Писать описательный материал в комментарии немного сложно, но я постараюсь. Я имею в виду, что, поскольку вы создаете их динамически, вы обычно делаете это внутри какого-то класса, а затем у вас есть возможность хранить их в переменных-членах, массивах или таблицах или подобных вещах. Например, внутри класса: var myBubbles:Array = [new Bubble(), new Bubble(), new Bubble()]. А потом занимаюсь такими вещами, как myBubbleEmitter.addChild(myBubbles[0]). myOtherBubbleEmitter.addChild(myBubbles[1]); Таким образом, вы действительно не заботитесь об именах динамически создаваемых файлов, поскольку вы обращаетесь к ним другим способом. Имеет смысл? - person Daniel MesSer; 13.12.2012

bg.name = "bg";

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

Другое решение:

Я думаю, что ахтергронд - это единственный объект, так почему вы используете его с "getChildByName"? Используйте это как bg.gotoAndStop();.

person kvasirr    schedule 11.12.2012
comment
У меня никогда не было проблем с именами, хотя я знаю, что они могут возникнуть. И я уже пробовал другое ваше решение, которое не сработало. Я ответил на свой вопрос, зацените, если вам интересно. - person silvith; 11.12.2012