Avatar billede kalleballe Nybegynder
22. maj 2007 - 16:02 Der er 12 kommentarer

cleare instans af klasse helt

Jeg har følgende klasse:

import mx.utils.Delegate;
import mx.video.FLVPlayback;
import mx.events.*;

/*
plays an array of videos
*/

class RandomVideos
{
    private var vidPlayer:FLVPlayback;
    private var cp:TextField;
    private var flv_array:Array;
    private var loadingVideoNum:Number = 0;
    private var playingVideoNum:Number = 0;
    private var totalFLVs:Number;


    public function getVideo(p_video:FLVPlayback, dataContainer:Array)
    {

        vidPlayer = p_video;
        flv_array = dataContainer;
        totalFLVs = flv_array.length;
        vidPlayer.contentPath = flv_array[playingVideoNum].file_name;

        trace("vidPlayer.contentPath = "+vidPlayer.contentPath);

        placeVidPlayer();

        addListeners();

        vidPlayer.play();

    }
    private function placeVidPlayer():Void
    {
        vidPlayer._x = flv_array[playingVideoNum].x;
        vidPlayer._y = flv_array[playingVideoNum].y;

    }
    private function addListeners():Void
    {
        vidPlayer.addEventListener("ready",Delegate.create(this, finishedLoading));
        vidPlayer.addEventListener("complete",Delegate.create(this, finishedPlaying));
    }
    private function finishedLoading(vid:Object):Void
    {

        if (loadingVideoNum<totalFLVs)
        {
            loadingVideoNum++;

            vidPlayer.activeVideoPlayerIndex = loadingVideoNum;
            vidPlayer.load(flv_array[loadingVideoNum].file_name);
        }
    }

    private function finishedPlaying(vid:Object):Void
    {


        //

        trace("--- playingVideoNum = "+playingVideoNum);
        trace("--- totalFLVs = "+totalFLVs);

        playingVideoNum++;


        if (playingVideoNum<totalFLVs)
        {

            placeVidPlayer();
            vidPlayer.activeVideoPlayerIndex = playingVideoNum;
            vidPlayer.visibleVideoPlayerIndex = playingVideoNum;
            vidPlayer.play();
        }
        else
        {

            vidPlayer.stop();


        }



    }
}

Denne klasse styre et videokomponent (video0.vidPlayer) som er på scenen.

Jeg laver min instans således:

Når jeg trykker på en knap sker følgende:

var slukLydVideo:RandomVideos = new RandomVideos();
slukLydVideo.getVideo(video0.vidPlayer,shortArray);

Og det virker fint, - jeg sender et array med f.eks. 3 videoer til  klassen som så fint afspiller dem efter hinanden.

Jeg har så 2 problemer.

1. Jeg vil gerne have at det hele 'cleares' hvis man trykker på knappen og altså laver en ny instans, - det er som om det ikke helt sker lige nu.

2. Når alle videoafspilning er færdig så skal den også cleare helt, - dvs. også stoppe med at lytte.

Hvordan gør jeg dette?


vh

KalleBalle
Avatar billede kalleballe Nybegynder
22. maj 2007 - 16:04 #1
ps. vedr. punkt 1, -så mener jeg, hvis man trykke mens video afspilles.
Avatar billede kalleballe Nybegynder
22. maj 2007 - 16:56 #2
Grundlæggende er det nok fordi jeg ikke kan finde ud af at remove mine eventlisteners når videoen er færdig (vidPlayer.stop());
Avatar billede kalleballe Nybegynder
23. maj 2007 - 09:08 #3
Jeg har prøvet med

private function removeListeners():Void
    {
        vidPlayer.removeEventListener("ready");
        vidPlayer.removeEventListener("complete");
    }

som jeg så kalder med

removeListeners();

men det virker ikke, - jeg kan se at mine listeners bliver ved med at lytte.

vh

KalleBalle
Avatar billede mat Nybegynder
23. maj 2007 - 10:11 #4
Prøv at specificere den funktion der kaldes af lytteren som anden parameter.

Fra hjælpen;

my_FLVPlybk.removeEventListener(event:String, listener:Object):Void
my_FLVPlybk.removeEventListener(event:String, listener:Function):Void

Som du kan se tager den 2 parametre.

