Avatar billede kalleballe Nybegynder
16. maj 2007 - 10:05 Der er 18 kommentarer og
1 løsning

hjælp til observer pattern

Hej, - jeg har en menu med forskellige knapper, - så har jeg en scene med forskellige objekter, - jeg vil så gerne bruge observer 'mønstret' til at få mine objekter på scenen til at holde øje med mine knapper, - jeg kan sagtens gøre på 'den gamle måde', - men jeg vil gerne prøve at bruge lidt oop her ;)

Jeg er godt klar over at en simpel observer er



foo = new Object();

foo.onKeyDown = function(){
  trace("Foo saw a key go down!");
}

Key.addListener(foo);


hvor foo objektet holder øje med Key objektet, - men hvordan skriver man en observer klasse som man kan registrere objekter til og som så modtager besked når et bestemt objekt er ændret?



vh

KalleBalle
Avatar billede barklund Nybegynder
16. maj 2007 - 10:35 #1
Jeg forstår ikke helt dit spørsgmål. Vil du lave en observer (der lytter) eller en dispatcher (der udsender)?

Kig eventuelt denne artikel igennem:

http://actionscript.dk/artikler/?a=28&s=1#introduktion

--
Morten Barklund
Avatar billede kalleballe Nybegynder
16. maj 2007 - 12:27 #2
Hej, - tak for linket, - det tjekker jeg ud.

Mht. spørgsmålet, - jeg har en klasse der kan afspille video, - jeg vil så gerne have at den 'lytter' så efter f.eks. om der bliver trykket på en knap, - dvs. når man trykker på knappen skal der usendes en besked, - for jeg vil måske gerne have at flere objekter modtager denne besked og altså lytter, - og så var det jeg ville prøve at bruge observer 'mønstret' bare for ikke at genopfinde den dybe tallerken.

vh

KalleBalle
Avatar billede kalleballe Nybegynder
16. maj 2007 - 12:35 #3
Det er vist faktisk nogenlunde som på side 6 :)
Avatar billede kalleballe Nybegynder
16. maj 2007 - 13:21 #4
Er dette rigtigt:

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

class VideoPlayer2
{
    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;

    function VideoPlayer2()
    {
        // lav mig til en udgiver
        mx.events.EventDispatcher.initialize(this);

    }
    // lav tomme funktioner, som eventdispatcher'en overskriver
    function dispatchEvent()
    {
    }
    function addEventListener()
    {
    }
    function removeEventListener()
    {
    }


    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);

            // lav dispatch objekt
            var vid_objekt=new Object  ;
            vid_objekt.target=this;
            vid_objekt.type="nyVideo";
            vid_objekt.vid=vid;
            // send dispatch
            dispatchEvent(vid_objekt);
        }
    }
    private function finishedPlaying(vid:Object):Void
    {

        // video er stoppet, lav dispatch objekt
        var vid_objekt=new Object  ;
        vid_objekt.target=this;
        vid_objekt.type="stopVideo";
        vid_objekt.vid=vid;
        // send dispatch
        dispatchEvent(vid_objekt);

        playingVideoNum++;
        playingVideoNum%= totalFLVs;
        placeVidPlayer();
        vidPlayer.activeVideoPlayerIndex=playingVideoNum;
        vidPlayer.visibleVideoPlayerIndex=playingVideoNum;
        vidPlayer.play();

    }
}

Kan du sige mig hvordan jeg så får flere objekter til at lytte på om min video er stoppet eller startet?
Avatar billede barklund Nybegynder
16. maj 2007 - 13:31 #5
Du kan lytte ved at have en reference til din VideoPlayer2-klasses instans og tilføje addEventListener:

...
var vidPlayer2:VideoPlayer2 = somewhere;
vidPlayer2.addEventListener("nyVideo",Delegate.create(this,onNyVideo));
...

:)

--
Morten Barklund
Avatar billede kalleballe Nybegynder
16. maj 2007 - 14:27 #6
hm jeg kan ikke få det til at virke, - hvis vi nu har et tekst felt, - hvordan får jeg så det til at blive opdatere (ved at det lytter) når videoens status ændres?

vh

KalleBalle
Avatar billede barklund Nybegynder
16. maj 2007 - 15:06 #7
Skaf en reference til video-klassen, tilføj en funktion der lytter, og i den funktion, ret tekstfeltet.

var min_video:VideoPlayer2 = _root.foobar.boing; // hvor den nu er
min_video.addEventListener("nyVideo", min_funktion);
function min_funktion(evt:Object):Void {
  mit_tekstfelt.text = "Ny video";
}
Avatar billede kalleballe Nybegynder
16. maj 2007 - 15:25 #8
tak, - jeg skriver:

