Comunidad de diseño web y desarrollo en internet online

Controlar el número de copos en el efecto de nieve en Flash

Una consulta habitual, referente al tutorial del efecto de nieve en flash es cómo controlar el número de copos que se muestran en pantalla. A continuación presento una forma fácil y rápida de lograr esto, haciendo pequeños cambios en el código.

En la función createSnow introducimos al inicio un contador para llevar el control de los copos de nieve creados. Así podemos generar tantos copos como queramos, resolviendo el problema. El código de la función quedaría de la siguiente forma:

Código :

function createSnow() {
   /* El contador permitirá que sólo se muestren 20 copos en el escenario */
   if (snowCount >= 20) {
      return;
   } 

   /* Crea un copo de nieve a partir del patrón SnowFlake que está en la biblioteca */
   i = _root.getNextHighestDepth();
   tmp = _root.attachMovie("SnowFlake", "snowflake_mc"+i, i);
   /* El copo de nieve cae desde una posición horizontal en [1,550] */
   tmp._x = randRange(1, 550);
   /* Inicialmente, se coloca el copo de nieve fuera del escenario */
   tmp._y = -1;
   /* Ahora se particulariza el copo de nieve estableciendo aleatoriamente su transparencia, * velocidad y tamaño */   
   tmp._alpha = randRange(50, 100);
   tmp.speed = randRange(1, 10);
   tmp._xscale = randRange(70, 110);
   tmp._yscale = tmp._xscale;
   /* Todo copo de nieve inicia su descenso inmediatamente después de creado */
   tmp.moving = true;
   /* moveSnow es responsable de la dinámica del copo de nieve */
   tmp.onEnterFrame = moveSnow;

   /* Cada vez que se crea un copo se incrementa en 1 el contador*/
   snowCount++; 


}


Luego, en la función moveSnow, se van restando los copos una vez que éstos salen del escenario o se quedan detenidos en el cartel.

Código :

unction moveSnow() {
   /* Si el copo está en movimiento... */
   if (this.moving) {
      /* El copo desciende según su velocidad prefijada */
      this._y += this.speed;
      /* Para mayor realismo, el copo experimenta un desplazamiento lateral, oscilatorio */
      this._x += Math.cos(this._y/10);
      /* Si el copo colisiona con Ice_mc detenerlo. Como no se desea que el copo
               permanezca detenido indefinidamente, se utilizará un contador (stopCounter)
               para verificar que transcurra un tiempo prudente antes de remover el copo */
      if (this.hitTest(_root.rect_mc.Ice_mc)) {
         this.moving = false;
         this.stopCounter = 0;
      }
      /* Finalmente, los copos que lleguen al suelo serán eliminados de inmediato */
      if (this._y > 327){
         removeMovieClip(this);
         this.onEnterFrame = null;
         if (snowCount > 0) {
            snowCount--; //Cada vez que un copo llega al suelo se resta del contador
         }         
      }
   } 

   } else {
      /* Entrar aquí implica que el copo está detenido por colisionar con Ice_mc. Por ende,
               se incrementa el contador stopCounter, y si éste supera la cota superior
               preestablecida,  se procede a eliminar el copo */
      this.stopCounter++;
      if (this.stopCounter > 500) {
         this.onEnterFrame = null;
         this.removeMovieClip();
         trace(snowCount);
         if (snowCount > 0) {
            snowCount--; // Resta en 1 el contador de copos 
         }
      }
   }
}


Como ven es algo muy sencillo ^^

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro

Entra al foro y participa en la discusión

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate