Cristalab

                 ¿Quieres registrarte?

Convertir un Bitmap en botonera con Actionscript

Por: Teseo
6 de Junio del 2007
1401 de clabLevel
Otros artículos de Teseo
9,509 visitas

Muchas veces es necesario convertir cada región de un mapa gráfico normal en un botón que efectúe las acciones que necesitamos.

El método normal es "a mano", es decir, seleccionar la región, editarla con sus bordes y convertirla en MC o botón una a una. A partir de un mapa gráfico y utilizando éste código podemos convertir, de un solo golpe, cada región en un botón de Flash.

El script necesita como entrada un mapa o imagen jpg, gif o png, con sus bordes o fronteras en negro (o escala de grises).
Es posible que tengamos que pasarlo previamente por un editor de imágenes (Photoshop o similar) para retocarlo un poco y pasarlo a 2 colores.
La imagen final la ponemos en la biblioteca de Flash y la vinculamos para AS con el nombre: mapa

También debemos decidir el color de los botones, el umbral de gris que hará de "frontera" entre zonas y el tamaño mínimo en pixeles para que un determinado área se convierta en botón.

Veamos un ejemplo:
Este es un mapa que he conseguido de la Web y de calidad tirando a baja... aún así (este no lo he editado) lo paso tal cual a la biblioteca de mi flash.

MAPA ORIGINAL:



Este es el código que pongo en Flash eligiendo y ajustando los valores como he dicho anteriormente:

Código :

import flash.geom.*;
import flash.display.*;
import flash.filters.*;
CM = 0xFF0EBE1F;//Color de las regiones del mapa resultante.
uN =0xff505050;// umbral de grises si menor no se toma el pixel.
region = 50; //valor minimo en pixels de un area para considerarlo región. 
BF1=  new BevelFilter(4,45,0xffffff,.5,0,.5,2,2,1,1,"inner",false);
BF2=  new BevelFilter(4,45,0,.5,0xffffff,.5,2,2,1,1,"inner",false);
mapa = BitmapData.loadBitmap("mapa");
mapa.threshold(mapa, mapa.rectangle, new Point(), ">", uN, 0);
mapa1 = new BitmapData(mapa.width, mapa.height)
RO = mapa.getColorBoundsRect(0xff000000, 0xff000000);
cont=0; mc=[]; mapa2=[];
do{RO = bucle(RO);} while (RO)// para ir disminuyendo la zona de búsqueda.
function bucle(RO){
for (var j=0 ; j<  RO.height ; j++){
   for (var i=0; i< RO.width ; i++){
      PT = new Point(RO.x+i,RO.y+j);
      if(mapa.getPixel32(PT.x,PT.y)==0){
         mapa1.draw(mapa);
         mapa1.floodFill(PT.x, PT.y, CM);
         mapa.floodFill(PT.x, PT.y, 0x01000000);
         RO = mapa.getColorBoundsRect(0x01000000, 0x01000000, false);
         R1 = mapa1.getColorBoundsRect(CM,CM,true);
         mapa1.threshold(mapa1,R1, new Point(R1.x,R1.y), "!=",CM,0);
         R1 = mapa1.getColorBoundsRect(CM,CM,true);
         if (R1.width*R1.height>region){
            mc[cont] = this.createEmptyMovieClip("mc"+cont, this.getNextHighestDepth());
            mapa2[cont] = new BitmapData(R1.width, R1.height, true,0);
            mapa2[cont].copyPixels(mapa1,R1,null);
            mc[cont].attachBitmap(mapa2[cont],0);
            mc[cont].filters =[BF1];
            mc[cont]._x=R1.x; mc[cont]._y=R1.y;
            mc[cont].num = cont;
            mc[cont].onRollOver = function(){
               this.onMouseMove =function(){
                  punt = new Point(_xmouse-mc[this.num]._x, _ymouse-mc[this.num]._y);
                  pp= mapa2[this.num].getPixel32(punt.x,punt.y);
                  if( pp){this.filters =[BF2];this.onMouseDown = function(){botonpulsado(this.num)}}
                  else{this.filters =[BF1]; delete this.onMouseDown;}
               }
            }
            cont++;
            return(RO); 
         }
      }
   }
}
}//fin de función bucle
mc[0]._visible = false;// borrando o apagando los no útiles, en este ejemplo se borrar el mar.
mapa.dispose();mapa1.dispose(); // eliminar mapas no necesarios de la memoria.
function botonpulsado(m){
   pais = m; //numero a visualizar de la región en el ejemplo.
   //acciones para los botones/regiones (aconsejable select/case) y arrays 
   //de nombres, URLs, etc... 
}

Y este es el resultado:
MAPA "BOTONIZADO":
Nota: El SWF está escalado para poder ponerlo aquí

Al dar click nos manda a una función donde pondremos las acciones para cada botón: Aparecer su nombre, ir a una URL, etc. yo simplemente en el ejemplo he puesto el nº de array del botón.
También es posible que cada botón tenga su color, poner otro tipo de filtros para la acción RollOver-RollOut, etc., con pequeñas variaciones o añadidos en el código.

El script está optimizado para trabajar muy rápido. Además, el resultado tiene un peso bastante menor que la imagen usada originalmente.
En resumen: cualquier dibujo separado por zonas es posible pasarlo a botonera.

Cuestión: los MCs pueden ser seleccionados por su área no transparente (forma real) o por su área rectángulo. Eso es cierto siempre y cuando no tengamos un Bitmap asociado al dicho MC, pues entonces, aunque haya zonas transparentes en el BitMap, estas se comportan como opacas a efectos de selección y el MC contenedor sólo se puede seleccionar por su área rectángulo. Esto es así en Flash 8 y hay que utilizar "artificios" para que dichos MC tengan el comportamiento deseado.
En este script utilizo uno "de mi cosecha" para simular correctamente el área activa del MC.(zona no transparente.)


Artículos Relacionados


Etiquetas actionscript

Comentarios | Enviar un comentario
Gracias,, esto me servira mucho!!!
Por: GCreator
gaua tseop me declaro tu FAN ^^ es ams quien me regala una etiqueta de Fan de Tseo :)
Por: FeNtO
Muchas gracias Teseo, muy buen recurso para nosotros y trabajo para vos.
Por: leo-mix_blog
Monstruoso!!!!!!
para variar Teseo!!!
(Excelente)
Por: eveevans
Pufff.... que bueno!!!
esta buscando algo asi!!!!
gracias!!!

Cada día aprendiendo más.
Por: pabletein_blog

FeNtO :

gaua tseop me declaro tu FAN ^^ es ams quien me regala una etiqueta de Fan de Tseo :)
Yo también quiero una.
Por: HernanRivas
che no se ve el swf
Por: adropoto_blog

adropoto_blog :

che no se ve el swf
Tenés que esperar a que cargue, pude tardar bastante con Dial-up
Por: HernanRivas

HernanRivas :

FeNtO :

gaua tseop me declaro tu FAN ^^ es ams quien me regala una etiqueta de Fan de Tseo :)
Yo también quiero una.


He anhelado una desde hace un tiempo U_Un!
Por: elfleat
JAJAJAJA; yo admirando a FeNtO, y el admirando a teseo, creo que cada quien admira a su mas grande, lo cierto es que este tip esta de maestrooooooooos, pero de verdaderos maestros. Ojala llegue a tratar con tanta soltura como ellos a actionscript :)
Por: Señor Oz_blog
Vaya es lo q justo buscaba, pero no he entendido nada T.T , si alguien me puede explicar detalladamente o alguna ayudita, ya q solo lo unico q entendi fue del dibujo y lo tengo de ahi lo demas me he quedado de piedra por fis si alguienme ayuda para hacer pero parecido a este mapa http://www.mediabank.es ; se lo estaria eternamente agradecido.
Por: jimto
Justo lo que necesito, ya he logrado crear el mapa botonizado; pero como soy bastante nuevo en estas cosas no sé como hacer para editar las funciones de cada botón ni los comandos que debo usar.

¿Alguien puede ayudarme?


Gracias.
Por: Yamahalf_blog
excelente tio , admirador tuyo
Por: medina_blog
Como puedo hacer que funcione con flash player 10
Por: Dan-blog
Excelente pero no funciona con el plugin de flash 10
Por: chevas-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.