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 ではなくローカルに「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 に答える