Comunidad de diseño web y desarrollo en internet online

Galería de imágenes con txt en AS3

Citar            
MensajeEscrito el 25 May 2010 03:57 pm
Tengo una galería de imágenes con textos dinámicos (Precio), los he cargado desde una XML, pero cuando pulso sobre cualquier texto siempre se carga el ultimo. Quiero que en cualquier txt, se pueda representar o controlar cada uno. Quiero llamarlo desde el fotograma principal mediante actionscript 3 y utilizo el siguiente código.
import flash.display.Graphics;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequest;
import flash.events.MouseEvent;

var columns:Number;
var i:Number;
var myXML:XML;
var my_x:Number;
var my_y:Number;
var my_thumb_width:Number;
var my_thumb_height:Number;
var my_descripcion:XMLList;
var my_modelo:XMLList;
var my_precio:XMLList;
var my_images:XMLList;
var my_total:Number;

var my_textoprecio_x:Number;
var my_textoprecio_y:Number;
var x_con:Number = 0;
var y_con:Number = 0;
var x_cont:Number = 0;
var y_cont:Number = 0;
var x_conta:Number = 0;
var y_conta:Number = 0;

var container_mc:MovieClip;
var x_counter:Number = 0;
var y_counter:Number = 0;

var myXMLLoader:URLLoader = new URLLoader();
myXMLLoader.load(new URLRequest("./xml/Gallery_copia.xml"));
myXMLLoader.addEventListener(Event.COMPLETE, processXML);

function processXML (e:Event) :void {
var myXML:XML = new XML(e.target.data);

columns = myXML.@COLUMNS;
my_x = myXML.@XPOSITION;
my_y = myXML.@YPOSITION;
my_thumb_width = myXML.@WIDTH;
my_thumb_height = myXML.@HEIGHT;
my_textoprecio_x = myXML.@XPRECIO;
my_textoprecio_y = myXML.@YPRECIO;
my_descripcion = myXML.IMAGE.@DESCRIPCION;
my_modelo = myXML.IMAGE.@MODELO;
my_precio = myXML.IMAGE.@PRECIO;
my_images = myXML.IMAGE;
my_total = myXML.*.length();

createContainer();
callThumbs();
textoPrecio_mc();
textoDescripcion_mc();
textoModelo_mc()
}

function createContainer() :void {
container_mc = new MovieClip();
container_mc.x = my_x;
container_mc.y = my_y;
addChild(container_mc);

container_mc.addEventListener(MouseEvent.CLICK, callFull);

}

function callThumbs() :void {
for (var i:Number = 0; i < my_total; i++) {
var thumb_url = my_images[i].@THUMB;;
var thumb_loader = new Loader();
thumb_loader.load(new URLRequest(thumb_url));
thumb_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, thumbLoaded);

thumb_loader.name = i;

thumb_loader.x = (my_thumb_width + 10) * x_counter;
thumb_loader.y = (my_thumb_height + 10) * y_counter;

if (x_counter + 1 < columns) {
x_counter++;
}else{
x_counter = 0;
y_counter++;
}
}
}

function thumbLoaded(e:Event) :void {
var my_thumb:Loader = Loader(e.target.loader);
container_mc.addChild(my_thumb);
}

function callFull(e:MouseEvent) :void {
var full_loader:Loader = new Loader();
var full_url = my_images[e.target.name].@FULL;
full_loader.load(new URLRequest(full_url));

full_loader.contentLoaderInfo.addEventListener(Event.INIT, fullLoaded);
}

function fullLoaded(e:Event) :void {
var my_loader:Loader = Loader(e.target.loader);
addChild(my_loader);
//my_loader.x = (stage.stageWidth - my_loader.width / 2 );
//my_loader.y = (stage.stageHeight - my_loader.height / 2 );
my_loader.x = 50;
my_loader.y = 10;
}



function textoDescripcion_mc() :void {
for (var i:Number = 0; i < my_total; i++) {
var descripcion_url = my_images[i].@DESCRIPCION;;

var textoDescripcion:TextField = new TextField();
textoDescripcion.type = TextFieldType.DYNAMIC;

textoDescripcion.width = 80;
textoDescripcion.height = 16;
textoDescripcion.x = 30 + (my_textoprecio_x + 100) * x_con;
textoDescripcion.y = 85 + (my_textoprecio_y + 10) * y_con;

if (x_con + 1 < columns){
x_con++;
} else {
x_con = 0;
y_con++;
}
textoDescripcion.wordWrap = false;
textoDescripcion.background = true;
textoDescripcion.backgroundColor = 0x333333;
textoDescripcion.selectable = false;
var txtdFrmt:TextFormat = new TextFormat();
txtdFrmt.bold = true;
txtdFrmt.size = 13;
txtdFrmt.color = 0xffcb65;
txtdFrmt.align = TextFormatAlign.RIGHT;
textoDescripcion.defaultTextFormat = txtdFrmt;
textoDescripcion.text = descripcion_url;
addChild(textoDescripcion);
}
}

