javascript - 像素碰撞检测不起作用

标签 javascript html canvas collision-detection game-physics

这是我的游戏 plnkr .

(编辑:另一个 plnkr 有一个静态怪物而不是多个动态怪物)

输入或按钮将重新启动游戏。

谁能告诉我为什么碰撞检测算法取自 here不管用?它似乎无法准确地检测到命中(太广泛)。他们网站上的演示效果很好,但我不确定我做错了什么。

最相关的代码段(更新函数内部):

// Are they touching?


if (heroImage.width) {
    var heroImageData = ctx.getImageData(heroImage.x, heroImage.y, heroImage.width, heroImage.height);
    var monsterImageData;
    for (var i = 0; i < monsters.length; i++) {
        var monster = monsters[i];

        monster.x += monster.directionVector.x;
        monster.y += monster.directionVector.y;

        monsterImageData = ctx.getImageData(monster.monsterImage.x, monster.monsterImage.y, monster.monsterImage.width, monster.monsterImage.height);
        if (isPixelCollision(heroImageData, hero.x, hero.y, monsterImageData, monster.x, monster.y)) {
            stop();
        }
    }
}

最佳答案

正如 @GameAlchemist 指出的,您正在从 Canvas 背景中获取怪物和英雄的 ImageData ,该 Canvas 背景已经绘制了背景图像。因此 alpha 值始终为 255(不透明)。

碰撞函数中正在检查哪些内容

if (
    ( pixels [((pixelX - x ) + (pixelY - y ) * w ) * 4 + 3 /*RGBA, alpha @ 4*/] !== 0/*alpha zero expected*/ ) &&
    ( pixels2[((pixelX - x2) + (pixelY - y2) * w2) * 4 + 3 /*RGBA, alpha @ 4*/] !== 0/*alpha zero expected*/ )
) {
    return true;
}

相反,这两个 ImageData 都应该通过将这些图像绘制到没有任何绘制的 Canvas 上来生成。即使在完成该碰撞算法之后,似乎也不太有效。

我创建了两个变量 monsterImageDataheroImageData 来保存 imageData,这些变量仅加载一次。

HTML 文件 id=testCanvas 中有一个新 Canvas 。用于获取怪物和英雄的图像数据值。

这是plunker link修改后的代码。

关于javascript - 像素碰撞检测不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34468177/

相关文章:

javascript - 在 JavaScript 中对字符串调用 forEach

javascript - 如何通过 JavaScript 处理 URL 更改

html - 锁定图像,使其不会相对于其他对象移动 html

javascript - 动态 Canvas DrawImage函数

javascript - 带圆 Angular 的 Canvas drawimage

javascript - 向鼠标单击时鼠标悬停的所有元素添加类

javascript - 获取子属性

python - 从 html span 中检索内容字段

javascript - 使用冒号符号调用函数

javascript - 在 Fabric js 中添加和删除自定义属性