mvh mat
Avatar billede kalleballe Nybegynder
23. maj 2007 - 12:18 #5
Hej, - jeg har nu lavet koden lidt anderledens...

import mx.utils.Delegate;
import mx.video.FLVPlayback;
import mx.events.*;

/*
plays an array of videos
*/

class RandomVideos
{
    private var vidPlayer:FLVPlayback;

    private var flv_array:Array = new Array();
    private var loadingVideoNum:Number = 0;
    private var playingVideoNum:Number = 0;
    private var totalFLVs:Number = 0;
    var p_video:FLVPlayback;
    var dataContainer:Array;


    public function getVideo(p_video:FLVPlayback, dataContainer:Array)
    {

        vidPlayer = p_video;
        flv_array = dataContainer;
        totalFLVs = flv_array.length;


        trace("vidPlayer.contentPath = "+vidPlayer.contentPath);
        placeVidPlayer();
        trace("loadingVideoNum = "+loadingVideoNum);
        vidPlayer.activeVideoPlayerIndex = loadingVideoNum;
        vidPlayer.visibleVideoPlayerIndex = loadingVideoNum;

        vidPlayer.contentPath = flv_array[playingVideoNum].file_name;


        addListeners();
        vidPlayer.play();


    }
    private function placeVidPlayer():Void
    {
        vidPlayer._x = flv_array[playingVideoNum].x;
        vidPlayer._y = flv_array[playingVideoNum].y;

    }
    private function addListeners():Void
    {

        vidPlayer.addEventListener("complete",Delegate.create(this, finishedPlaying));
    }
    private function finishedPlaying(vid:Object):Void
    {

        //
        trace("video er slut");
        playingVideoNum++;
        if (playingVideoNum<totalFLVs)
        {

            this.getVideo(vidPlayer,flv_array);

        }
        else
        {
            vidPlayer.removeEventListener("complete",finishedPlaying);
            playingVideoNum = undefined;
            loadingVideoNum = undefined;
            trace("stop stop");
        }

    }
}


jeg får dog stadig flere og flere

trace("stop stop");

jo flere gange jeg laver en instans.

vh

KalleBalle
Avatar billede kalleballe Nybegynder
23. maj 2007 - 12:50 #6
Ok, - nu er jeg gået tilbage til:

import mx.utils.Delegate;
import mx.video.FLVPlayback;
import mx.events.*;

class RandomVideos
{
    private var vidPlayer:FLVPlayback;
    private var cp:TextField;
    private var flv_array:Array;
    private var loadingVideoNum:Number = 0;
    private var playingVideoNum:Number = 0;
    private var totalFLVs:Number;

 
    public function getVideo(p_video:FLVPlayback, dataContainer:Array)
    {
        vidPlayer = p_video;
        flv_array = dataContainer;
        totalFLVs = flv_array.length;
        vidPlayer.contentPath = flv_array[playingVideoNum].file_name;
        placeVidPlayer();
        addListeners();
       

    }
    private function placeVidPlayer():Void
    {
        vidPlayer._x = flv_array[playingVideoNum].x;
        vidPlayer._y = flv_array[playingVideoNum].y;

    }
    private function addListeners():Void
    {
        vidPlayer.addEventListener("ready",Delegate.create(this, finishedLoading));
        vidPlayer.addEventListener("complete",Delegate.create(this, finishedPlaying));
    }
    private function finishedLoading(vid:Object):Void
    {
        if (loadingVideoNum<totalFLVs)
        {
            loadingVideoNum++;
            vidPlayer.activeVideoPlayerIndex = loadingVideoNum;
            vidPlayer.load(flv_array[loadingVideoNum].file_name);

        }
    }
    private function finishedPlaying(vid:Object):Void
    {
        playingVideoNum++;
        playingVideoNum %= totalFLVs;
        placeVidPlayer();
        vidPlayer.activeVideoPlayerIndex = playingVideoNum;
        vidPlayer.visibleVideoPlayerIndex = playingVideoNum;
        //
        vidPlayer.play();

    }
}

Det fungere således at man smider et array med stier til eksterne flv film som så bliver afspillet efter hinanden og når alle filme er færdige spillet så bliver der loopet.

