0

我正在为工作制作一个测验类型的动画,在单击答案时,它会播放一个与您选择的内容相关的简短动画 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,所以我不能再次引用它. 它告诉我,您只能从文档类中创建一个“私有变量”,但如果我在那里创建它,它将在我准备将视频名称参数传递给它时在加载时创建类,而不是从函数中创建。在加载时我不知道我需要它播放什么视频?

4

2 回答 2

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/

于 2013-07-01T15:25:59.017 回答
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;
    }

}
于 2013-07-03T00:45:29.570 回答