2016-08-04 2 views
0

私はKineticJSでペイントするようなことをしようとしています。私は、マウスの位置から始まる円で色を描こうとしています。しかし、マウスの位置のイベントリスナーは遅すぎると思われます。マウスをあまりに速く動かすと、描画された円は互いに離れて表示されます。KineticJS、プログラムのようなペイント、ブラシのギャップ

私はそれらの間に線を描く点で配列を塗りつぶす人を見ましたが、最適化には非常に悪いです。なぜなら、画面をあまりダビングしすぎると、キャンバスは、フレームごとに再描画する線が多すぎるために遅れが生じます。私は、レイヤーのクリーニングをキャンセルすることに決めました。現在のマウス位置に新しいサークルを追加しています。古いものを削除して最適化します。しかし、私はマウスの動きを速くして線を描かないので、大きなギャップを残します。もし誰かが私にこれを手伝ってもらえると大変感謝しています。ここで

は私のコードです:

(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>

答えて

0

それぞれのMouseMoveのために個別のKinetic.Circle Sを使用しないでください。すべてのKineticオブジェクトは「管理された」オブジェクトであり、管理は多くのリソースを消費します。 KineticJSは、すべてのマウスでサークルの数が増えるにつれ、クロールが遅くなります。

代わりに、これはおそらくあなたの問題をクリアしますが、マウスが単一のMouseMoveに非常に遠くに移動した場合、あなたが描画する必要がある場合がありますKinetic.Shapeを使用して

// 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); 

でキャンバスにあなたの円を描きますlineToarcの代わりに)最後のマウスポイントと現在の遠方のマウスポイントの間にあります。

関連する問題