¿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');
- 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();