Comunidad de diseño web y desarrollo en internet online

SOS problema con carga dinamica fotos+text+link

Citar            
MensajeEscrito el 25 Mar 2010 08:05 am
Hola a todos, espero que me pueden ayudar.

explico el problema estoy haciendo un (banner) SWF an AS3 , es como un lenta de noticias con XML
cuando ejecuto la animacion donde tengo un mc Item el cual carga las imagenes y toda la informacion que quiero ver, esto funciona perfectamente.
pero me quedaron 2 problemas.

1.- con el random, las imagenes las cargo en forma aleatoria, pero en algunas ocaciones se repiten los elementos que almaceno en mi arreglo. , es decir muestro cuatro elementos , en ocasiones se repiten dos.

2.- quiero hacer algo paracio a un scrool, es decir muestro, 4 lementos hago clik en siguente y me muestre los siguietes 4 y etc, y claro viceversa .

si alguien me pudiera ayudar , estaria muy agradecido :)

aca dejo el codigo del Banner.

Código ActionScript :

ackage {
   import flash.display.MovieClip;
   import flash.events.*;
   import flash.xml.*;
   import flash.net.*;
   import flash.system.*;
      
   public class Banner extends MovieClip {
      
      public function Banner() : void {
         //System.useCodePage = true;
         
         var xmlLoader:URLLoader = new URLLoader();
         xmlLoader.addEventListener(Event.COMPLETE, onLoadAction);
          
         xmlLoader.load(new URLRequest("http://xxxxxxxxxxxxxxxxxxxxxx"));
         
      }
                     
      public function onLoadAction(e:Event) : void {
         
         var xmlData:XML = new XML(e.target.data);
         var total:int = xmlData.children().length();
         var count:int = 0;
         var range:Array = new Array();
         for (var i:int = 0; i < total; i++) {
         
         
         var rand:int = Math.ceil(Math.random() * (total))-1;
                        trace(rand);
           
         var offer:XML = xmlData.children()[rand];
         var item:Item = new Item();
         this.addChild(item);
               
         item.y = 40;
         item.x = (205 * count) + 227;
                             
         item.setName(offer.title.text());
         item.setPrice(offer.original_title.text());
         item.setImageUrl(offer.poster);
         item.setLinkUrl(offer.link.text());
         
         if (++count == 4) {
                  break;
               }
      range.push(rand);
            }
      }
      
      
   }
}

Por Gero4

5 de clabLevel



 

chile

chrome
Citar            
MensajeEscrito el 25 Mar 2010 08:40 am
Lo del "aleatorio" es bastante fácil. Te creas un array con valores desde 0 a (total-1) y luego los desordenas, tal y como se muestra en el este tip.
Vamos, después de leer el XML y saber la logitud haces un bucle para rellenar el array y otro para desordenarlo.
Luego, en el bucle en que creas los items, en lugar de coger

Código ActionScript :

var offer:XML = xmlData.children()[rand];

coges

Código ActionScript :

var offer:XML = xmlData.children()[range[i]];

Evidentemente te ahorras en el bucle los random y no tocas es Array range.

Lo del siguiente y anterior puedes, o bien generar todos los "banners" y moverlos o hacerte una función que reciba un parámetro y muestre 4 banners. En los botones siguiente y anterior sumarías/restarías 4 a una variable y llamarías a la función.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Mar 2010 10:23 am
gracias pero si agrego range en lugar del rand, obtengo este error, TypeError: Error #1034: error tipo Coercion: no es posible XMLList@c2f64d9 в XML.
at Banner/onLoadAction()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()

Por Gero4

5 de clabLevel



 

chile

chrome
Citar            
MensajeEscrito el 25 Mar 2010 11:57 am
Gero, ¿entendistes lo que te dije al PRINCIPIO?
En tu función onLoadAction
1.-Tienes que crearte un array

Código ActionScript :

for (var i:int = 0; i < total; i++) { 
range.push(i)
}

2.-Luego tienes que desordenarlo

Código ActionScript :

for (int j=0;j<10;j++){ 
    var tmp:int=range[j] 
    var k:int=Math.floor(Math.random()*range.length)) 
    range[j]=range[k] 
    range[k]=tmp 
} 

3.-FINALMENTE, haces el bucle con tus items

Código ActionScript :

for (var k:int = 0; k < total;k++) { 
         var offer:XML = xmlData.children()[range[k]]; 
         var item:Item = new Item(); 
         this.addChild(item); 
         ....
}

NOTA:NO uses Math.ceil y luego le restes uno. Usa directamente Math.floor que te trunca el número

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Mar 2010 08:13 am
gracias, lo he provado y por el momento funciona , yo hice algunos cambios , y creo que porlomenos como codigo es mas puro .

Código ActionScript :

