3

キャンバスを定義し、それにいくつかの図形を描画する場合、各図形のイベントやその他のプロパティを宣言するために、各図形または画像を特定するにはどうすればよいでしょうか。長方形と三角形があるとします。そのため、それらを特定のエンティティとして定義し、それらを個別に処理するためのメカニズムを用意できますか。KineticJS については知っていますが、この機能を自分で実装したいと思います (学習目的で)。誰でもその方法を特定できますか。それともアルゴリズム的なアプローチでしょうか??

4

2 に答える 2

7

マウスイベントを使ったピンポイントについて説明したい

まず、マウスの位置を取得するメソッドを実装する必要があります

    function getMousePos(canvas, evt){
    // get canvas position
    var obj = canvas;
    wrapper = document.getElementById('wrapper');
    var top = 0;
    var left = 0;
    while (obj && obj.tagName != 'BODY') {
        top += obj.offsetTop;
        left += obj.offsetLeft;
        obj = obj.offsetParent;
    }

    // return relative mouse position
    var mouseX = evt.clientX - left + window.pageXOffset+wrapper.scrollLeft;
    var mouseY = evt.clientY - top + window.pageYOffset+wrapper.scrollTop;
    return {
        x: mouseX,
        y: mouseY
    };
}
  1. 矩形

たとえば、次の値 x1、y1、w、h を持つ長方形があるとします。

$(canvas).mousemove(function(e){

        //Now call the method getMousePos
         var mouseX, mouseY;
         var mousePos = getMousePos(canvas, e);
         mouseX=mousePos.x;
         mouseY=mousePos.y; 

        // check if move on the rect

        if(mouseX>x1 && mouseX<x1+w && mouseY>y1 && mouseY<y1+h)
        {
            alert('mouse on rect')
        }        
});
  1. サークル

次の値 x、y、r を持つ円があるとします。

$(canvas).mousemove(function(e){

        //Now call the method getMousePos
         var mouseX, mouseY;
         var mousePos = getMousePos(canvas, e);
         mouseX=mousePos.x;
         mouseY=mousePos.y; 

        // check if move on the rect

       if(Math.pow(mouseX-x,2)+Math.pow(mouseY-y,2)<Math.pow(r,2))
        {
            alert('mouse on circle')
        }        
});

このようにして、キャンバスのオブジェクトを特定できます

于 2012-03-22T13:17:27.780 に答える
1

そのために、DOM の既存の機能を使用することはできません。だから、自分で書く必要があります。次のようなオブジェクト モデルを作成することから始めることができます。

function Shape(x, y) {
  var obj = {};
  obj.x = x;
  obj.y = y;

  obj.paint = function(canvasTarget) {
  }

  return obj;
}

function Rectangle(x, y, width, height) {
  var obj = Shape(x, y);
  obj.width = width;
  obj.height = height;

  obj.paint = function(canvasTarget) {
     //paint rectangle on the canvas
  }

  return obj;
}

function Canvas(target) {
  var obj = {};
  obj.target = target
  obj.shapes = [];

  obj.paint = function() {
     //loop through shapes and call paint
  }

  obj.addShape(shape) {
     this.shapes.push(shape);
  }        
}

オブジェクト モデルを作成したら、それを使用して次のような形状を描画できます。

var cnv = new Canvas();
cnv.addShape(new Rectangle(10,10,100,100));
cnv.paint();

次に、キャンバスで onclick イベントを処理し、クリックされた図形を判別できます。

于 2012-03-22T13:04:29.940 に答える