删除从私有函数调用的视频类的子项

时间:2013-07-01 14:56:05

标签: actionscript-3 flash-cs6

首先,我是一名动画师而不是程序员,并且只使用动作脚本2天,所以我只能这样做。

我正在为工作制作一个测验类型的动画,在点击答案时它会播放与您选择的内容相关的短动画FLV文件。由于我读到的所有内容都指向AS3为OOP,我决定制作一个包含FLV播放器的MovieClip,并将其链接到名为FLV_Player.as的AS3文件。这样我每次需要播放视频时都可以创建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”,而不是“public”或“private”var,所以我不能再次引用它。它告诉我你只能在文档类中创建一个“private var”但如果我在那里创建它将在加载时创建类,而不是在我准备将视频名称参数传递给它时从函数创建。在加载时我不知道我需要播放什么视频?

无论如何,我认为写这篇文章让我更加困惑。如果有人能提供帮助,那将非常感谢,谢谢。

2 个答案:

答案 0 :(得分:1)

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对象,但这非常混乱,可能会导致严重的问题而根本不符合OOP的精神。但如果你想要懒惰,这是一个快速解决方案。

事件是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/

答案 1 :(得分:0)

我认为你是对的,你的第一个问题就是如何引用新视频,所以要稍微扩展我的评论:你可以声明一个变量而不需要赋值,所以你不需要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;
    }

}