Click area on sprite in canvas

后端 未结 2 1655
心在旅途
心在旅途 2020-12-06 07:30

I\'m creating a game in Javascript. currently the sprites are div elements with a background image that is updated to create animation. I have heard that if I make the eleme

相关标签:
2条回答
  • 2020-12-06 07:49

    I have a tutorial that does almost exactly what you need for the hit-testing. See the code here.

    When you click, the code draws each shape (I use rectangles but it works beautifully with semi-transparent images) to a canvas in memory (ghostcanvas) and checks to see if the mouse pixel is on a pixel that is not-transparent.

    Relevant code pasted below:

    function myDown(e){
      getMouse(e);
      clear(gctx); // clear the ghost canvas from its last use
    
      // run through all the boxes
      var l = boxes.length;
      for (var i = l-1; i >= 0; i--) {
        // draw shape onto ghost context
        drawshape(gctx, boxes[i], 'black');
    
        // get image data at the mouse x,y pixel
        var imageData = gctx.getImageData(mx, my, 1, 1);
        var index = (mx + my * imageData.width) * 4;
    
        // if the mouse pixel exists, select and break
        if (imageData.data[3] > 0) {
          mySel = boxes[i];
          offsetx = mx - mySel.x;
          offsety = my - mySel.y;
          mySel.x = mx - offsetx;
          mySel.y = my - offsety;
          isDrag = true;
          canvas.onmousemove = myMove;
          invalidate();
          clear(gctx);
          return;
        }
    
      }
      // havent returned means we have selected nothing
      mySel = null;
      // clear the ghost canvas for next time
      clear(gctx);
      // invalidate because we might need the selection border to disappear
      invalidate();
    }
    
    0 讨论(0)
  • 2020-12-06 08:01

    You could have the background be transparent and check images for transparency at the clicked pixel. Here's some code from one of my game prototypes:

    function getAlphaInImage(img, x, y) {
        var tmp = document.createElement("CANVAS");
        tmp.setAttribute('width', img.width);
        tmp.setAttribute('height', img.height);
        var tmpCtx = tmp.getContext('2d');
        tmpCtx.drawImage(img, 0, 0);
        var imageData = tmpCtx.getImageData(x, y, 1, 1);
        var alpha = imageData.data[3];
        tmp = null;
        imageData = null;
        return alpha;
    }
    

    Before calling this I first check if the mouseclick was within the whole image.

    0 讨论(0)
提交回复
热议问题