¿Como logran esta interacción?, si vemos en el código de estas aplicaciones, todas siguen mas o menos el mismo patrón:
- Agregar evento mousemove al elemento canvas
- comparar coordenadas del cursor con las de Objetos dibujados
- Seleccionar objeto sobre el cual se encuentra el cursor
- Al ocurrir un evento, ejecutarlo sobre el Objeto seleccionado
- Redibujar el canvas
No es algo difícil, pero podría ser mucho mas fácil.
Con esto en mente y luego de robar algunas ideas y algo de código de otros proyectos como procesingjs, jQuery, jquery-hotkeys y canto-js, nació canvas-event, una librería que se encarga del manejo de los eventos, facilitando el desarrollo de aplicaciones interactivas en el elemento canvas; ademas cuenta con objetos predefinidos como círculos, rectángulos, rutas e imágenes entre otros.
Algunos ejemplos de lo que se puede hacer con canvas-event:
Con esto en mente y luego de robar algunas ideas y algo de código de otros proyectos como procesingjs, jQuery, jquery-hotkeys y canto-js, nació canvas-event, una librería que se encarga del manejo de los eventos, facilitando el desarrollo de aplicaciones interactivas en el elemento canvas; ademas cuenta con objetos predefinidos como círculos, rectángulos, rutas e imágenes entre otros.
Algunos ejemplos de lo que se puede hacer con canvas-event:
Cv = Cevent("id-canvas"); // encadenamiento de métodos Cv.circle( 40, 40, 40 ) .attr({fill: 'red'}) .rotate( 30 ); // manejo de eventos al estilo jquery Cv.click( function(e) { this.fill = this.fill == 'green' ? 'red' : 'green'; }); // eventos del teclado asociados a combinación de teclas Cv.keydown( 'ctrl+s', function(e){ alert( "el Objeto ha sido guardados"); return false; }); // Drag and drop Cv.ellipse( 30, 40, 50, 10 ) .drag({ start: function() { console.log( "drag start" ); }, move: function() { console.log( "move to ", this.x, this.y ); }, end: function() { console.log( "drag end" ); } }) // identificadores de Objetos Cv.image(50, 100, "ball.gif").addId("pelota").rect(100, 50, 20).draw(); // Recuperar elementos por su Id o tipo; Cv.find('#pelota').attr("alpha", .5).redraw(); Cv.find('rect').click(function(){ alert( "Hola, soy un rectangulo" ); }); // Eventos live Cv.mouseover( "#pelota", function(e){ alert( "Soy una pelota" ); }); // Este Objeto también tendrá el evento anterior Cv.circle(175, 75, 20).addId('pelota');Ademas, podemos definir nuestras propias figuras extendiendo el objeto Shape:
var Triangle = Cevent.Shape.extend({ // inicializador init: function( x, y, size ){ this.size = size || 5; this._super( x, y ); }, // ctx es el context en el que se debe dibujar draw: function( ctx ) { ctx.save(); // aplicamos estilo y trasformaciones this.applyStyle( ctx ); this.setTransform( ctx ); // definimos el contexto en el cual dibujaremos // para poder usar todos los métodos svg definidos en Cevent // como M (move) c (cubicBlazier) etc Cevent.beginPath( ctx ) .M( this.x, this.y ) .h( 1 * this.size ) .v( 1 * this.size ) .z(); if ( this.fill ) { ctx.fill(); } if ( this.stroke ) { ctx.stroke(); } ctx.restore(); } }); // registramos el nuevo objeto Cevent.registre( "triangle", Triangle ); // ahora podemos hacer uso del nuevo objeto var Cv = Cevent( "canvas-id" ); Cv.triangle( 40, 30, 10 ) .attr({ fill: "#050", alpha: .5 }) .focus(function() { this.fill = "#999"; }) .blur(function() { this.fill = "#050"; }) .draw();Por el momento falta documentación pero se incluyen varios ejemplos de su uso, si tienen alguna duda y/o sugerencia por favor déjenla en los comentarios o en la pagina del proyecto en google code.