首先,我是一名动画师而不是程序员,并且只使用动作脚本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”但如果我在那里创建它将在加载时创建类,而不是在我准备将视频名称参数传递给它时从函数创建。在加载时我不知道我需要播放什么视频?
无论如何,我认为写这篇文章让我更加困惑。如果有人能提供帮助,那将非常感谢,谢谢。
答案 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;
}
}