Comunidad de diseño web y desarrollo en internet online

Slide Show en flash. Ojalá alguien me pueda ayudar...

Citar            
MensajeEscrito el 31 May 2007 05:00 am
Tengo un "Slide Show" desarrollado en flash, de esos que capturan las imágenes a través de un archivo de texto, o sea que no están cargadas en el flash. No es para Internet por lo que no uso php ni xml, simplemente un archivo .txt con los datos de las imágenes y las descarga del disco duro.

La idea es que funcione como protector de pantalla, o sea a paltalla completa. Hasta aquí todo eso ya lo logré, incluso con cierto efecto, al asar y sin repetir. Pero hay algo que por más que he buscado no he encontrado o no he entendido como se hace y realmente frustra todo el proyecto pues es una deficiencia muy grande.

Lo que sucede es que el flash está configurado a tamaño de 1024x728, la mayoría de mis imágenes y mi monitor cumplen con esa proporción. Las imágenes de menor resolución obviamente no llenan la pantalla, pero se ven, pero el gran problema es que las que tienen una resolución mayor a 1024x768, pues solamente se ve una parte de ellas.

Lo que yo necesito es que con ActionScript, al ir descargando las fotos detecte la resolución de éstas, y de ser menor a 1024x768 haga una de 2 cosas (lo ideal sería las 2):

1. Que la descarte y siga con la siguiente (lo más fácil, aunque no se cómo hacerlo).
2. Que la redimensione y la presente como 1024x768. (menos se como hacerlo).

Me conformo con entender la primer solución. En resumen, lo que necesito básicamente es saber como obtener la resolución de una imagen cargada externamente y más avanzadamente, saber como redimensionar su aspecto, ésto con ActionScript.

No saben como agradecería el que alguien me pueda apoyar en este proyecto, incluso prometo donarlo pues me está quedando muy agradable.

Nota: Tengo Flash8.

Gracias de antemano.

Por Sir Arter

3 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 31 May 2007 02:18 pm
Cuando cargas la imagen la cargas dentro de un MovieClip que tiene un nombre de instancia
fijate en la instrucción
mcYYY.loadMovie(etc...); // donde mcYYY es el nombre de instancia del Movieclip donde se carga la imagen.

, y debes tener en tu codigo un detector de fin de carga de la imagen (onLoad),
dentro de este código preguntas por las propiedades del mcYYY (mcYYY._height y mcYYY._width) si son menores o mayores a las dimensiones que deseas, y luego calculas la escala que aplicaras para crecer o disminuir su tamaño
(dividiendo por ejemplo 1024 entre mcYYY._width y multiplicarlo por 100)
esta escala la aplicas al mcYYY con el siguiente código:

Código :

Escala = 1024 / mcYYY._width * 100;
mcYYY._xscale = mcYYY._yscale = Escala; // donde escala

Se aplica la misma escala a lo largo y ancho, para que no se deforme la imagen.

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 01 Jun 2007 03:17 am
Te agradezco infinitamente tu pronta y clara respuesta. Ya entiendo un poco más aunque todavía no me funciona, lo que pasa es que no lo supe adaptar porque yo primero leo de un archivo txt los nombres de las imágenes y después las voy cargando.

Te voy a escribir el inicio del código, para no confundirte solamente incluyo hasta donde se cargan las primeras 2 imágenes. Son 2 porque se van disolviendo. Me hubiera gustado incluír el código como lo arreglé yo a partir de tu asesoría, pero lo mejor es como estaba originalmente para no hacernos bolas. Al menos se muestra el proceso hasta donde aparecen el onLoad y el loadMovie.


info = new LoadVars();
info.load("imagenes.txt");

