学习了拖拽后,那么碰撞就是拖拽一个对象去碰另一个对象,检测是否碰上了。
这里的碰撞是两个矩形对象的碰撞,如果是圆形或者不规则形状,方法又不一样了。
这个小案例是拖动老鼠去碰撞灯,老鼠只能在可视区内移动,碰上了灯,灯变亮了。
具体效果点击查看
知识点:
1、利用getBoundingClientRect( )方法获取元素的相关位置信息。
该方法返回一个对象,包含了width/height/top/bottom/left/right/x/y这几个属性和值。
要注意的是,right的值等于left加上width,bottom的值等于top加上height的值。
2、获取小老鼠可以移动的范围
就是可视区最大的宽高减去小老鼠容器自身的宽高。
var moveWidth = document.documentElement.clientWidth - oMouse.offsetWidth; var moveHeight = document.documentElement.clientHeight - oMouse.offsetHeight;
3、碰撞检测
利用九宫格的方法划分出上下左右四个区域,利用它们的位置关系进行判断。
网上直接找的图,凑合看吧。
直接贴上js代码:
<script> 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; } } </script>
发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。