private var offset:uint = 0;
      private var xmlData:XML;
      
      public function Banner() : void {
         
         var xmlLoader:URLLoader = new URLLoader();
         xmlLoader.addEventListener(Event.COMPLETE, onLoadAction);
          xmlLoader.load(new URLRequest("http://xxxxxxxxxxxxxxxx/"));
         }
                     
      public function onLoadAction(e:Event) : void {
         
         this.xmlData = new XML(e.target.data);
         
         XMLList.prototype.shuffle=function(){
            for(var i=0;i<this.length();i++){
              var tmp=this[i];
              var randomNum=Math.ceil(Math.random() * (this.length()))-1;
              this[i]=this[randomNum];
              this[randomNum]=tmp;
            }
         }

         this.xmlData.children().shuffle();
         this.displayItems();
         
         forward.addEventListener(MouseEvent.CLICK, this.slideRight);
         back.addEventListener(MouseEvent.CLICK, this.slideLeft);
      }
         private function displayItems() : void {
         var count:int = 0;
         
         for (var i:int = this.offset; i < 2 + this.offset; i++) {
         
            //var rand:int = Math.ceil(Math.random() * (total))-1;
            //trace(rand);
              
            var offer:XML = this.xmlData.children()[i];
            var item:Item = new Item();
            this.addChild(item);
                  
            item.y = 40;
            item.x = (210 * count) + 294;
                              
            item.setName(offer.title.text());
            item.setPrice(offer.year.text());
            item.setImageUrl(offer.poster);
            item.setLinkUrl(offer.link.text());
            
            ++count;
      //range.push(rand);
         }
      }
         private function clearItems() : void {
         var item;
         var number:int = 0;
         var total:int = this.numChildren;
         for (var i:uint = 0; i < total; i++) {
            item = this.getChildAt(number);
            if (item.toString() == '[object Item]') {
               this.removeChildAt(number);
               number--;
            }
            number++;
         }
      }
         private function slideRight(e:MouseEvent) : void {
         this.offset += 2;
         
         this.clearItems();
         this.displayItems();
      }
         private function slideLeft(e:MouseEvent) : void {
         this.offset -= 2;
         
         this.clearItems();
         this.displayItems();
      }
   }
}



El pero ahora , es otro, es con los botones, ambos funcionan pero no se me ocurre como indicarles que se activen o desactiven , me explico al incio muetro los elemtos y en teoria en boton BACK no tendria que funcionar porque no hay elemtos que mostrar , o cuando el el boton FORWRAD llega al elemto 50 o X que tengo en mi arreglo , se desactive.

a alguien se le ocurre algo?

Por Gero4

5 de clabLevel



 

chile

chrome
Citar            
MensajeEscrito el 26 Mar 2010 09:42 am
Yo lo que suelo hacer es, en la función displayItems añadir al final algo del estilo (*)

Código ActionScript :

forward.visible=(cont<xmlData.numChildren)
back.visible=(cont>2+offset)

En lugar de visible puedes usar la propiedad "enabled"
(*)OJO es una idea a "vuela pluma" sin mirar mucho el código, así que los límites pueden estar mal

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Mar 2010 10:09 am
gracias, pero yo creo que mi problema esta en la ultima parte del codigo

Código ActionScript :


// Aca es donde cuando hago clik en el boton (adelante) , me agrga 2 nuevos items visibles 
 
 private function slideRight(e:MouseEvent) : void { 
         this.offset += 2; 
          
         this.clearItems(); 
         this.displayItems(); 
      } 

// aca es lo mismo pero los elimina
         private function slideLeft(e:MouseEvent) : void { 
         this.offset -= 2; 
          
         this.clearItems(); 
         this.displayItems(); 
      }



ahora bien el pero, es que por ejemplo tengo en mi arreglo xml, 50 elementos y no se como puedo hacer que la funcion mouseEvent se active o desactive , porque por logica , cuando muestro por primera bez no pueda retoceder en la muestra de elementos, y que cunado llegue al ultimo no puda seguir avanzando.

Por Gero4

5 de clabLevel



 

chile

chrome
Citar            
MensajeEscrito el 26 Mar 2010 10:13 am
o ben el problema , esta en esta parte.

Código ActionScript :

  
this.xmlData.children().shuffle(); 
         this.displayItems(); 
          // Aca estan definidos los botones
         forward.addEventListener(MouseEvent.CLICK, this.slideRight); 

         back.addEventListener(MouseEvent.CLICK, this.slideLeft);  

Por Gero4

5 de clabLevel



 

chile

chrome
Citar            
MensajeEscrito el 26 Mar 2010 10:37 am
Gero, lo que yo proponía es que según el valor de "offset" y el valor de "xmlData.length" disables o enables los botones. Pero que lo hagas mediante la propiedad "enabled" o la propiedad "visible". De ese modo no tienes que estar pensando en añadir listener y remover listeners. Tan sólo cambiando la propiedad enabled o la propiedad visible de los botones
¿dónde lo hacemos?
pues lo suyo es hacerlo en la función displayItems

NOTA:Por cierto tienes "this" por todas partes y no es necesario

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Mar 2010 11:00 am
hola, de verdad muchas gracias por tus respuestas, como tu lo has senalado antes la solucion a mi problema era muy pero muy simple :)

solo he agregado al codigo un par de lineas , no se si la mejor solucion pero en fin todo funciona bien.

Código ActionScript :

back.visible=(offset>0);
forward.visible=(offset<=44);



bueno el codigo lo dejo publicado por si a alguien el codigo completo con los archivos los publicare hoy, en una de esas a alguien tambien le puede servir.

Por Gero4

5 de clabLevel



 

chile

chrome

 

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