美文网首页
canvas版像素碰撞

canvas版像素碰撞

作者: bo_bo_bo_la | 来源:发表于2017-12-28 22:21 被阅读42次

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版像素碰撞

    canvas像素碰撞思路: 创建两个图片 将第一张图片拷贝到canvas中,带该图片加载完毕之后 拖动第二张图片,...

  • canvas 初探 api 整理 I

    canvas API 整理 I canvas canvas 的默认大小为300像素×150像素(宽×高,像素的单位...

  • canvas图片操作/canvas像素级操作/canvas视频(

    canvas图片操作 canvas像素级操作 canvas视频(video)操作

  • 2017-07-06

    Canvas和SVG Canvas 通过Javascript 来绘制 2D 图形。Canvas 是逐像素进行渲染的...

  • Canvas学习笔记之像素

    Canvas 学习笔记之像素操作 -- by Damon 像素操作 ImageData 对象width: Numb...

  • Canvas基础3

    canvas样式阴影 线性渐变 渐变镜像 canvas背景 导出图片内容 像素级操作

  • 构造函数&&类--canvas小球碰撞

    1. 构造函数 canvas小球碰撞 2. 类 canvas小球碰撞 有上可以看出,用类写面向对象的方法,...

  • canvas像素操作

    (服务器环境下运行)先说下关键词getImageData() 方法返回 ImageData 对象,该对象拷贝了画布...

  • canvas image模糊失真

    知识点: pixelRatio拿到当前机型设备的像素比(dpr) canvas.width 和 canvas.he...

  • Canvas

    Canvas 的默认大小为300像素×150像素(宽×高,像素的单位是px)。但是,可以使用HTML的高度和宽度属...

网友评论

      本文标题:canvas版像素碰撞

      本文链接:https://www.haomeiwen.com/subject/ddlbgxtx.html