Удаление дочернего элемента класса видео, вызываемого из частной функции

Я делаю анимацию типа викторины для работы, где при нажатии на ответ воспроизводится короткий анимационный FLV-файл, относящийся к тому, что вы выбрали. Поскольку все, что я читал, указывает на то, что AS3 является ООП, я решил сделать MovieClip, содержащий проигрыватель FLV, и связать его с файлом AS3 с именем FLV_Player.as. Таким образом, я могу создавать новый экземпляр FLV_Player каждый раз, когда мне нужно воспроизвести видео. Вот код в этом файле, который работает нормально:

package 
   {
import fl.video.VideoEvent;
import flash.events.VideoEvent;
import flash.display.MovieClip;

public class FLV_Player extends MovieClip
{

    public function FLV_Player(NextVideo:String)
    {
        animation_player.source=(NextVideo);
        animation_player.addEventListener(VideoEvent.COMPLETE, vcompleted);
    }

    private function vcompleted(e:VideoEvent):void
    {
        nextFrame();
    }

}

}

Теперь в файле DocumentClass.as у меня есть этот код:

private function NewVideo(videoname:String)
    {
        var nextvideo:FLV_Player = new FLV_Player(videoname);
        addChild(nextvideo);
        nextvideo.x = 0;
        nextvideo.y = 0;
    }

Поэтому, когда вы нажимаете кнопку, переходите к следующему кадру или чему-то еще, она вызывает функцию NewVideo и передает имя любого видео, которое будет воспроизводиться следующим.

NewVideo("Introduction.flv");

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

nextFrame();    
removeChild(newVideo);

Но это не сработало. Что ж, возможно, он перешел к следующему кадру, но с видео, занимающим все окно, трудно понять, перешло оно или нет.

Итак, как мне удалить видео, которое я создал? Основная проблема заключается в том, что, поскольку мне пришлось создать новый экземпляр класса FLV_Player в частной функции, дочерний элемент определяется локально как «var», а не как «общедоступный» или «частный» var, поэтому я не могу ссылаться на него снова . Он говорит мне, что вы можете создать «частную переменную» только из класса документа, но если я сделаю это там, он создаст класс при загрузке, а не из функции, когда я буду готов передать ему параметр имени видео. При загрузке я не знаю, какое видео мне нужно, чтобы воспроизвести?


person user2527557    schedule 01.07.2013    source источник
comment
Вы можете объявить переменную вне вашей приватной функции, не инициализируя ее (просто private var nextvideo:FLV_Player;), а затем в NewVideo() просто установить ее: nextvideo = new FLV_Player(videoname);.   -  person David Mear    schedule 01.07.2013


Ответы (2)


removeChild() должен вызываться из того же объекта, в котором он был добавлен. В этом случае ваш DocumentClass. То, что вы пытаетесь сделать сейчас, это указать FLV_Player удалить себя, что не будет работать из-за нескольких причин и ошибок в вашем коде.

Правильный способ сделать что-то — заставить объект FLV_Player отправлять пользовательское событие, которое прослушивает ваш DocumentClass. Вам нужно создать новый класс, который наследуется от Event, чтобы создать ваше собственное событие. Я бы назвал это "PlayerEvent". В функции DisplayClass вы бы сделали это:

nextVideo.addEventListener(PlayerEvent.PLAYBACK_FINISHED, onPlaybackFinished);
addChild(nextVideo);

Затем вам нужно создать метод onPlaybackFinished:

private function onPlaybackFinished(event:PlayerEvent):void {
    nextVideo.removeEventListener(PlayerEvent.PLAYBACK_FINISHED, onPlaybackFinished);
    removeChild(nextVideo);
}

Внутри класса FLV_Player функция vcomplete должна измениться на:

dispatchEvent(new Event(PlayerEvent.PLAYBACK_FINISHED));

В качестве альтернативы вы могли бы передать указатель DocumentClass на объект FLV_Player, но это очень беспорядочно, может вызвать серьезные проблемы и совсем не в духе ООП. Но это быстрое решение, если вы хотите быть ленивым.

События являются чрезвычайно важной частью Actionscript 3, и я рекомендую вам ознакомиться с ними. Вот несколько полезных ссылок:
http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html
http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7fca.html
http://www.blog.mpcreation.pl/actionscript-3-0-basics-custom-events-part-1/

person PolkaPunk    schedule 01.07.2013
comment
Я понимаю, что вы говорите в принципе, но не на практике. Следует ли поместить эти два верхних фрагмента кода в новый файл класса PlayerEvent.as? Итак, класс PlayerEvent одновременно добавляет и удаляет дочерний элемент? Если это так, то когда класс узнает, когда добавить видео, и как он узнает, какое следующее видео добавить? Я читал кое-что о пользовательских событиях и понимаю принцип, но не понимаю, как бы я применил его в этом сценарии? Этот ответ хорош, но открыл больше вопросов! Извините, у меня уже третий день, и я все еще пытаюсь понять все это. - person user2527557; 02.07.2013
comment
Да, после игры ваш ответ просто смутил меня. Теперь я понятия не имею, что я размещаю где. Я понятия не имею, куда идет код, который вы указали. - person user2527557; 02.07.2013

Я думаю, вы правы в том, что ваша первая проблема заключается в том, как просто сослаться на новое видео, поэтому немного расширим мой комментарий: вы можете объявить переменную без присвоения значения, поэтому вам не нужно иметь var nextvideo в вашем NewVideo функция. Вместо этого с помощью переменной уровня класса вы можете ссылаться на то, что вы установили nextvideo, когда хотите удалить видео:

public class DocumentClass {

    private var nextvideo:FLV_Player;

    private function NewVideo(videoname:String)
    {
        nextvideo = new FLV_Player(videoname);
        addChild(nextvideo);
    }

    private function removeVideo():void
    {
        removeChild(nextvideo);
        nextvideo = null;
    }

}
person David Mear    schedule 03.07.2013