Es sólo una nota ¿ok?
Cuando veo una función dentro de una función...
Ya sé que funciona, pero no debería
Paco, la idea de AS3 es que estén todas las funciones ya definidas. Así
function loadThumbnail()
function thumbLoaded()
y
function loadMainImage1()
Deberían(*) no estar una definida dentro de la otra.
Claro, que si las pones separadas NO va a funcionar puesto que "thumbLoader" no tendría valor DENTRO de la función thumbLoaded() ni "thisLargeImage","thisTitle" y "thisDescription" no lo tendrán DENTRO de la función loadMainImage1()
Vamos, mi idea de las funciones separadas es tener algo como
Código ActionScript :
//DE MOMENTO NO VA A FUNCIONAR
function loadThumbnail():void {
trace(imageNum);
var thumbLoader:Loader = new Loader();
thumbLoader.load(new URLRequest(thumbnailImageArray[imageNum]));
thumbLoader.x=105*imageNum;
var thisLargeImage:String=largeImageArray[imageNum];
var thisTitle:String=titleArray[imageNum];
var thisDescription:String=descriptionArray[imageNum];
thumbLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbLoaded);
//add to imageNum (1);
imageNum++;
if (imageNum<totalImages) {
loadThumbnail();
}
}
function thumbLoaded(event:Event):void {
galeria.allThumbnails.addChild(thumbLoader); //<---thumbLoader NO tiene valor
thumbLoader.addEventListener(MouseEvent.CLICK, loadMainImage1);
}
function loadMainImage1(event:MouseEvent):void {
galeria.largeUILoader.source=thisLargeImage; //<---thisLargeImage NO tiene valor
galeria.selectedTitle.text=thisTitle; //<----thisTitle NO tiene valor
galeria.selectedDesc.htmlText=thisDescription; //<--thisDescription NO tiene valor
}
Vamos a solucionar la función thumbLoaded
Como el evento Event.COMPLETE se lo añadimos a thumbLoader.contentLoaderInfo, podemos escribir
Código ActionScript :
function thumbLoaded(event:Event):void {
var loader:Loader =event.target.loader as Loader //<--recojo el valor de "event.target.loader"
galeria.allThumbnails.addChild(loader); //<---uso dicha variable
loader.addEventListener(MouseEvent.CLICK, loadMainImage1);
}
Vale, SIEMPRE la "propiedad"
currentTarget del evento es a quién añadimos el evento. Hay veces que se usa
target que es quien recibe el evento. En el caso de un contentLoaderInfo coinciden ambos valores
La "propiedad" target o currentTarget es de tipo Objeto. Así que, en general es buena idea crear una nueva variable e igualarla a event.target haciendo una "conversión de cast" (de otro modo no podríamos añadirle un lístener, por ejemplo). Es ese "as Loader"
Para hacer funcionar la función loadMainImage1 lo tenemos "un poco más complicado". No tenemos el valor de las variables "thisLargeImage","thisTitle" y "thisDescription", Sólo tenemos el valor de event (y, a través de él el valor de thumbLoader) Así que, de alguna manera se la tenemos que indicar.
Vemos que están definidas en la función loadThumbnail() como
Código ActionScript :
var thisLargeImage:String=largeImageArray[imageNum];
var thisTitle:String=titleArray[imageNum];
var thisDescription:String=descriptionArray[imageNum];
Ah! eso está mucho mejor. Ya que los Arrays están definidos a "nivel global", sólo precisaríamos conocer el valor de "imageNum".
Vale, cuando sólo precisamos un valor y tenemos un DisplayObject, es cómodo usar la "porpiedad" "name" de dicho displayObject. Así, si se llamasen "loader1","loader2"... podría hacer algo como
Código ActionScript :
function loadMainImage1(event:MouseEvent):void {
var loader:Loader =event.target as Loader //<--recojo el valor de "event.target
var index:int=Number(loader.name.substr(6));
var thisLargeImage:String=largeImageArray[index];
var thisTitle:String=titleArray[index];
var thisDescription:String=descriptionArray[index];
galeria.largeUILoader.source=thisLargeImage;
galeria.selectedTitle.text=thisTitle;
galeria.selectedDesc.htmlText=thisDescription;
}
Claro, que le tendríamos que dar valor a la propiedad "name" del loader. Eso lo haríamos en la función loadThumbnail()
Código ActionScript :
function loadThumbnail():void {
var thumbLoader:Loader = new Loader();
//...AQUÍ.....
thumbLoader.name="loader"+imageNum
...resto de código...
}
puff, Resumo las tres funciones para que lo veamos en conjunto
Código ActionScript :
function loadThumbnail():void {
trace(imageNum);
var thumbLoader:Loader = new Loader();
thumbLoader.name="loader"+imageNum //<---le doy NOMBRE
thumbLoader.load(new URLRequest(thumbnailImageArray[imageNum]));
thumbLoader.x=105*imageNum;
thumbLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbLoaded);
//add to imageNum (1);
imageNum++;
if (imageNum<totalImages) {
loadThumbnail();
}
}
function thumbLoaded(event:Event):void {
var loader:Loader =event.target.loader as Loader //<--recojo el valor de "event.target.loader"
galeria.allThumbnails.addChild(loader); //<---uso dicha variable
loader.addEventListener(MouseEvent.CLICK, loadMainImage1);
}
function loadMainImage1(event:MouseEvent):void {
var loader:Loader =event.target as Loader //<--recojo el valor de "event.target
var index:int=Number(loader.name.substr(6));
var thisLargeImage:String=largeImageArray[index];
var thisTitle:String=titleArray[index];
var thisDescription:String=descriptionArray[index];
galeria.largeUILoader.source=thisLargeImage;
galeria.selectedTitle.text=thisTitle;
galeria.selectedDesc.htmlText=thisDescription;
}
¿no queda un poco más claro?
(*)Siempre me ha jodido un poco lo de "debería"