var min_video:VideoPlayer2 = new VideoPlayer2();
        min_video.addEventListener("nyVideo",min_funktion);
        function min_funktion(evt:Object):Void
        {
            trace("Ny video");
        }
men desværre kalder den aldrig min_funktion så jeg må jo gøre et eller andet forkert ;)
Avatar billede barklund Nybegynder
16. maj 2007 - 15:33 #9
Men du starter da heller ikke din VideoPlayer2? Du laver en ny instans, som du ikke gør noget ved - du skal vel sige, at den skal afspille?
Avatar billede kalleballe Nybegynder
16. maj 2007 - 15:38 #10
mit video komponent står til autostart, - derfor starter den skam fint ;)
Avatar billede barklund Nybegynder
16. maj 2007 - 15:50 #11
Men hvor er din komponent? Og hvordan hænger din komponent sammen med VideoPlayer2? Hvis du skriver "new VideoPlayer2();" starter komponenten så? Og den starter ikke, hvis du ikke skriver det?
Avatar billede kalleballe Nybegynder
16. maj 2007 - 15:54 #12
mit komponent ligger på scenen, - jeg starter komponentet med:

var myPlayer:VideoPlayer2 = new VideoPlayer2();
myPlayer.getVideo(vidPlayer,videoSoundOff);

hvor vidPlayer er navnet på komponentet og videoSoundOff er et array med specielle videoer.
Avatar billede barklund Nybegynder
16. maj 2007 - 16:13 #13
Så skal du jo bruge den samme myPlayer inde hvor dit tekstfelt er - du skal jo ikke lave en ny?

Hvis jeg laver en button-komponent et sted og vil lytte på den et andet sted, så skal jeg jo ikke lave en ny button-komponent derovre - men bruge den samme :)
Avatar billede kalleballe Nybegynder
16. maj 2007 - 16:31 #14
ok så jeg skriver altså


        myPlayer.addEventListener("nyVideo",min_funktion);
        function min_funktion(evt:Object):Void
        {
            trace("Ny video");
        }

i stedet

ps. jeg har ikke noget tekstfelt, - det var bare et eksempel.
Avatar billede barklund Nybegynder
16. maj 2007 - 17:06 #15
Ja :)
Avatar billede kalleballe Nybegynder
17. maj 2007 - 07:08 #16
ok, - tak for hjælpen.

vh

KalleBalle
Avatar billede barklund Nybegynder
17. maj 2007 - 17:34 #17
Finfin :)
Avatar billede barklund Nybegynder
17. maj 2007 - 20:47 #18
Taktak :)
Avatar billede kalleballe Nybegynder
21. maj 2007 - 09:01 #19
sorry mr. B, - men jeg kan squ ikke få det til at virker, - du får lige koden

var myPlayer2:VideoPlayer2 = new VideoPlayer2();
myPlayer2.getVideo(vidPlayer2,videoFacts);

getVideo loader en flv
       
myPlayer2.addEventListener("stopVideo",min_funktion);

function min_funktion(evt:Object):Void
        {
            trace("Ny video");
        }


og her er så lige klassen igen:

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

class VideoPlayer2
{
    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;

    function VideoPlayer2()
    {
        // lav mig til en udgiver
        EventDispatcher.initialize(this);

    }
    // lav tomme funktioner, som eventdispatcher'en overskriver
    function dispatchEvent()
    {
    }
    function addEventListener()
    {
        trace("jeg er i fx");
    }
    function removeEventListener()
    {
    }


    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);

            // lav dispatch objekt
            var vid_objekt = new Object();
            vid_objekt.target = this;
            vid_objekt.type = "nyVideo";
            vid_objekt.vid = vid;
            // send dispatch
            dispatchEvent(vid_objekt);
        }
    }
    private function finishedPlaying(vid:Object):Void
    {

        // video er stoppet, lav dispatch objekt
        var vid_objekt = new Object();
        vid_objekt.target = this;
        vid_objekt.type = "stopVideo";
        vid_objekt.vid = vid;
        // send dispatch
        dispatchEvent(vid_objekt);

        playingVideoNum++;
        playingVideoNum %= totalFLVs;
        placeVidPlayer();
        vidPlayer.activeVideoPlayerIndex = playingVideoNum;
        vidPlayer.visibleVideoPlayerIndex = playingVideoNum;
        //
        vidPlayer.play();

    }
}


Desværre bliver trace("Ny video");
i min_funktion aldrig vist :(

Kan du se hvad jeg gør galt?

vh

KalleBalle
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