Contenido de la categoría Turoriales

« Entradas anteriores Siguientes entradas »

Efecto de nieve en flash

Ya es típico de navidad el hecho de ver páginas que modifican el logo, la cabecera o la página en si para añadir un adorno navideño. En CDmon este año hemos decidido hacer algo más bien minimalista, que no moleste pero que esté ahí, en concreto hemos modificado la cabecera donde hay el logo para que las borlitas de nieve se queden enganchadas al logo de CDmon para simbolizar la llegada del invierno a nuestras casas.

La forma que he seguido para hacerlo es muy sencilla y no hace uso de ningún super truco de optimización, por lo que nos podemos encontrar que ralentice algún ordenador más bien lento.

En la biblioteca tendremos 4 simbolos con formas de borlita de navidad, las cuales usaremos con un attachMovie.

Para enganchar las borlitas al logo cuando pasan cerca de él, lo que hacemos es dibujar la zona donde se engancharán y convertimos la "mascara" en un clip de pelicula), marcamos un tope de borlitas enganchadas (50) con lo que cada vez que se enganche una borlita de más, se eliminará la primera que había mediante un alpha.

A continuación el código que he usado (mi regalo de navidad para vosotros ;)):

Actionscript:
  1. maxenganxats = 100;
  2. p=0;
  3. ample = Stage.width;
  4. enganxats = new Array();
  5. creaFloc = function(){
  6.     p++;   
  7.     floket = "snow" + (Math.round(Math.random()*3)+1)
  8.     var ix = Math.random()*ample;
  9.     var iy = -15;
  10.    
  11.     _root.createEmptyMovieClip("floc"+p,p);
  12.     var clip = _root["floc"+p];
  13.     clip.attachMovie(floket,"floc",1);
  14.    
  15.     clip.$x = ix;
  16.     clip._y = iy;
  17.     clip.v = 0.5+Math.random();
  18.     clip.r = Math.random()*10;
  19.     clip.angle = (Math.random()*360)*Math.PI/180;
  20.    
  21.     clip.onEnterFrame=function(){
  22.         this._y += this.v;
  23.         this._x = this.$x + (Math.sin(this.angle+=(this.v/5)) * (this.r));
  24.         this._yscale = 50+(Math.cos(this.angle/2)*50);
  25.         this._xscale = 50+(Math.cos(this.angle/2)*50);
  26.         this._rotation += this.v;
  27.         if(_root.pegamento.hitTest(this._x,this._y,true)){
  28.             enganxats[enganxats.length] = this;
  29.             delete this.onEnterFrame;
  30.         }
  31.        
  32.         if(this._y> 60){
  33.             this._alpha-=20;
  34.             if(this._alpha<=0){
  35.                 this.removeMovieClip();
  36.                 delete this.onEnterFrame;
  37.             }
  38.         }
  39.     }
  40. }
  41. elimina=function(e){
  42.     e.onEnterFrame=function(){
  43.         this._alpha-=10;
  44.         if(this._alpha<=0){
  45.             this.removeMovieClip();
  46.             delete this.onEnterFrame;
  47.         }
  48.     }
  49. }
  50. onEnterFrame=function(){
  51.     creaFloc();
  52.     if(enganxats.length>=maxenganxats){
  53.         e = enganxats.shift();
  54.         elimina(e);
  55.     }
  56. }

Ala, felices fiestas ;)

Formulario hibrido AJAX + sinJS

Una de las utilidades que se le puede sacar al AJAX es el hecho de mandar un formulario al servidor sin la necesidad de recargar la página. Eso en pequeños experimentos o en páginas simples no tiene ninguna utilidad, pero podemos ver claros ejemplos de buenos usos en portales extensos donde la carga de toda la página puede representar el gasto de hasta un minuto dependiendo de la conexión.

Un ejemplo es la pantalla de entrada de AdSense de Google o bien el apartado de alta en la newsletter de Promsite. Ambos sistemas funcionan con y sin javascript activo.

A continuación os dejo un ejemplo, programado utilizando la librería pAJAX, donde podéis ver mediante un formulario que valida un usuario en el servidor sin necesidad de recargar página (al estilo login de AdSense) un posible buen uso de AJAX:

