canvas版像素碰撞

canvas像素碰撞思路:

  • 创建两个图片
  • 将第一张图片拷贝到canvas中,带该图片加载完毕之后
  • 拖动第二张图片,用于测试像素碰撞
  • 像素碰撞的前提必须是先普通碰撞
  • 像素碰撞,两个图片交叉的地方,一定存在一个点,在目标图中的透明度不为0,并且在原图中的透明度不为0。

canvas像素碰撞解释:

  • function Rect(x,y,w,h)
    用于后期获取目标图片与原图片交叉所得到的位置,因为canvas没有节点,不能通过节点找到我们想要的东西。


    image.png
  • context.drawImage(img,0,0);
    context.drawImage(img2,x,y);
    将两张图片绘制到canvas上

  • context.drawImage(img,0,0);
    var imgData1 = context.getImageData(nrect.res.x,nrect.res.y,nrect.res.w,nrect.res.h);
    canvas每次保存最后一个绘画的内容,所以在晴空画布之后重新绘制图片1,并获取到目标图与原图交叉的地方在目标图中的所有像素点。

  • context.clearRect(0,0,canvas.width,canvas.height);
    context.drawImage(img2,x,y);
    var imgData2 = context.getImageData(nrect.res.x,nrect.res.y,nrect.res.w,nrect.res.h);
    context.drawImage(img,0,0);
    与上面一样,canvas只保存最后一次绘制的内容,所以每次要清空画布的时候还有将图片绘制上去

  • for(var i = 0;i < imgData1.data.length;i+=4)
    获取到的像素点每4个为一组,即RGBA……一次循环,所以遍历交叉的地方的像素点时,只要遍历没一组中的最后一个值是否大于0,如果大于0 表示该点不是透明色。表明两图像素碰撞

    <script type="text/javascript">
        var canvas = document.getElementById("myCanvas");
        var context = canvas.getContext("2d");
        var img = new Image();
        img.src = "../../canvas进阶/55.png";
        var img2 = new Image();
        img2.src = "../../file/Play.png";
        function Rect(x,y,w,h){
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
        }
        img.onload = function(){
            context.beginPath();
            context.drawImage(img,0,0);
            var rect1 = new Rect(0,0,img.width,img.height);
            canvas.onmousedown = function(){
                canvas.onmousemove = function(e){
                    context.clearRect(0,0,canvas.width,canvas.height);
                    var ev = window.event || e;
                    var x = ev.clientX - canvas.offsetLeft;
                    var y = ev.clientY - canvas.offsetTop;
                    context.drawImage(img,0,0);
                    context.drawImage(img2,x,y);
                    var rect2 = new Rect(x,y,img2.width,img2.height);
                    var nrect = isCrash(rect1,rect2);
                    if(nrect.judeg){
                        console.log("普通碰撞");
                        context.drawImage(img,0,0);
                        var imgData1 = context.getImageData(nrect.res.x,nrect.res.y,nrect.res.w,nrect.res.h);
                        context.clearRect(0,0,canvas.width,canvas.height);
                        context.drawImage(img2,x,y);
                        var imgData2 = context.getImageData(nrect.res.x,nrect.res.y,nrect.res.w,nrect.res.h);
                        context.drawImage(img,0,0);
                        for(var i = 0;i < imgData1.data.length;i+=4){
                            if(imgData1.data[i+3] > 0 && imgData2.data[i+3] > 0){
                                console.log("像素碰撞");
                                break;
                            }
                        }
                    }
                }
            }
            document.onmouseup = function(){
                canvas.onmousemove = "";
            }
        }
        function isCrash(rect1,rect2){
            var nMinx = Math.max(rect1.x,rect2.x);
            var nMiny = Math.max(rect1.y,rect2.y);
            var nMaxx = Math.min(rect1.x+rect1.w,rect2.x+rect2.w);
            var nMaxy = Math.min(rect1.y+rect1.h,rect2.y+rect2.h);
            var nrect = new Rect(nMinx,nMiny,(nMaxx - nMinx),(nMaxy - nMiny));
            if(nMaxx > nMinx && nMaxy > nMiny){
                return {
                    judeg: true,
                    res: nrect
                };
            }else{
                return {
                    judeg: false
                }
            }
        }
    </script>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 10,185评论 2 32
  • 一、图形的组合方式 globalAlpha是一个介于0和1之间的值(包括0和1),用于指定所有绘制的透明度。默认值...
    空谷悠阅读 5,193评论 0 0
  • 书中代码示例效果展示:Core HTML5 Canvas Examples 基础知识 canvas元素 canva...
    szu_bee阅读 7,936评论 2 28
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 9,356评论 3 40
  • 渣男体质应该如何自救?链接 相比未知,对于熟悉的创伤,我们甚至会多少觉得已经习惯了它,没那么可怕。...很多人觉得...
    cers000阅读 903评论 0 0