16. maj 2007 - 10:05Der 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?
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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);
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?
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"; }
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 ;)
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?
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 :)
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);
Desværre bliver trace("Ny video"); i min_funktion aldrig vist :(
Kan du se hvad jeg gør galt?
vh
KalleBalle
Synes godt om
Ny brugerNybegynder
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.