HTML:
  1. <?
  2. if($REQUEST_METHOD == "POST"){
  3.     $ajax = $_POST[ajax];
  4.     $usuario = trim($_POST[usuario]);
  5.     $clave = trim($_POST[clave]);
  6.    
  7.     $datos_usuario = (ereg("^[a-zA-Z0-9]*$",$usuario)&&($usuario!=""));
  8.     $datos_clave = (ereg("^[a-zA-Z0-9]*$",$clave)&&($clave!=""));
  9.    
  10.     if($ajax == 1){
  11.         if(!$datos_usuario){ die("&code=2&msg=Error en los datos de usuario&"); }
  12.         if(!$datos_clave){ die("&code=2&msg=Error en los datos de contrase%F1a&"); }
  13.        
  14.         $procesa = true;
  15.     }else{
  16.         if(!$datos_usuario){ $msg="Introduzca un nombre de usuario v&aacute;lido."; }
  17.         if(!$datos_clave){ $msg="La contrase&ntilde;a introducida no es v&aacute;lida."; }
  18.        
  19.         if(!$datos_usuario||!$datos_clave){
  20.             $procesa = false;
  21.         }else{
  22.             $procesa = true;
  23.             $msg = "Se encuentra como usuario del sistema.";
  24.         }
  25.     }
  26.    
  27.    
  28.     if($procesa){
  29.         /*************************************************/
  30.         // Código de proceso de variables
  31.         /*************************************************/
  32.     }
  33.    
  34.     if($ajax == 1){
  35.         echo "&code=1&msg=Se encuentra como usuario del sistema&";
  36.     }
  37. }
  38. ?>
  39.     <title>ejemplo formulario ajax no obtrusivo</title>
  40.     <script type="text/javascript" src="loadVars.js"></script>
  41.     <script type="text/javascript">
  42.         enviar_datos = function(){
  43.             var usuario = document.formulario.usuario.value;
  44.             var clave = document.formulario.clave.value;
  45.            
  46.             document.getElementById("msg_error").innerHTML = "Enviando datos del formulario, espere.";
  47.             document.getElementById("submit_btn").disabled = true;
  48.            
  49.             // Creamos la conexión LoadVars.
  50.             var conexion = new LoadVars();
  51.             // definimos las variables
  52.             conexion.usuario = usuario;
  53.             conexion.clave = clave;
  54.             conexion.ajax = 1;
  55.             // definimos la función de callback
  56.             conexion.onLoad=function(){
  57.                 if(this.code == 1){ //OK
  58.                     document.getElementById("datos_form").innerHTML = "<div id=\"msg_error\">"+unescape(this.msg)+"</div>";
  59.                 }else if(this.code == 2){ //ERROR
  60.                     document.getElementById("msg_error").innerHTML = unescape(this.msg);
  61.                     document.getElementById("submit_btn").disabled = false;
  62.                 }
  63.             }
  64.             // Enviamos los datos al servidor
  65.             conexion.sendAndLoad(document.formulario.action,conexion,"POST");
  66.            
  67.             return false; //PARA QUE NO HAGA EL SUBMIT
  68.         }
  69.     </script>
  70.     <style type="text/css">
  71.         #msg_error{
  72.             color:red;
  73.             margin:10px;
  74.             font-weight:bold;
  75.         }
  76.     </style>
  77. </head>
  78.     <div id="datos_form">
  79.         <div id="msg_error"><?=$msg?></div>
  80. <? if(!$procesa){ ?>
  81.         <form name="formulario" action="<?=$PHP_SELF?>" method="post" onsubmit="return enviar_datos();">
  82.             <label for="usuario">Usuario: </label><input type="text" name="usuario" id="usuario" /><br />
  83.             <label for="clave">Clave: </label><input type="text" name="clave" id="clave" /><br />
  84.             <input type="submit" value="Enviar datos!" id="submit_btn" />
  85.         </form>
  86. <? } ?>
  87.     </div>
  88. </body>
  89. </html>

Podeis trastear con esto en la página de ejemplo

Estudiando GoogleMaps

NOTA: no se si me darán un toque los señores corbatas de google, pero que conste que toda la información que hay aquí, ha sido extraida manualmente de su página web de acceso público maps.google.com. Toma castaña!

Me voy a hacer un poster grande grande, pero grande de jocones. Para ello me voy a servir de googleMaps. Se que podría estudiar la API de google maps para poder utilizarlo de una forma sencilla, pero si lo hago así no tendrá ninguna gracia (al menos para mi) y es por ello que me he puesto a estudiar como funciona la web de google maps (y sus javascripts) y cómo estructuran la carga de las imagenes, para poder extraer las imágenes sin el dichoso límite de las 50.000 imagenes diarias (una chorrada por mi parte pensar así, pero como he dicho antes, así es más emocionante). Al final he sufrido una revelación al ver que todo es una matriz de 2x2 de forma que cada imagen tiene sus correspondientes 2x2 y así sucesivamente.

