2016-08-04 6 views
0

J'essaie de faire quelque chose comme de la peinture avec KineticJS. J'essaie de dessiner la couleur avec des cercles qui proviennent de la position de la souris. Cependant l'eventlistener de la position de la souris semble trop lent et quand je déplace la souris trop vite les cercles dessinés sont éloignés l'un de l'autre résultant ceci:KineticJS, Peindre comme programme, les lacunes de brosse

J'ai vu des gens remplissant le tableau avec des points dessinant des lignes entre eux, mais j'ai pensé que c'est très mauvais pour l'optimisation car après avoir trop doublé l'écran, la toile commence à être en retard car elle a trop de lignes pour qu'elle redessine chaque image. J'ai décidé d'annuler le nettoyage de la couche et j'ajoute un nouveau cercle à la position actuelle de la souris et j'enlève l'ancien pour l'optimisation. Cependant, puisque je ne dessine pas de lignes sur le mouvement rapide de la souris, il laisse d'énormes trous. Je serais très reconnaissant si quelqu'un peut m'aider avec cela.

Voici mon code:

(function() { 
 
    var stage = new Kinetic.Stage({ 
 
     container: 'main-drawing-window', 
 
     width: 920, 
 
     height: 750 
 
    }), 
 
    workplace = document.getElementById('main-drawing-window'), 
 
    layer = new Kinetic.Layer({ 
 
     clearBeforeDraw: false 
 
    }), 
 
    border = new Kinetic.Rect({ 
 
     stroke: "black", 
 
     strokeWidth: 2, 
 
     x: 0, 
 
     y: 0, 
 
     width: stage.getWidth(), 
 
     height: stage.getHeight() 
 
    }), 
 
    brush = new Kinetic.Circle({ 
 
     radius: 20, 
 
     fill: 'red', 
 
     strokeWidth: 2, 
 
     x: 100, 
 
     y: 300 
 
    }); 
 

 
    Input = function() { 
 
    this.mouseIsDown = false; 
 
    this.mouseX = 0; 
 
    this.mouseY = 0; 
 
    this.offsetX = 0; 
 
    this.offsetY = 0; 
 
    }; 
 

 
    var input = new Input(); 
 

 
    document.documentElement.onmousedown = function(ev) { 
 
    input.mouseIsDown = true; 
 
    }; 
 

 
    document.documentElement.onmouseup = function(ev) { 
 
    input.mouseIsDown = false; 
 
    }; 
 

 
    document.documentElement.onmousemove = function(ev) { 
 
    ev = ev || window.event; 
 

 
    // input.mouseX = (ev.clientX - workplace.offsetLeft); 
 
    // input.mouseY = (ev.clientY - workplace.offsetTop); 
 
    input.mouseX = (ev.offsetX); 
 
    input.mouseY = (ev.offsetY); 
 
    }; 
 

 
    function DistanceBetweenPoints(x1, y1, x2, y2) { 
 
    return Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))); 
 
    } 
 

 
    var canvasDraw = setInterval(function() { 
 
    // console.log(input); 
 
    if (input.mouseIsDown) { 
 
     workplace.style.cursor = "crosshair"; 
 
     var currentBrushPosition = brush.clone(); 
 
     currentBrushPosition.setX(input.mouseX); 
 
     currentBrushPosition.setY(input.mouseY); 
 
     // var distance = DistanceBetweenPoints(brush.getX(), brush.getY(), currentBrushPosition.getX(), currentBrushPosition.getY()); 
 
     // if (distance > brush.getRadius() * 2) { 
 
     //  var fillingLine = new Kinetic.Line({ 
 
     //   points: [brush.getX(), brush.getY(), currentBrushPosition.getX(), currentBrushPosition.getY()], 
 
     //   stroke: 'yellow', 
 
     //   strokeWidth: brush.getRadius()*2, 
 
     //   lineJoin: 'round' 
 
     //  }); 
 
     //  // layer.add(fillingLine); 
 
     // } 
 

 
     layer.add(currentBrushPosition); 
 
     brush.remove(); 
 
     brush = currentBrushPosition; 
 
     layer.draw(); 
 
     // if (fillingLine) { 
 
     //  fillingLine.remove(); 
 
     // } 
 
    } 
 
    if (!input.mouseIsDown) { 
 
     workplace.style.cursor = 'default'; 
 
    } 
 
    }, 16); 
 

 
    layer.add(border); 
 
    stage.add(layer); 
 
})();
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <title>Coloring Game</title> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/kineticjs/5.2.0/kinetic.min.js"></script> 
 

 
</head> 
 

 
<body> 
 
    <div id="main-drawing-window"></div> 
 
    <script type="text/javascript" src="./JS files/canvas-draw.js"></script> 
 
</body> 
 

 
</html>

Répondre

0

Ne pas utiliser Kinetic.Circle individuels s pour chaque mousemove. Chaque objet cinétique est un objet "géré" et cette gestion prend beaucoup de ressources. KineticJS va ralentir à une analyse que le nombre de cercles augmente à chaque mousemove.

Au lieu de cela, utilisez un Kinetic.Shape et vous dessiner des cercles sur la toile avec

// This is Pseudo-code since I haven't worked with KineticJS in a while 
shapeContext.beginPath(); 
shapeContext.arc(mouseX,mouseY,20,0,Math.PI*2); 
shapeContext.fillStrokeShape(this); 

Cela va probablement effacer votre problème, mais si la souris est déplacé très loin dans un seul mousemove alors vous pourriez avoir à dessiner un lineTo (au lieu de arc) entre le dernier point de la souris et le point de souris lointain actuel.