info.onLoad = function(leido) {
if(leido) {
fotos = new Array();
for( i=1; i<=info.total; i++ ) {
fotos[i] = this["foto"+i];
}
// Creamos un par de MovieClips Vacíos
// Primer MC Vacio ('imagen1') en el nivel 10
_root.createEmptyMovieClip("imagen1",10);
// Segundo MC Vacio ('imagen2') en el nivel 11
_root.createEmptyMovieClip("imagen2",11);
// Damos de alta el indice del Array
im = 1;
// Al primero le agregamos la primer imagen
imagen1.loadMovie("imagenes/" + fotos[im]);
im++; // Incrementamos el índice
// Agregamos la segunda imagen
imagen2.loadMovie("imagenes/" + fotos[im]);
// Modificamos la opacidad de 'imagen2'
imagen2._alpha = 0;

etc... etc... Hasta aquí funciona bien, pero muestra incompletas las imágenes > 1024x768.

Por mi te mandaría el código completo o hasta el flash, pero se me hace mucho abuso. Yo más o menos le entiendo a estas cosas pues soy programador desde hace como 30 años, pero de Basic, VBasic y similares, pero en realidad el ActionScript lo he aprendido de milagro, autodidácticamente y con el apoyo de gente como tu. Sin embargo todo esto me parece fascinante.

Este código lo obtuve de esta web, aunque claro, lo he ido adaptando, de hecho hay cosas que no entiendo, por ejemplo ¿Qué es eso de crear un MovieCli en el nivel 10?


Bueno, no te enroyo más y nuevamente agradezco tu ayuda.

Por Sir Arter

3 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 01 Jun 2007 02:05 pm
antes de todo tu codigo crea la siguiente función:

Código :

ValidaCarga = function () {
   if (this.getBytesLoaded() > 4 and this.getBytesLoaded() >= this.getBytesTotal()) {
      // se termino de cargar la imagen => se ajusta al tamaño 1024x768
      Escala = Math.min(1024/this._width, 768 / this._height)  * 100;
      this._xscale = this._yscale = Escala;
      delete this.onEnterFrame();
   }
}

y despues de cada loadMovie poner:

Código :

// Al primero le agregamos la primer imagen
imagen1.loadMovie("imagenes/" + fotos[im]);
imagen1.onEnterFrame = ValidaCarga; //  --------------------------linea nueva
im++; // Incrementamos el índice
// Agregamos la segunda imagen
imagen2.loadMovie("imagenes/" + fotos[im]);
imagen2.onEnterFrame = ValidaCarga; //  --------------------------linea nueva
// Modificamos la opacidad de 'imagen2'
imagen2._alpha = 0;

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 02 Jun 2007 09:10 am
Hola gabynufe:

Nuevamente agradezco tu apoyo. Hice muchas pruebas pero finalmente algo me falla porque no obtengo la resolución. Poniendo un trace indicándome la resol. obtenida, lo más que logré es que o me arraja 100 (o sea sin cambios) o infinito (me imagino que división entre 0).

Esta vez te envío el código completo, incluídas tus sugerencias. No es muy grande pues lo simplifiqué lo más que pude.

Por otro lado, si tienes tiempo y paciencia, yo tengo una web llamada Visión Virtual Iris, cuyo url es: www.viviris.com, en las opciones de la parte superior hay una llamada DOCUMENTOS, y ahí puse uno en letras grandes y rojas que dice: ARFOS: Para gabynufe. Es un zip de más o menos 2.6 mb con una carpeta llamada Arfos, que icluye los 3 archivos: Arfos.fla, Arfos.swf e imágenes.txt, ah y la sub-carpeta imagenes en la que solamente puse 4 ya que son algo grandes. Una de estas imágenes es el escudo de nuestra bandera y es la única de 1024x768, las otras 3 son algo más grandes y como observarás se ven incompletas. Te mando la pura escencia por cuestiones de tamaño, pues ya lo tengo con opción para descargar el directorio de tus imágenes y para que de esta manera te genere el archivo de texto, además de la descarga aleatoria y otros detallitos, pero pór ahora lo importante para mí es que funcione. Lo hago de esta manera para no invadir tu correo personal ni esta web con un ejemplo que aún no es funcional.

Bueno, gracias nuevamente y espero que sigamos en contacto pues tu ayuda me ha sido muy valiosa, ya que de cualquier manera entiendo un poco más que hace algunos días.

Código:

Código :

stop();
fscommand("fullscreen", true);fscommand("allowscale", true);fscommand("showmenu", false);

ValidaCarga = function () {
   if (this.getBytesLoaded() > 4 and this.getBytesLoaded() >= this.getBytesTotal()) {
      // se termino de cargar la imagen => se ajusta al tamaño 1024x768
      Escala = Math.min(1024/this._width, 768 / this._height)  * 100;
      this._xscale = this._yscale = Escala;
      delete this.onEnterFrame();
   }
}

info = new LoadVars();
info.load("imagenes.txt");

info.onLoad = function(leido) {
   if(leido) {
      fotos = new Array();
      for( i=1; i<=info.total; i++ ) {
         fotos[i] = this["foto"+i];
      }
      // Creamos un par de MovieClips Vacíos
      // Primer MC Vacio ('imagen1') en el nivel 10
      _root.createEmptyMovieClip("imagen1",10);
      // Segundo MC Vacio ('imagen2') en el nivel 11
      _root.createEmptyMovieClip("imagen2",11);
      // Damos de alta el indice del Array
      im = 1;
      // Al primero le agregamos la primer imagen
      imagen1.loadMovie("imagenes/" + fotos[im]);
      imagen1.onEnterFrame = ValidaCarga;
      im++; // Incrementamos el índice
      // Agregamos la segunda imagen
      imagen2.loadMovie("imagenes/" + fotos[im]);
      imagen2.onEnterFrame = ValidaCarga;
      // Modificamos la opacidad de 'imagen2'
      imagen2._alpha = 0;
      // Duración (en frames) de la disolvencia
      disol = 49;
      // Duración (en frames) de la permanencia
      fijo = 99;
      // Iniciamos el contador de disolvencia
      count_d = 0;
      // Iniciamos el contador de permanencia
      count_f = 0;
      // Activamos el MovieClip de la imagen 1
      curr_mc = 1;

      onEnterFrame = function () {
         // Cuando la imagen 1 esté activa...
         if( curr_mc == 1 ) {
            // Incrementamos el contador de permanencia
            count_f ++;
            // Si se ha completado el tiempo...
            if( count_f >= fijo ) {
               // Activamos la imagen 2
               curr_mc = 2;
               // Y activamos el proceso de entrada
               cambio = "IN";
            }
         }
         // Cuando la imagen 2 esté activa...
         if( curr_mc == 2 ) {
            // Si se encuentra en proceso de entrada...
            if( cambio == "IN" ){
               // Aumentamos la opacidad
               imagen2._alpha += 100/disol;
               // Si es completamente opaca (100%)...
               if( imagen2._alpha >= 100 ) {
                  imagen2._alpha = 100;
                  // Activamos el proceso a permanencia
                  cambio = "FIJO";
                  // Y 'reseteamos' el contador
                  count_f = 0;
                  // Incrementamos el indice
                  im++;
                  // Si el indice es igual a la longitud...
                  if( im == fotos.length ) {
                     // ...reseteamos el indice
                     im = 1;
                  }
                  // Cargamos la imagen correspondiente al indice
                  // en el MovieClip 'imagen1'
                  imagen1.loadMovie("imagenes/" + fotos[im]);
                  imagen1.onEnterFrame = ValidaCarga;
               }
            }
            // Si se encuentra en proceso 'FIJO'
            if( cambio == "FIJO" ) {
               // Incrementamos el contador de permanencia
               count_f++;
               // Si se ha completado el tiempo...
               if( count_f >= fijo ) {
                  // Activamos el proceso de salida
                  cambio = "OUT";
               }
            }
            // Si se encuentra en proceso de salida...
            if( cambio == "OUT" ) {
               // Reducimos la opacidad
               imagen2._alpha -= 100/disol;
               // Si es completamente transparente...
               if( imagen2._alpha <= 0 ) {
                  imagen2._alpha = 0;
                  // Activamos la imagen 1
                  curr_mc = 1;
                  // 'Reseteamos' el contador
                  count_f = 0;
                  // Incrementamos el indice
                  //im++;
                  // Si el indice es igual a la longitud...
                  if( im == fotos.length ) {
                     // Reseteamos el indice
                     im = 1;
                  }
                  // Cargamos la imagen correspondiente al indice
                  // en el MovieClip 'imagen2'
                  imagen2.loadMovie("imagenes/" + fotos[im]);
                  imagen2.onEnterFrame = ValidaCarga;
               }
            }
         }
      }
   }
}

Por Sir Arter

3 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 04 Jun 2007 04:23 pm
Hola, le hice unos "PEQUEÑOS" cambios a tu codigo:

Código :

stop();
fscommand("fullscreen", true);fscommand("allowscale", true);fscommand("showmenu", false);
arrFotos = new Array();
swInicial = true;
swValidaCarga = false;
FotoActual = 0;
cambio = "OUT";      // estado inicial de cambio, para que inicie cargando una foto
disol = 49;         // Duración (en frames) de la disolvencia
fijo = 99;         // Duración (en frames) de la permanencia
count_f = 0;      // Iniciamos el contador de permanencia
//***********************************************************************************************
ValidaCarga = function () {
   if (_root.imagen2.getBytesLoaded() > 4 and _root.imagen2.getBytesLoaded() >= _root.imagen2.getBytesTotal()) {
      // se termino de cargar la imagen => se ajusta al tamaño 1024x768
      trace("Se termino de cargar... " + _root.imagen2._name + " con tamaño(" + _root.imagen2._width + "," + _root.imagen2._height + ")");
      Escala = Math.min(1024/_root.imagen2._width, 768 / _root.imagen2._height)  * 100;
      _root.imagen2._xscale = _root.imagen2._yscale = Escala;
      trace(" --- nuevo tamaño --... " + _root.imagen2._name + " con tamaño(" + _root.imagen2._width + "," + _root.imagen2._height + ")");
      _root.swValidaCarga = false;
      if (_root.swInicial) {
         _root.swInicial = false;
         _root.createEmptyMovieClip("imagen1",20); // se crea imagen1 para simmular inicio.
         imagen1._alpha = 0;
         _root.onEnterFrame = CicloPermanente;
//         _root.imagen2._name = "imagen1"; // imagen2 toma el lugar de imagen1
//         _root.imagen1.swapDepths(20);    // y sube de profundidad para que la siguiente imagen este por debajo
      }
   }
//   trace("Cargando ... " + _root.imagen2._name + " ... cargados (" + _root.imagen2.getBytesLoaded() + ") de(" + _root.imagen2.getBytesTotal() + ")");
}
//***********************************************************************************************
SiguienteFoto = function () {
   _root.FotoActual++; // Incrementamos el indice
   // Si el indice es igual a la longitud...
   if (_root.FotoActual == _root.arrFotos.length) _root.FotoActual = 1; // reseteamos el indice
   // Creamos un MovieClip Vacío
   _root.createEmptyMovieClip("imagen2",10); // se crea imagen2 por debajo de imagen1
   // Cargamos la imagen correspondiente al indice
   _root.imagen2.loadMovie("imagenes/" + _root.arrFotos[_root.FotoActual]);
   trace("Inicia carga de ("+ _root.FotoActual +")" + _root.arrFotos[_root.FotoActual]);
   _root.swValidaCarga = true;
}
//***********************************************************************************************
CicloPermanente = function () {
   if (_root.swValidaCarga) _root.ValidaCarga();
   if (_root.cambio == "FIJO") {
      _root.count_f ++; // Incrementamos el contador de permanencia
//      trace("FIJO=" + _root.count_f);
      // Si se ha completado el tiempo...
      if( _root.count_f >= _root.fijo ) _root.cambio = "OUT"; // Activamos el proceso de salida 
   } else if (_root.cambio == "OUT") { // Si se encuentra en proceso de salida...
//      trace("OUT=" + _root.imagen1._alpha);
      // Reducimos la opacidad
      _root.imagen1._alpha -= 100/disol;
      // Si es completamente transparente...
      if( imagen1._alpha <= 0 ) {
         imagen1._alpha = 0;
         // se elimina la imagen 1 y la imagen 2 toma su posición
         _root.imagen1.removeMovieClip(); // se elimina imagen transparente
         _root.imagen2._name = "imagen1"; // imagen2 toma el lugar de imagen1
         _root.imagen1.swapDepths(20);    // y sube de profundidad para que la siguiente imagen este por debajo
         _root.cambio = "FIJO";
         _root.count_f = 0; // 'Reseteamos' el contador de cambio FIJO
         _root.SiguienteFoto();
      }
   }
}
//***********************************************************************************************
info = new LoadVars();
info.load("imagenes.txt");
//***********************************************************************************************
info.onLoad = function(leido) {
   if(leido) {
      // carga arreglo de arrFotos
      for( i=1; i<=info.total; i++ ) _root.arrFotos[i] = this["foto"+i];
      trace("TotarrFotos a cargar = " + _root.arrFotos.length + " " + _root.arrFotos);
      _root.SiguienteFoto();
      _root.onEnterFrame = ValidaCarga;
   }
}

ya que el codigo que proporcionaste se encuentra fuera de mis estandares:
1) Se repite codigo para una misma función.
2) demasiados IFs anidados
3) no hay modularización (no se parte el codigo en modulos que se encarguen de hacer una sola cosa)