Explico un poco como se lo han currado.

Para servir las imágenes disponen de un listado de servidores, de los que se extraen las imagenes que conforman los mapas:

JavaScript:
  1. GLoadApi([
  2. "http://mt0.google.com/mt?n=404&v=w2.29&",
  3. "http://mt1.google.com/mt?n=404&v=w2.29&",
  4. "http://mt2.google.com/mt?n=404&v=w2.29&",
  5. "http://mt3.google.com/mt?n=404&v=w2.29&"
  6. ], [
  7. "http://kh0.google.com/kh?n=404&v=11&",
  8. "http://kh1.google.com/kh?n=404&v=11&",
  9. "http://kh2.google.com/kh?n=404&v=11&",
  10. "http://kh3.google.com/kh?n=404&v=11&"
  11. ], [
  12. "http://mt0.google.com/mt?n=404&v=w2t.30&",
  13. "http://mt1.google.com/mt?n=404&v=w2t.30&",
  14. "http://mt2.google.com/mt?n=404&v=w2t.30&",
  15. "http://mt3.google.com/mt?n=404&v=w2t.30&"
  16. ]);

Para mi objectivo, que es sacar las imagenes reales (de satelite) me he centrado en los servidores kh*, estos tienen un parametro llamado t el cual aceptan un curioso algoritmo, os explico:

Tal como os he comentado antes, todo se conforma de 2x2 imagenes (por cada imagen 4 sub imagenes que hacen el zoom). Todas ellas de 256pixeles de ancho por 256pixeles de alto, según vamos internando dentro de las sub imagenes, obtenemos tamaños mayores en total (en un principio una hace 256x256, pero esta con el zoom llega a 2048x2048 en subimagenes de 256x256, espero que se entienda). Para demostrar esto he hecho un pequeño experimento que aclarará toda duda posible:

Experimento 1 (teneis que clicar en las fotos para que dicho cuadrante se amplie * 2)

El algoritmo que se pasa al argumento "t" es el "cuadrante":

- Superior izquierdo (Q)
- Superior derecho (R)
- Inferior izquierdo (T)
- Inferior derecho (S)

De forma que si queremos ver el mapa entero, tendremos que cargar SOLO t=t:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=t

Si queremos hacer zoom en el cuadrante superior derecho pues:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=tr

Y si en el resultado queremos hacer zoom en el cuadrante inferior derecho, pues sencillo:

HTML:
  1. http://kh0.google.com/kh?n=404&v=11&t=trs

Así que a cada paso de zoom, tenemos una letra más en el argumento.

De momento eso es todo, cuando saque el mapa explicaré el método usado (seguramente una función recursiva)

Saltar la sandBox de flash para cargar datos remoting de otros dominios

Para emperzar, explicaré brevemente de que se tratan estos dos conceptos, la sandBox y remoting.

La sandBox de flash es la capa de seguridad que evita que se pueda utilizar el flash player para piratear datos de otras páginas, de manera que no se puede cargar información de una página desde otra, si en la primera no hay un archivo llamado policyFile.xml que permite el acceso del player para cargar información.

Por otro lado, Flash Remoting es una tecnología que desarrolló Macromedia que sirve para enviar datos serializados de Flash Player a nuestra aplicación del servidor, de manera que podríamos mandar un array (tal cual) y en el servidor podríamos manejar ese array como tal, y así ahorras el tiempo que requiere una función de parseado de información.

El esquema es algo así:

Flash Remoting

Una vez sabemos de que va el tema, podemos seguir leyendo el articulo o podemos pasar e ir a ver algunos videos graciosos.

(más...)

Cómo exportar a vectorial gráficos dinámicos de Flash (SWF)

Esto es un regalo de la casa ;)

Wrappers en JavaScript (I)

Desde hace un tiempo empecé a utilizar la palabra wrapper (código encapsulado en java, y tiene otras definiciones [inglés]) para definir los scripts que vengo utilizando desde hace un tiempo para programar en javascript tal como lo hacía en actionscript (como por ejemplo la librería pAjax).

Por ejemplo, un posible wrapper (que es una tontería) podría ser:

JavaScript:
  1. trace=alert;

Entonces, cuando ejecutes un trace("hola"), se estará ejecutando un alert("hola"). En si, eso no es un wrapper, pero es para que vayais viendo por donde voy.