Når den afspiller video 1 så loader den video 2 osv, - endvidere har hver video site eget video player object, - så jeg loader altså den næste film ind i et højere visibleVideoPlayerIndex så der ikke kommer blink når den skifter.

Det virker helt perfekt, -
det der IKKE virker er at når jeg trykker på min knap som starter det hele, - så vil jeg gerne have den til at opfører sig som var det første gang, - men det sker altså ikke.

Jeg kan ligesom ikke få det resettet!

Kan du sige mig hvordan jeg får det fikset?

vh

KalleBalle
Avatar billede kalleballe Nybegynder
23. maj 2007 - 12:51 #7
Jeg skal altså have slette objektet helt når jeg trykker på knappen og så lave et nyt, - men hvordan ;)
Avatar billede kalleballe Nybegynder
23. maj 2007 - 12:55 #8
min knap har følgende kode:

var slukLydVideo:RandomVideos = new RandomVideos();
slukLydVideo.getVideo(video0.vidPlayer,video_sluk_lyd);

hvis jeg så trykker 2 gange så bliver den bare ved med at spille den forrige video.
Avatar billede kalleballe Nybegynder
23. maj 2007 - 13:41 #9
hm det ser ud til at hjælpe:

import mx.utils.Delegate;
import mx.video.FLVPlayback;
import mx.events.*;

class RandomVideos
{
    private static var vidPlayer:FLVPlayback;
    private var cp:TextField;
    private var flv_array:Array;
    private var loadingVideoNum:Number = 0;
    private var playingVideoNum:Number = 0;
    private var totalFLVs:Number;
    private var m:Number = 0;




    public function getVideo(p_video:FLVPlayback, dataContainer:Array)
    {
        playingVideoNum = 0;
        loadingVideoNum = 0;
        vidPlayer.activeVideoPlayerIndex = playingVideoNum;
        vidPlayer.visibleVideoPlayerIndex = playingVideoNum;
        vidPlayer.removeEventListener("ready",finishedLoading);
        vidPlayer.removeEventListener("complete",finishedPlaying);

        vidPlayer = p_video;
        flv_array = dataContainer;
        totalFLVs = flv_array.length;
        vidPlayer.contentPath = flv_array[playingVideoNum].file_name;
        placeVidPlayer();
        vidPlayer.play();
        addListeners();



    }
    private function placeVidPlayer():Void
    {
        vidPlayer._x = flv_array[playingVideoNum].x;
        vidPlayer._y = flv_array[playingVideoNum].y;

    }
    private function addListeners():Void
    {
        vidPlayer.addEventListener("ready",Delegate.create(this, finishedLoading));
        vidPlayer.addEventListener("complete",Delegate.create(this, finishedPlaying));
    }
    private function finishedLoading(vid:Object):Void
    {
        if (loadingVideoNum<totalFLVs)
        {
            loadingVideoNum++;
            vidPlayer.activeVideoPlayerIndex = loadingVideoNum;
            vidPlayer.load(flv_array[loadingVideoNum].file_name);

        }
    }
    private function finishedPlaying(vid:Object):Void
    {
        playingVideoNum++;
        if (playingVideoNum<totalFLVs)
        {
            placeVidPlayer();
            vidPlayer.activeVideoPlayerIndex = playingVideoNum;
            vidPlayer.visibleVideoPlayerIndex = playingVideoNum;
            vidPlayer.play();
        }
       
       
        trace("slut prut finale");


    }
}

at

private static var vidPlayer:FLVPlayback; er blevet static... så bliver den da overskrevet ;)

Men jeg kan stadig ikke få de listeners til at stoppe, - ikke at det gøre det store tror jeg.

vh


KalleBalle
Avatar billede mat Nybegynder
30. maj 2007 - 09:55 #10
Er spørgsmålet stadig relevant? Hvis ja, kan du evt ligge filer op et sted så man kan teste?

mvh mat
Avatar billede kalleballe Nybegynder
30. maj 2007 - 10:17 #11
Hej, - jeg har droppet det og lavet et par simple funktioner, - det virker fint, - det er som om der sker underlige ting når man arbejder med activeVideoPlayerInded i flv komponentet, - men ellers tak for hjælpen.

vh

KalleBalle
Avatar billede kalleballe Nybegynder
13. juni 2007 - 10:16 #12
mat smid et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester