Mover una imagen con el mouse con deslizamiento

Mover Imagen Mouse flash

En este tip mostraré un código para los que necesitan hacer el scroll de una imagen por medio del movimiento del mouse, esto es útil en el manejo de mapas, exploración de imágenes, y varias aplicaciones mas. Primero pondremos este código en el primer frame de la película que sera para lograr el efecto de deslizamiento de la imagen explicado en este tip.

Código :

Actionscript:
  1. function mover(x,y, aceleracion:Number, Clip:MovieClip) {
  2.  
  3. Clip.onEnterFrame = function() {
  4.  
  5. this._x += (x-this._x)/aceleracion;
  6. this._y += (y-this._y)/aceleracion;
  7.  
  8. if (Math.abs(x-this._x)<0.5 && Math.abs(y-this._y)<0.5 ) {
  9. this._x = x;
  10. this._y = y;
  11. delete this.onEnterFrame;
  12. }
  13. }
  14.  
  15. };

Después crearemos un cuadrado con relleno normal, lo seleccionaremos y lo convertiremos en clip (F8) con el punto de registro en la parte superior izquierda (esto es muy importante en cada uno de los clips que crearemos, verificar que el punto de registro sea el que se indica para cada uno de ellos) al clip que acabamos de crear le daremos el nombre de instancia show (recordar el nombre de instancia de los clips para poder hacer referencia y no perdernos, por que sera un poquito confuso) A este clip le asignamos estas acciones (que después explicare con detalle)

Código :

Actionscript:
  1. onClipEvent (mouseMove){
  2.  
  3. if (this.hitTest(_parent._xmouse, _parent._ymouse, true)){
  4.  
  5. _parent.mover( -((this.foto._width-this.btn._width) /this.btn._width) * _xmouse,-((this.foto._height -this.btn._height) /this.btn._height) * _ymouse,7,this.foto);
  6. }
  7. }

Seleccionamos el clip show y le damos doble clip, accederemos dentro de este y encontraremos el cuadrado, lo seleccionamos y lo convertimos en clip de nuevo, si, de nuevo, es para generar otro clip dentro del clip show que es el que hará el efecto. Después de haberlo convertido en clip le asignaremos el nombre de instancia btn, posterior a esto, generaremos otras dos capas en la parte de abajo. Después en la segunda capa copiamos el keyframe de la primera y lo pegamos y en la tercera importamos una imagen a la cual convertimos en clip también (f8) y le asignamos el nombre de instancia foto, quedando en este orden:

1. Capa, el cuadrado convertido en clip
2. Capa la copia del keyframe del cuadrado, con lo cual tendremos dos cuadrados
3. La imagen importada convertida en clip

A el clip foto lo seleccionamos y le asignamos en acciones (f9) este código

Actionscript:
  1. Código :
  2.  
  3. onClipEvent (load){
  4. this._x=-(this._width/2)+(_parent.btn._width/2);
  5. this._y=-(this._height/2)+(_parent.btn._height/2);
  6. }

Que hará que la imagen se centre de inicio. Después de esto seleccionamos la segunda capa y damos click derecho, seleccionando la opción mascara del menú. Seleccionamos el clip de la primera capa y le damos efecto de alpha 0 para que sea transparente. Vamos a la película principal y listo, debe quedar algo como esto:

Esta Pelicula requiere el Flash Player 9

Ahora la parte de explicación. El código que hace las maravillas, y lo demás es solo adorno, es este:

Código :

Actionscript:
  1. onClipEvent (mouseMove){
  2.  
  3. if (this.hitTest(_parent._xmouse, _parent._ymouse, true)){
  4.  
  5. _parent.mover( -((this.foto._width-this.btn._width) /this.btn._width) * _xmouse,-((this.foto._height -this.btn._height) /this.btn._height) * _ymouse,7,this.foto);
  6. }
  7. }

Al detectar que se mueve el mouse onClipEvent (mouseMove) hace una detección si el puntero del mouse hace contacto con este clip if (this.hitTest(_parent._xmouse, _parent._ymouse, true)){ hace el cálculo de esta manera a grandes rasgos, una regla de tres, si el cuadro pequeño se mueve 1 el grande se moverá 2 dependiendo del tamaño de la imagen, por eso se hace una equivalencia, y cabe notar que se le resta el ancho del cuadrado para que no salga del área total, y siempre se mantenga una proporción dentro de lo visible, esto se puede hacer inmediato sin llamar a la función, solo que con la función el efecto de easing lo hace mucho mas atractivo Cualquier error que se me haya pasado por favor comentarlo aquí para hacer la corrección. Actualizacion, Este es un codigo Diseñado por Teseo, uno de lso programadores que mas me impresionan y admiro Código :

Actionscript:
  1. function scrollvisor(imagen, x0, y0, w0, h0) {
  2. ori = this.createEmptyMovieClip("nulo", this.getNextHighestDepth());
  3. ori.rt = new flash.geom.Rectangle(x0,y0,w0,h0);
  4. if(imagen instanceof MovieClip){
  5.  
  6. ori.img=g=new flash.display.BitmapData(imagen._width,imagen._height,true,0);
  7. ori.img.draw(imagen);
  8. } else {ori.img = g = flash.display.BitmapData.loadBitmap(imagen);}
  9. ori.w = w = ori.img.width; ori.h = h = ori.img.height;
  10. w <w0 ? ori.wt = wt = w : ori.wt = wt = w0;
  11. h <h0 ? ori.ht = ht = h : ori.ht = ht = h0;    ori._x = x0; ori._y = y0;    ori.tmp = new flash.display.BitmapData(wt, ht, true, 0);    ori.attachBitmap(ori.tmp, 1, "auto", true);    ori.tmp.copyPixels(g, new flash.geom.Rectangle((w-wt)/2,(h-ht)/2,wt,ht),null);    ori.onRollOver = function() {       with (this) {          onMouseMove = function () {             xm = this._xmouse; ym = this._ymouse;             xm>rt.x && xmrt.x ? xx=w-wt : xx=0;
  12. ym>rt.y && ymrt.y ? yy=h-ht : yy=0;
  13.  
  14. tmp.copyPixels(img, new flash.geom.Rectangle(xx, yy, wt, ht), null);
  15. }
  16. }
  17. }
  18. ori.onRollOut = function() {delete onMouseMove;}
  19. }
  20. /*
  21. Tipo de llamada a la función
  22. imagen : instancia de clip o nombre de imagen vinculada desde la biblioteca.
  23. x0, y0 : esquina superior izquierda donde mostrar.
  24. w0, h0 : ancho y alto de la zona donde mostrar.
  25. */
  26. // Ejemplos:
  27. //scrollvisor("imagen1", 0, 0, 300, 200);
  28. //scrollvisor("imagen", 0, 200, 100, 100);
  29. //scrollvisor(clip1, 100, 100, 200, 200);

Esto es lo que resulta con las 3 llamadas del ejemplo ( 2 son imágenes de biblioteca y otra un clip instanciado en el escenario.

Esta Pelicula requiere el Flash Player 9

onClipEvent (mouseMove){

if (this.hitTest(_root._xmouse, _root._ymouse, true)){

_parent.mover( -((this.foto._width-this.btn._width) /this.btn._width) * _xmouse,-((this.foto._height -this.btn._height) /this.btn._height) * _ymouse,7,this.foto);
}
}

Post Relacionados :

1 Trackbacks

Puedes enviar un trackback usando esta URL: http://www.soportalo.com/2010/04/28/mover-una-imagen-con-el-mouse-con-deslizamiento/trackback/

  1. Por Soportalo en 28 abril 2010 a las 14:44

    [...] [Click aqui para ir a el nuevo y mejorado Soportalo] [...]

16 Comentarios

  1. kike

    Que tal, excelente tutorial, disculpa tengo una duda, hice un video swf con estos pasos y deseo exportarlo a un directorio raiz de otro swf para utilizarlo , y al exportarlo, solo se exportan los elementos , no el video ,¿como puedo solucionar esto? gracias

    Comentado 11 septiembre 2010 a las 13:36 | Permalink
  2. como que exportas el video ?, si lo capuras como video, solo correo como flv, no entieno si quieres decir que lo pasas como un swf externo?, te deberia funcionar por que son rutas relativas

    Comentado 13 septiembre 2010 a las 13:08 | Permalink
  3. kike

    perdon, me referia a un documento swf, lo importe al directorio raiz de otro documento para utilizarto, pero al terminar el proceso de importado, no aparece el archivo, solo los elmentos, archivos png y clips por separado.

    Comentado 13 septiembre 2010 a las 15:20 | Permalink
  4. kike

    Muchas gracias n_n , hice todo de nuevo dentro del otro documento swf , estan genial estos codigos , grax.

    Comentado 13 septiembre 2010 a las 15:44 | Permalink
  5. kike, supongo que algunos elementos que improtastes ocuparon los mismos de algunso que tenias y se hizo un desorden que bueno que ya resolviste tu problema

    Comentado 14 septiembre 2010 a las 14:12 | Permalink
  6. pacman

    Estoy buscando este efecto en as3 , habría algo por ahí??
    Gracias

    Comentado 16 septiembre 2010 a las 19:48 | Permalink
  7. aun no migro a AS3 me enfoco mas en buscar codigos que diseñar, lo siento pacman

    Comentado 16 septiembre 2010 a las 20:04 | Permalink
  8. hey saludos ante todo gracias es un buen ejemplo solo tengo una pregunta si yo hago una carga de swf en otro ya no me funciona el efecto como puedo hacer que este funcione o solo funciona en primer nivel

    Comentado 23 septiembre 2010 a las 10:54 | Permalink
  9. beranyer el ejemplo tiene rutas relativas, no deveria de tener problemas seguro lo cargas adecuadamente ?

    Comentado 23 septiembre 2010 a las 13:47 | Permalink
  10. amigos como puedo hacer para q cuando la imagen llegue a su top ya sea derecho o izq. se frene de golpe!! a ver si me explico .. recorriendo el mouse cuando la imagen se termina de haga stop.. como si fuese tope . porque tengo contenido q cuesta llegar a verse dado que esta justo al final de la imagen que de por si es muyyy larga ahaha.. gracias de antemano .. y muy buen tuto man.. gracias por compartir la sabiduria! XD

    Comentado 21 octubre 2010 a las 2:49 | Permalink
  11. mario acuña

    Muchas gracias, Excelente!!!

    Comentado 9 mayo 2011 a las 1:42 | Permalink
  12. Paco

    Hola,

    Veo que el código está con as2, tenemos algo en as3 ?

    Gracias

    Comentado 2 junio 2011 a las 17:38 | Permalink
  13. raul

    ¿Que tal? Muy bueno el script!
    Tengo el mismo problema que plantearon antes, es decir, en el swf original funciona perfecto, pero si lo cargo en otro clip se carga bien y ya no funciona. Modifiqué la línea:

    _root.mi-clip-vacio-donde-lo-cargo.show.foto.onEnterFrame = function ()

    Pero NO funciona tampoco, tengo que modificar otra ruta también ???

    Si alguien puede aportar desde ya agradecido!
    Saludos!

    Comentado 23 agosto 2011 a las 16:01 | Permalink
  14. raul, no se de donde sacaste el root revise elc codigo y no lo vi, me lo podrias señalar por favor ademas todos ya los puse con parents para eliminar las rutas relativas

    Comentado 23 agosto 2011 a las 19:39 | Permalink
  15. raul

    Gracias por responder tan rápido!
    Tal vez no la veas porque yo utilicé el demo que tienes funcionando de muestra, y ahora viéndolo bien veo que es distinto al código que explicas en tu blog.
    Como no me salió de primera el que explicas paso a paso, partí del que ya tienes funcionando a modo de demo.

    Mira, la línea original esta: _root.show.foto.onEnterFrame = function ()

    Es el script que está en el primer frame de tu película de muestra.

    function Mover(x, y, aceleracion)
    {
    var _l1 = this;
    _root.show.foto.onEnterFrame = function () // ESTA ES LA LÍNEA QUE EDITÉ
    {
    var _l1 = this;
    _l1._x = _l1._x + (x – _l1._x) / aceleracion;
    _l1._y = _l1._y + (y – _l1._y) / aceleracion;
    if (Math.abs(x – _l1._x) < 0.500000 && Math.abs(y – _l1._y) < 0.500000)
    {
    _l1._x = x;
    _l1._y = y;
    delete _l1["onEnterFrame"];
    } // end if
    };
    } // End of the function

    Yo la modifiqué ya que al cargar el *.swf tal cual tu lo tienes dentro de otro que es el clip principal, la animación no funciona.
    Como te mencioné, al ejecutarlo solo el, tu .*swf funciona perfectamente

    Voy a tratar de intentar seguir tu tutorial nuevamente para ver si esta versión la puedo cargar dentro de otra.
    Pero es que con AS no soy muy bueno!

    Muchas gracias por tu tiempo!
    Saludos!

    Comentado 23 agosto 2011 a las 20:00 | Permalink
  16. raul

    FeNtO.

    Ya lo solucioné repitiendo el tuturial y ahora si me funciona perfectamente!
    Lo hice paso a paso tal cual como lo explicas y esta versión si se carga perfectamente dentro de otro clip.

    Muchas gracias por tu tutorial!
    Saludos!

    Comentado 23 agosto 2011 a las 20:47 | Permalink

Escribe un Comentario

Tu e-mail nunca será compartido. Los campos requeridos están marcados *

*
*