get click event of each rectangle inside canvas?

后端 未结 5 1140
说谎
说谎 2020-12-01 08:31

I dont know how to register click event on each rectangle.

here is the sample:

http://jsfiddle.net/9WWqG/1/

5条回答
  •  甜味超标
    2020-12-01 09:07

    You're basically going to have to track where your rectangles are on the canvas, then set up an event listener on the canvas itself. From there you can take the coordinates of the click event and go through all your rectangles to test for 'collisions'.

    Here's an example of doing just that: http://jsfiddle.net/9WWqG/2/

    html:

    
    
    

    javascript:

    // get canvas element.
    var elem = document.getElementById('myCanvas');
    
    function collides(rects, x, y) {
        var isCollision = false;
        for (var i = 0, len = rects.length; i < len; i++) {
            var left = rects[i].x, right = rects[i].x+rects[i].w;
            var top = rects[i].y, bottom = rects[i].y+rects[i].h;
            if (right >= x
                && left <= x
                && bottom >= y
                && top <= y) {
                isCollision = rects[i];
            }
        }
        return isCollision;
    }
    
    // check if context exist
    if (elem && elem.getContext) {
        // list of rectangles to render
        var rects = [{x: 0, y: 0, w: 50, h: 50},
                     {x: 75, y: 0, w: 50, h: 50}];
      // get context
      var context = elem.getContext('2d');
      if (context) {
    
          for (var i = 0, len = rects.length; i < len; i++) {
            context.fillRect(rects[i].x, rects[i].y, rects[i].w, rects[i].h);
          }
    
      }
    
        // listener, using W3C style for example    
        elem.addEventListener('click', function(e) {
            console.log('click: ' + e.offsetX + '/' + e.offsetY);
            var rect = collides(rects, e.offsetX, e.offsetY);
            if (rect) {
                console.log('collision: ' + rect.x + '/' + rect.y);
            } else {
                console.log('no collision');
            }
        }, false);
    }
    

提交回复
热议问题