function textoModelo_mc() :void {
for (var i:Number = 0; i < my_total; i++) {
var modelo_url = my_images[i].@MODELO;;

var textoModelo:TextField = new TextField();
textoModelo.type = TextFieldType.DYNAMIC;

textoModelo.width = 80;
textoModelo.height = 16;
textoModelo.x = 30 + (my_textoprecio_x + 100) * x_conta;
textoModelo.y = 100 + (my_textoprecio_y + 10) * y_conta;

if (x_conta + 1 < columns){
x_conta++;
} else {
x_conta = 0;
y_conta++;
}
textoModelo.wordWrap = false;
textoModelo.background = true;
textoModelo.backgroundColor = 0x333333;
textoModelo.selectable = false;
var txtmFrmt:TextFormat = new TextFormat();
txtmFrmt.bold = true;
txtmFrmt.size = 13;
txtmFrmt.color = 0xffcb65;
txtmFrmt.align = TextFormatAlign.RIGHT;
textoModelo.defaultTextFormat = txtmFrmt;
textoModelo.text = modelo_url;
addChild(textoModelo);
}
}

function textoPrecio_mc() :void {
for (var i:Number = 0; i < my_total; i++) {
var precio_url = my_images[i].@PRECIO;;

var precio_mc:mc = new mc();

precio_mc.text = i;

precio_mc.x = 30 + (my_textoprecio_x + 100) * x_cont;
precio_mc.y = 114 + (my_textoprecio_y + 10) * y_cont;

if (x_cont + 1 < columns){
x_cont++;
} else {
x_cont = 0;
y_cont++;
}
precio_mc.precio_txt.text = precio_url;
addChild(precio_mc);

precio_mc.addEventListener(MouseEvent.MOUSE_MOVE, myOver);
precio_mc.addEventListener(MouseEvent.MOUSE_OUT, myOut);
precio_mc.addEventListener(MouseEvent.MOUSE_DOWN, myPress);

function myOver(evt:MouseEvent) :void {
precio_mc.alpha = .5;
}

function myOut(evt:MouseEvent) :void {
precio_mc.alpha = 1;
}

function myPress(evt:MouseEvent) :void {
var t:TextField = new TextField();
t.text = (precio_url) ;
addChild(t);
}
}
}

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 25 May 2010 04:31 pm
Jesús, dos cosas antes de empezar
1.-Trata de poner el código entre [a s] y [/a s] (sin los espacios). Así se podrá leer mejor
2.-Podrías tratar de poner sólo el código que está implicado (nos daría menos "flojera")
3.-(no lo tomes a mal) cuando cortamos+pegamos código, debemos hacer un esfuerzo por ver cómo funcionan los códigos y por qué -si no se entiende, para eso estamos.

Vale, al lío. Tienes

Código ActionScript :

function textoPrecio_mc() :void {   
   for (var i:Number = 0; i < my_total; i++) {      
      var precio_url = my_images[i].@PRECIO;;
      var precio_mc:mc = new mc();            
      precio_mc.text = i;
      precio_mc.x = 30 + (my_textoprecio_x  + 100) * x_cont;
      precio_mc.y = 114 + (my_textoprecio_y + 10) * y_cont;       
      if (x_cont + 1 < columns){
         x_cont++;
      } else {
         x_cont = 0;
         y_cont++;
      }
      precio_mc.precio_txt.text = precio_url;
      addChild(precio_mc);
      
      precio_mc.addEventListener(MouseEvent.MOUSE_MOVE, myOver);
      precio_mc.addEventListener(MouseEvent.MOUSE_OUT, myOut);
      precio_mc.addEventListener(MouseEvent.MOUSE_DOWN, myPress);
      
      function myOver(evt:MouseEvent) :void {
         precio_mc.alpha = .5;
      }         
      
      function myOut(evt:MouseEvent) :void {
         precio_mc.alpha = 1;
      }         
      
      function myPress(evt:MouseEvent) :void {         
         var t:TextField = new TextField();
         t.text = (precio_url) ;
         addChild(t);
      }         
   }
}

