PDA

Volledige versie bekijken : Oplossing gevraagd voor structuur vraagstuk


PageMaker
%Europe/Berlin %758 %2010, 18:11
Ik weet niet goed hoe ik de vraag duidelijk moet stellen, doe toch maar een poging.
Ik heb in m'n applicatie een klasse Main. Vanuit Main wil ik:
1. Opvragen van een foto-url uit zeg maar een lijst. Na de keuze klik terug naar Main met als buit de url naar de gekozen foto;
2. Nu het laden van de gekozen foto en na het laden terug naar Main met als buit de geladen foto;
3. Tonen van de geladen foto en na de klik op "Sluiten" terug naar Main.
Hierna kan het hele spel weer opnieuw beginnen.

Wat ik nu heb is dat er telkens in Main, 1, en 2 een event wordt gedispatched waardoor Main, 1, 2, en 3 als het ware een serie sequentiële acties in een keten vormen; zeg maar een bus-structuur, terwijl ik een ster-structuur zou willen.
Hoe maak ik die ster-structuur? Dat moet toch ook met events en eventlisteners kunnen; alleen ik weet niet hoe, kan (wil) iemand me op weg helpen?

PageMaker
%Europe/Berlin %560 %2010, 13:27
Enig (internet) onderzoek leidt mij in de richting dat ik wellicht meerdere eventlisteners in Main moet plaatsen in plaats van in de klassen voor het uitvoeren van de bewerkingen in 1, 2 en 3.
Maar eens kijken wat dat oplevert; en als er iemand is met een suggestie houd ik me aanbevolen.

PageMaker
%Europe/Berlin %585 %2010, 14:03
45 man begrijpen waarschijnlijk niet wat ik bedoel: dus dat ligt aan mij.
Het probleem aan de hand van een stukje voorbeeld code:
// Main.as
private var myImage:Bitmap;
var image:LoadImage = new LoadImage( urlStr );
image.addEventListener( 'imgLoaded', onImgLoaded );
function onImgLoaded( evt:Event )
{
var img = evt.currentTarget as LoadImage;
myImage = img.thisImage; <== Dit is wat ik graag wil doen!
}

var someVar:SomeClass = new SomeClass( myImage );
someVar.addEventListener( 'someEvent', onSomeEvent );
function onSomeEvent( evt: Event )
{
Hier weer dezelfde truuk als hiervoor en eventueel net zo vaak herhalen
als nodig is
}

// LoadImage.as
public class LoadImage (extends wanneer dat noodzakelijk is)
{
public var thisImage:Bitmap;

public function LoadImage( urlStr:String ):void
{
loader.contentbla.addEventListener( Event.COMPLETE, onComplete );
loader.load( etc );
}

private function onComplete( evt:Event ):void
{
thisImage = Bitmap( loader.content);
dispatchEvent( new Event( 'imgLoaded' ));
}
}Kan dit uberhaupt of ben ik ALTIJD verplicht te wachten tot de eventHandler klaar is; of moet ik dit hele idee maar vergeten omdat ik windmolens najaag?

jaspermuts
%Europe/Berlin %647 %2010, 15:32
Dit is toch prima? Je LoadImage moet idd wachten tot ie klaar is (onComplete wordt uitgevoerd), laten zeggen dat ie klaar is ('imgLoaded' wordt gedispatched).
En je Main class moet idd luisteren naar dat imgLoaded event. Als dat imgLoaded event is geweest, dan zal thisImage nooit leeg zijn (wel rare naamgeveng btw, eigenlijk staat er namelijk this.thisImage).
Ik weet niet wat SomeClass zou moeten doen, maar als die ook iets moeten laden zou je dan toch ook een nieuwe LoadImage voor kunnen gebruiken? Of deze iets aanpassen/extenden dat ie niet alleen Bitmaps aankan.
Ik moet wel zeggen dat nu een class met een Loader hebt (LoadImage) die vrijwel precies hetzelfde kan/doet als een Loader zelf, dus je zou net zo goed een Loader kunnen gebruiken ipv een LoadImage.

Jan
%Europe/Berlin %702 %2010, 16:51
Ik moet wel zeggen dat nu een class met een Loader hebt (LoadImage) die vrijwel precies hetzelfde kan/doet als een Loader zelf, dus je zou net zo goed een Loader kunnen gebruiken ipv een LoadImage.
Dat vind ik (waarschijnlijk samen met die 44 ander) al vanaf het begin.
var myImage:Bitmap;
var loader:Loader;
var imgUrl:String='folder/photo';
var counter:int=0;

public function Main()
{
loadNext();
}
function loadNext()
{
counter++;
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.CO MPLETE, onLoadComplete);
loader.load(new URLRequest(imgUrl+counter+'.jpg'));
}
function onLoadComplete(event:Event):void
{
myImage = event.currentTarget.content;
var someVar:SomeClass = new SomeClass(myImage);
someVar.addEventListener('someEvent', onSomeEvent);

}
function onSomeEvent(event: Event):void
{
loadNext();
}

Of je loader, myImage en someVar als local variable wil of instance member kon ik uit de uiteindelijke bedoeling niet afleiden.

Jan