Ejemplos arrays y bucles

Volver al índice

Este es uno de los ejemplos explicados en clase. Crea 30 instancias de un símbolo de la biblioteca que ha sido asociado con una clase de actionscript (a través del menú propiedades al que se llega haciendo click con el botón derecho sobre el símbolo en la biblioteca) y las coloca en la escena en posiciones aleatorias.

Para que funcione, teneis que haber creado previamente un símbolo en la biblioteca que contenga una animación a vuestro gusto. Además deberéis exportarlo para actionscript. Esto se hace haciendo click con el botón de recho del ratón sobre el símbolo de la biblioteca y eligiendo propiedades.

exportar-para-actionscript.jpg

// Declaramos e inicializamos el array que va a contener las instancias de 
// nuestra animación 
var enjambre:Array = []; 
// Éste es el número de elementos que queremos que tenga nuestro array. Lo 
// usaremos para limitar el numero de veces que se repite el bucle que 
// rellena el array. 
const NUM_ABEJAS:int = 30; 
// Este es el bucle que rellena el array 
for (var i:int = 0 ; i < NUM_ABEJAS ; i++ ) 
{
   // rellenamos el elemento i del array con una nueva instancia AnimCirculo 
   enjambre[i] = new AnimCirculo(); 
   // Fijamos aleatoriamente las coordenadas de la nueva instancia 
   enjambre[i].x = Math.random() * stage.stageWidth; 
   enjambre[i].y = Math.random() * stage.stageHeight; 
   // Y la añadimos a la lista de visualización de la escena. 
   addChild(enjambre[i]); 
   // Todas las instucciones anteriores se repiten tantas veces como hemos 
   // fijado en la constante NUM_ABEJAS. En cada repetición consecutiva  
   // el valor de i se aumentará en 1, luego enjambre[i] apuntará a un 
   // elemento distinto del array enjambre.
} 

El siguiente es un desarrollo posterior del ejemplo anterior. Después de colocar las instancias de AnimCirculo en la escena, desplaza cada una de ellas, utilizando una animación de frenado, desde su posición original a una posición aleatoria.

var enjambre:Array = [];
// Ahora declaramos otro array para almacenar las posiciones de destino 
// de cada instancia
var destinos:Array = [];

const NUM_ABEJAS:int = 30;
const ANCHO_PANTALLA:int = stage.stageWidth;
const ALTO_PANTALLA:int = stage.stageHeight;


for (var i:int = 0 ; i < NUM_ABEJAS ; i++ ) 
{
	enjambre[i] = new AnimCirculo();
	enjambre[i].x = Math.random() * ANCHO_PANTALLA;
	enjambre[i].y = Math.random() * ALTO_PANTALLA;
	enjambre[i].scaleX = 0.5;
	enjambre[i].scaleY = 0.5;
	addChild(enjambre[i]);
	
	// Ahora también rellenamos el array de posiciones de destino 
	// en cada paso del bucle
	destinos[i] = new Point( Math.random() * ANCHO_PANTALLA, 
							 Math.random() * ALTO_PANTALLA);
	
}

// Definimos una función que se ejecutará (ver más abajo) en cada frame 
// y que modifica la posición de cada instancia reduciendo la distancia 
// a su destino en una veinteava parte de la misma.
// (utilizamos para ello la ecuación de frenado) 
function enCadaFrame(evento:Event):void 
{
	for (var j:int = 0 ; j < NUM_ABEJAS ; j++ ) 
	{
		enjambre[j].x = enjambre[j].x + (destinos[j].x - enjambre[j].x)/20;
		enjambre[j].y = enjambre[j].y + (destinos[j].y - enjambre[j].y)/20;
	}
}

// Por último suscribimos la función enCadaFrame() al evento que dispara la
// escena (stage) en cada fotograma
stage.addEventListener(Event.ENTER_FRAME, enCadaFrame);

