javascript - 使用 Javascript、Canvas 和 Alpha 检测进行碰撞检测

标签 javascript canvas collision-detection sprite

我目前正在开发一个基本的 JavaScript 游戏,该游戏有两个不会碰撞在一起的 Sprite 。然而,基本的边界框碰撞还不够,因为 Sprite 的某些部分是透明的,不会“算作”碰撞。我找到了解决我遇到的问题的方法,但我无法让它发挥作用。我想做的是计算 Sprite 的透明部分,并确保如果透明部分重叠,则不会检测到碰撞。这是我发现可以解决问题的方法。

http://blog.weeblog.net/?p=40#comments

  /**
   * Requires the size of the collision rectangle [width, height]
   * and the position within the respective source images [srcx, srcy]
   * 
   * Returns true if two overlapping pixels have non-zero alpha channel
   * values (i.e. there are two vissible overlapping pixels)
   */
  function pixelCheck(spriteA, spriteB, srcxA, srcyA, srcxB, srcyB, width, height){
    var dataA = spriteA.getImageData();
    var dataB = spriteB.getImageData();

    for(var x=0; x<width; x++){
      for(var y=0; y<height; y++){
        if( (dataA[srcxA+x][srcyA+y] > 0) && (dataB[srcxB+x][srcyB+y] > 0) ){
          return true;
        }
      }
    }
    return false;
  }

计算图像数据:

    /**
     * creating a temporary canvas to retrieve the alpha channel pixel
     * information of the provided image
     */
    function createImageData(image){
      $('binaryCanvas').appendTo('body');
      var canvas = document.getElementById('binaryCanvas');
      var ctx      = canvas.getContext("2d");

      ctx.drawImage(image, 0, 0);
      var canvasData = ctx.getImageData(0, 0, canvas.width, canvas.height);
      var imageData  = [image.width];

      for(var x=0; x<image.width; x++){
        imageData[x] = [image.height];
        for(var y=0; y<image.height; y++){
          var idx = (x + y * image.width) * 4;
          imageData[x][y] = canvasData.data[idx+3];
        }
      }
      $("#binaryCanvas").remove();
      return imageData;
    }

问题是我不知道如何实现这个解决方案,或者这是否是解决我的问题的最佳解决方案。这就是我要找的吗?如果是这样,我应该把这些方法放在哪里?我最困惑的是我应该传递给 spriteA 和 spriteB 的内容。我尝试过传递图像,并且尝试传递从 pixelCheck 方法返回的 imageData,但收到相同的错误:对象或图像没有方法“getImageData”。我做错了什么?

最佳答案

这有两个问题。

你创建了一个函数:

function createImageData(image){...}

但是你要调用的是:

spriteA.getImageData();
spriteB.getImageData();

点表示对象的属性。您试图调用一个不属于对象的函数。有一些简单的修复。

将 createImageData() 函数添加到构造函数中:

function Sprite(){
    ...
    this.createImageData = function(image){...};
    ...
}

或:

Sprite.createImageData = function(image{...};

或者只是正确调用它:

createImageData(spriteA.image); // or whatever the image is

第二,您的函数调用图像参数,但您没有提供图像参数。只需记住在调用时提供图像即可。您还可以删除参数并从函数内获取图像。

有点像这样:

function Sprite(){
    ...
    this.createImageData = function(){
        var image = this.image;
        // or just use this.image, or whatever it is
        ...
    }
    ...
}

希望这有帮助。

关于javascript - 使用 Javascript、Canvas 和 Alpha 检测进行碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13410274/

相关文章:

ios - Sprite 套件中的完美弹性碰撞

javascript - CSS 转换未在所有浏览器中使用 jQuery 更新

javascript - 将另一个函数添加到 onclick

c++ - Box2D 碰撞回调

lua - 矩形碰撞系统在 love2d 中不起作用

javascript - 如何在 HTML5 Canvas 中展开模糊滤镜半径?

javascript - 提取匹配的文本及其相邻上下文 n 个词上游 n 个词下游(左起第 n 次出现和右起第 n 次出现)

javascript - 我无法在 javascript 循环期间使用 jQuery 附加元素

javascript - 如何将生成的 svg 代码保存到客户端计算机中的 .svg 文件中?

javascript - 将坐标外推到 Canvas 对象的边缘