De momento eso es todo, revisad pAjax y vereis a que me refiero.

¿Qué es nbsp en html? (&nbsp;)

Cuando pienso en NBSP, veo espacios en blanco, veo un universo de posibilidades, veo un agujero negro, veo ... mucho cuento. Realmente NBSP es un código que se utiliza para definir “NON BREAKING SPACE”, o lo que es lo mismo, un espacio en blanco que no se puede partir.

En HTML se utiliza principalmente para forzar espacios en blanco entre palabras que no se pueden separar, por ejemplo “hola mundo”, en código HTML podría ser “hola&nbsp;mundo” y tan anchos, que esto no se parte.

Con el rollo de no partirse, me refiero a que al final de una línea, se forzaría el salto de línea antes de la palabra que precede al espacio, os pongo un gráfico.

QUE ES NBSP

En la web de la W3c podemos encontrar alguna información interesante acerca del NBSP

  • No utilizar los &nbsp; como texto alternativo de imagenes.
  • Tambien podemos utilizar &#160; en su lugar.
  • Podemos utilizar la etiqueta nowrap para simular el uso de &nbsp; en un parágrafo entero.
  • Si estamos utilizando tablas para tabular información, podemos utilizar &nbsp; para conseguir que al estrecharse la tabla, no nos fuerze un salto de línea en el título.

Aunque el uso de la expresión NBSP no se limita al HTML, es en este donde se hace mayor uso de él, y de paso, al ser ésta una página de tematica web (principalmente) pues prefiero centralizar la explicación en el mismo.

Y para que nadie menée esta entrada del blog, diré que está patrocinada por mi proveedor de dominios y alojamiento web.

Validar correo electrónico en JavaScript y PHP

Para validar campos de un formulario son muy útiles las expresiones regulares. A continuación os facilito una función para validar los correos electrónicos de los formularios de vuestras páginas.

JavaScript:
  1. function valida_correo(email){
  2.     regx = /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/;
  3.     return regx.test(email);
  4. }
  5. alert(valida_correo("nombre@dominio.com"));

Valida correos como:

  • nombre@dominio.com.es
  • nombre@dominio.org
  • nombre.apellido@dominio.com
  • nombre.apellido@dominio.com.es
  • nombre@dom-in-inio.com

Retorna error con mensajes como:

  • nombre.dominio.com
  • nombre@@dominio.com
  • e-mail@+falso.que.la.una
  • nombre@-dominio-.com
  • nombre@*****.com

En PHP sería lo mismo pero modificando un poco la función

PHP:
  1. function valida_correo($email){
  2.     $regx = "^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$";
  3.     return ereg($regx,$email);
  4. }
  5. if(valida_correo("nombre@dominio.com")){
  6. echo "CORREO VALIDO";
  7. }else{
  8. echo "CORREO NO VALIDO";
  9. }

Actualización: Corregida la llamada a ereg, ya que había los argumentos invertidos, ahora está bien :P. (Gracias Oscar)

Sindicador de código de blogs

Codigo html

Me he encontrado esto en mis referers y me he quedado un poco aplatanado. Que manera de virlar código, pero a su vez, que manera de centralizar todo el contenido en una página. No se si me gusta o me disgusta, de momento me quedo con que mi código lo ve más gente

El sindicador enlaza blogs de temas relacionados con el desarrollo/programación, abarcando areas como: JavaScript, HTML, PHP, CSS, Ruby, etc.. Vamos una cantidad de información super-util

Me quedo con la parte positiva: SNIPPLR.COM

Listas desplegables editables (Selects editables)

Hace tiempo hice un clon del dreamweaver en html y javascript, que te permitia editar una página web online, el tema es que podías seleccionar un enlace (de entre otras cosas) y te aparecían las opciones en el panel de propiedades, con lo que podías seleccionar una opción de un select (por ejemplo el target) y se actualizaba solo el código html. Bien, el problema vino cuando intenté configurar una opción igual que la del dreamweaver, que me permitiera añadir valores al select, en un principio no super como hacerlo pero al final, despues de surfear por la red encontré la solución a mis problemas: "clip:rect()".

Select01

Siguiendo con el reto de hacer un select que permitiese introducir texto, terminé montando una librería que llamando a un objeto con ciertos parametros te permite crear algo completamente igual al select del dreamweaver.

SELECT02

Puedes ver un ejemplo pulsando en: Listas desplegables editables

(más...)

« Entradas anteriores Entradas siguientes »

Get Adobe Flash playerPlugin by wpburn.com wordpress themes