Las funciones en AS3 son independientes. Vamos, no es conveniente poner una función dentro de otra función (de hecho cuando lo veo me pongo "atacao"). Así que lo primero es sacar fuera las funciones myOver, myOut y myPress

Código ActionScript :

function textoPrecio_mc() :void {   
   for (var i:Number = 0; i < my_total; i++) {      
      var precio_url = my_images[i].@PRECIO;;
      var precio_mc:mc = new mc();            
      precio_mc.text = i;
                ....
      precio_mc.precio_txt.text = precio_url;
      addChild(precio_mc);
      
      precio_mc.addEventListener(MouseEvent.MOUSE_MOVE, myOver);
      precio_mc.addEventListener(MouseEvent.MOUSE_OUT, myOut);
      precio_mc.addEventListener(MouseEvent.MOUSE_DOWN, myPress);
         }
}
      
function myOver(evt:MouseEvent) :void {
   precio_mc.alpha = .5;
}         
function myOut(evt:MouseEvent) :void {
   precio_mc.alpha = 1;
}         
function myPress(evt:MouseEvent) :void {         
   var t:TextField = new TextField();
   t.text = (precio_url) ;
   addChild(t);
}         

Sí, poner las funciones como las tenías antes no hace sino "repetir la definición de las funciones" varias veces. Sí, no estamos definiendo 100 funciones, sino sólo 3 -aunque estén dentro de un for-

Ahora vemos por qué no funciona. DENTRO de myOver, myOut y MyPress NO tienen valor "precio_mc" ni "precio_url". Las únicas variables que podemos usar son las que vienen con el argumento (evt) y las que has definido fuera de cualquier función -a estas últimas yo las llamo sin demasiada propiedad "definidas a nivel de frame"-

Respecto las funciones myOver y MyOut no hay problema, puesto que "evt.target" es precisamente a quién le hemos añadido el listener. Esto es, podemos cambiar la función myOut por

Código ActionScript :

function myOver(evt:MouseEvent) :void {
   evt.target.alpha = .5;
}         

La que "nos complica" es la función myPress, puesto que necesitaríamos el valor de "precio_url". Bueno, realmente nos valdría con conocer la "i" particular de ese precio_mc en concreto, puesto que precio_url es "my_images[i].@PRECIO;"
Bueno, resulta que tienes escrito dentro del bucle

Código ActionScript :

precio_mc.text = i;

así que, ya que el precio_mc en concreto al que le ocurre ello es evt.target, ya lo tenemos

Código ActionScript :

function myPress(evt:MouseEvent) :void {          
         var t:TextField = new TextField(); 
         var index:Number=Number(evt.target.text)
         t.text = (my_images[index].@PRECIO) ; 
         addChild(t); 
      }   

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 May 2010 05:31 pm
Gracias Eliseo2, tendré en cuenta tus recomendaciones, la función myPress no me presenta nada en el txt., te pongo la xml.
La función me debe capturar el precio representado.
<?xml version="1.0" encoding="utf-8"?>
<GALLERY COLUMNS="5" XPOSITION="10" YPOSITION="30" WIDTH="100" HEIGHT="100" XPRECIO="10" YPRECIO="100">
<IMAGE FULL="Galerias/full_images/image1.jpg" THUMB="Galerias/thumbs/thumb1.jpg" DESCRIPCION="UNO" MODELO="AAAAA" PRECIO="1.00 €" />

</GALLERY>

Gracias.

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 May 2010 08:37 am
Cuando no funciona, debemos saber por qué no funciona. Un modo cómodo es usar "trace" para saber si estamos recibiendo lo esperado

Código ActionScript :

function myPress(evt:MouseEvent) :void {   
         trace(evt.target)  //<--debería ser un MC
         trace(evt.target.text)  //<---debería ser un string con el número
         trace(my_images[0].@PRECIO)  //<---debería ser el precio del primer elemento
        
         var t:TextField = new TextField();  
         var index:Number=Number(evt.target.text) 
         t.text = (my_images[index].@PRECIO) ;  
         addChild(t);  
      }    

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 May 2010 12:14 pm
Gracias por tu respuesta, ya esta solucionado, la función quedaría así.

function myPress(evt:MouseEvent) :void {
var t:TextField = new TextField();
var i:Number = Number(evt.target.text);
//t.text = (my_images[i].@PRECIO);
t.text = (evt.target.text);
addChild(t);
}

Por Jesus Lopez

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Jun 2010 11:00 am
Tengo otra duda, como puedo capturar los textos de textoModelo y textoDescripcion cuando pulso el precio para ponerlos en un texto dinámico.

Por Jesus Lopez

10 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.