y el resultado debería ser éste:
[gigya src=”https://dl.dropboxusercontent.com/u/3646945/newbeForever/esne/enjambre01.swf” width=”550″ height=”400″]

Volver al índice

8 opiniones en “Ejemplos arrays y bucles”

  1. Óscar, tengo alguna duda con el primer ejercicio de Flash, llevo como 3h probando y probando y me estoy desesperando ya.

    He logrado que se me pinten el nº de pelotas que quiera en el eje Y fijo y en el X pero con un Math Random. Supongo que valdrá para lo que pides, pero intento que al dar una vuelta al bucle se posicione por ejemplo +20 en el eje X y es imposible, no sé cómo.

    He probado también a crear fuera de bucle la primera pelota y luego ponerle que en el bucle, enjambre [i].x = pelota1.x +40; pero claro, la primera la pinta genial y las otras en la misma posición que la segunda, así que tampoco sé cómo hacerlo.

    Te pongo el código que llevo:

    var enjambre:Array = [];
    
    const NUM_ABEJAS:int = 10;
    
    for (var i:int = 0 ; i < NUM_ABEJAS ; i++)
    {
            enjambre [i] = new AnimCirculo();
            var animacion:MovieClip = new AnimCirculo ();
            enjambre [i].x = Math.random () * stage.stageWidth;
            enjambre [i].y = 40;
            enjambre [i].scaleX=0.7;
            enjambre [i].scaleY=0.7;
    
            addChild (enjambre[i]);
    }
    

    Si me puedes orientar un poco lo agradecería.
    Un saludo,

      1. vale, conseguido el primero.
        Una duda, después de hacer el addChild del enjambre, ¿se puede almacenar todo eso que pinta en una variable para luego duplicar esa variable varias veces y llenar la pantalla?

        1. Mmmmm, no.
          Como os sugerí, para llenar la pantalla necesitáis dos bucles, y colocarlos o anidarlos de la forma apropiada. Intenta sacarlo tú, que es así como se aprende de verdad, y si ves que no, me vuelves a preguntar.

  2. Vale, ya te vuelvo a dar el coñazo jajaja

    Tengo los dos primeros, pero en el tercero sólo consigo que se muevan hacia abajo, pero cuando acaba no consigo que suban. Lo he intentado creando una variable “abajo” que al terminar el bucle que las desplaza abajo se vuelva a “true”, y luego un if que si esta variable es positiva, vuelvan arriba. Pero no funciona, no sé si la idea es mala o el código. Te lo paso y me dices qué puedo estar haciendo mal

    import flash.geom.Point;
    import flash.events.Event;
    
    var enjambre:Array = []; 
    var destinos: Array = [];
    var abajo = "false";
    const NUM_ABEJAS:int = 9; 
    const ANCHO_PANTALLA : int = stage.stageWidth;
    const ALTO_PANTALLA : int = stage.stageHeight;
    
    for (var i:int = 0 ; i < NUM_ABEJAS ; i++)
    { 
    	enjambre [i] = new AnimCirculo();
    	var animacion:MovieClip = new AnimCirculo ();
    	enjambre [i].x = 30+(i*60);  
    	enjambre [i].y = 40;   
    	enjambre [i].scaleX=0.7;
    	enjambre [i].scaleY=0.7;
    		
    	addChild (enjambre[i]);
    	
    	destinos[i] = new Point (enjambre [i].x, 370);
    	
    }
    	
    function enCadaFrameAbajo(evento:Event):void 
    { 
    	for (var j:int=0; j<NUM_ABEJAS; j++)
    	{
    		enjambre[j].y = enjambre[j].y + (destinos [j].y - enjambre[j].y)/40;
    		var abajo = "true";
    	}
    	
    }
    stage.addEventListener(Event.ENTER_FRAME, enCadaFrameAbajo);
    
    if( abajo == "true" )
    {
    	destinos[k] = new Point (enjambre [k].x, 40);
    				
    	for (var k:int=0; k<NUM_ABEJAS; k++)
    	{
    		enjambre[k].y = enjambre[k].y + (destinos [k].y - enjambre[k].y)/40;
    	}
    }
    
    

    Un saludo,

    1. Jejeje. No, la idea no es mala, pero tienes algunos errores de concepto.

      Primero: la función enCadaFrame debería servir tanto para mover las abejas hacia abajo, como para moverlas hacia arriba. Asi que yo la cambiaría de nombre.

      Segundo: Tienes mal definida la variable abajo. No estás diciendo de que tipo es y esto es obligatorio (aunque a veces el compilador de Flash te deje no ponerlo):

          var abajo:Boolean = false;

      Además después la estás utilizando como una cadena. Es mucho más eficiente utilizar un booleano, porque sólo tiene dos valores posibles y si los escribes mal, el compilador se queja, lo cual es bueno.

      Tercero: aunque estuviera bien definida estas poniendo a true la variable abajo en cada paso del bucle, aunque creo que lo que intentas es ponerla cuando el bucle acabe. Ninguna de las dos cosas está bien. Porque lo que necesitas es poner abajo a true cuando las abejas hallan llegado abajo. Para eso necesitas comprobar si han llegado con un if.

      Cuarto: Los comandos que tienes dentro de ese if ( abajo == "true" ) se van a ejecutar antes de que comience la animación. (conste que utilizo abajo como lo has definido tú para no liarlo más, pero deberías cambiarlo) ¿Sorprendido? Al arrancar el programa se ejecuta el primer bucle y quedan definidas todas las variables que pones al principio. También queda definida la función enCadaFotograma y añadida a la lista de suscriptores del evento ENTER_FRAME que dispara stage en cada fotograma. Tal y como tienes el codigo, la comprobación if ( abajo == "true" ) se realiza justo después, y como todavía no se ha saltado al fotograma siguiente (la ejecución del código es así de rápida) lo que hay dentro del if no se ejecuta (porque abajo = "false" todavía). Ese if y su contenido, si es que procede, deben comprobarse en cada fotograma 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *