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 om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for 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.