aparte de lo anterior, el codigo no funcionaba bien.

y por eso reestructure tu codigo, para que funcione.

NOTA: dentro de mis estandares también esta el de los nombres de variables, pero me contuve el cambiarlos, para que el nuevo código tuviera algo de tu cosecha.

Saludos.

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 05 Jun 2007 07:23 am
Hola Gaby:

Hasta pena me dió el que prácticamente hayas tenido que reconstruir la aplicación, bueno, eso habla muy bien de tí y de verdad te lo agradezco y aprecio.

El código original no es mío, como te expliqué lo obtuve de esta magnífica web y lo traté de adaptar. El sábado que me puse a razonarlo y entenderlo llegué a la misma conclusión que tú: Estaba perfectamente mal estructurado y no cumplía en lo más mínimo con las características de un buen programa.

Sin embargo hay algo que debo reconocer, a pesar de que yo soy programador de más de 30 años de experiencia, (desde cobol, algol, pascal, fortran, basic, ensamblador... etc.), estoy partiendo de 0 en el ActionScript y he de agradecer tanto al que aportó ese mal estructurado código, pero que me sacó de cero a saber un poquito, como a tí que me ayudaste a subir varios escalones más en ese abstracto pero encantador camino de la programación. Ojalá que sigas siendo así en cuanto a tu capacidad y responsabilidad de transmitir tus conocimientos, es una gran virtud.

De esta aplicación (el slide show), pretendo hacer mucho más, por razones personales y también como reto. Me vienen muchas dudas más, pero las voy a hacer en el foro para que puedan servir a otros, espero cruzarme nuevamente contigo en la asesoría.

Gracias nuevamente y seguiremos en la línea.

Por Sir Arter

3 de clabLevel



Genero:Masculino  

msie7

 

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