DOM基础10:两个矩形的碰撞

2019-12-12 19:48:55  阅读 4233 次 评论 3 条

学习了拖拽后,那么碰撞就是拖拽一个对象去碰另一个对象,检测是否碰上了。

这里的碰撞是两个矩形对象的碰撞,如果是圆形或者不规则形状,方法又不一样了。


贴出一个小案例 点我点我


这个小案例是拖动老鼠去碰撞灯,老鼠只能在可视区内移动,碰上了灯,灯变亮了。

知识点:

1、利用getBoundingClientRect( )方法获取元素的相关位置信息。

该方法返回一个对象,包含了width/height/top/bottom/left/right/x/y这几个属性和值。

201909171568691947458265.png

要注意的是,right的值等于left加上width,bottom的值等于top加上height的值。

2、获取小老鼠可以移动的范围

就是可视区最大的宽高减去小老鼠容器自身的宽高。

var moveWidth = document.documentElement.clientWidth - oMouse.offsetWidth;
var moveHeight = document.documentElement.clientHeight - oMouse.offsetHeight;

3、碰撞检测


利用九宫格的方法划分出上下左右四个区域,利用它们的位置关系进行判断。

网上直接找的图,凑合看吧。

201909171568692389420526.png

直接贴上js代码:

    var oMouse = document.querySelector("#mouse");
    var oLight = document.querySelector("#light img");
    oMouse.onmousedown = function (ev) {
        var ev = ev || event;
        var disX = ev.clientX - this.offsetLeft;
        var disY = ev.clientY - this.offsetTop;
        // console.log(disX,disY);
        
        document.onmousemove = function (ev) {
            var ev = ev || event;
            oMouse.style.left = ev.clientX - disX + "px";
            oMouse.style.top = ev.clientY - disY + "px";
            var l = ev.clientX - disX;
            var t = ev.clientY - disY;
            // 检测可以移动的范围
            var moveWidth = document.documentElement.clientWidth - oMouse.offsetWidth;
            var moveHeight = document.documentElement.clientHeight - oMouse.offsetHeight;
            if (l <= 0) {
            l = 0;
            oMouse.style.left = 0;
            } else if (l >= moveWidth) {
            oMouse.style.left = moveWidth + "px";
            }
            if (t <= 0) {
            oMouse.style.top = 0;
            } else if (t >= moveHeight) {
            oMouse.style.top = moveHeight + "px";
            }
            // 碰撞检测
            var isCollision=collision(oMouse,oLight);
            if(isCollision){
            oLight.src="images/light.png"
            }
            else{
            oLight.src="images/gray.png";
            }
        }
        document.onmouseup = function () {
            document.onmousemove = document.onmouseup = null;
        
        }
        return false;
    }
    
    // 碰撞检测
    function collision(obj1, obj2) {
        var obj1Rect = obj1.getBoundingClientRect();
        var obj2Rect = obj2.getBoundingClientRect();
        console.log(obj1Rect);
        
        var mL = obj1Rect.left;
        var mR = obj1Rect.right;
        var mB = obj1Rect.bottom;
        var mT = obj1Rect.top;
        
        var lL = obj2Rect.left;
        var lR = obj2Rect.right;
        var lB = obj2Rect.bottom;
        var lT = obj2Rect.top;
        
        if (mL > lR || lL > mR || mT > lB || lT > mB) {
            return false;
        } else {
            return true;
        }
    }



微信扫码查看本文
本文地址:https://www.yangguangdream.com/?id=2063
版权声明:本文为原创文章,版权归 编辑君 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

评论列表

  1. 黑皮肤的MAN
    黑皮肤的MAN  @回复

    写的不错,加油哦