JavaScript碰撞检测原理及其实现代码


Posted in Javascript onMarch 12, 2020

本文实例为大家分享了JavaScript实现碰撞检测原的具体代码,供大家参考,具体内容如下

1.模拟碰撞

简单模拟碰撞过程,用一个可以拖拽的div2去尝试碰撞一个固定的div1(均用绝对定位)

2.碰撞检测原理

JavaScript碰撞检测原理及其实现代码

如图所示:
使得div分别有4个距离属性( L(left),T(top),R(right),B(bottom) ).
对于div1来说,画出一个九宫格,div2在除中心以为的8个格子任意移动都不会发送碰撞.

JavaScript碰撞检测原理及其实现代码

也就是说,只要满足条件:oDiv2.div2R小于oDiv1.div1L|| oDiv2.div2L大于oDiv1.div1R || oDiv2.div2B小于oDiv1.div1T|| oDiv2.div2T大于oDiv1.div1B就不会发送碰撞

3.具体测试代码

<html>
<head>
 <title></title>
 <style type="text/css">
 body{margin: 0;padding: 0;}
 #div2{height: 100px;width: 200px;background-color: orange;position: absolute;left: 0px;top:0px;z-index: 1;}
 #div1{height: 100px;width: 100px;background-color: #a6e22e;position: absolute;left: 600px;top:400px;}
 </style>
 <script type="text/javascript">
 //获取对象样式属性值
 function getObjStyle(obj,attr)
 {
  return getComputedStyle(obj)?getComputedStyle(obj)[attr]:obj.currentStyle[attr];
 }
 </script>
 <script type="text/javascript">
 window.οnlοad=function (){
  var oDiv1=document.getElementById('div1');
  var oDiv2=document.getElementById('div2');



  oDiv2.οnmοusedοwn=function (onEvent,obj){//对div1实现拖拽,并对碰撞进行检测
   obj=this;
   var ev=onEvent||event;
   var distance={};
   distance.disX=ev.clientX-obj.offsetLeft;//到左边框的距离
   distance.disY=ev.clientY-obj.offsetTop;//到上边框的距离

   //获取div1的四个值
   oDiv1.div1L=getObjStyle(oDiv1,'left');
   oDiv1.div1R=parseInt(getObjStyle(oDiv1,'left'))+parseInt(getObjStyle(oDiv1,'width'))+'px';
   oDiv1.div1T=getObjStyle(oDiv1,'top');
   oDiv1.div1B=parseInt(getObjStyle(oDiv1,'top'))+parseInt(getObjStyle(oDiv1,'height'))+'px';




   if(obj.setCapture)
    obj.setCapture();

   document.οnmοusemοve=function (onEvent){
    var ev=onEvent||event;
    obj.style.left=ev.clientX-distance.disX+'px';
    obj.style.top=ev.clientY-distance.disY+'px';

    //获取div2的四个值
    oDiv2.div2L=getObjStyle(oDiv2,'left');
    oDiv2.div2R=parseInt(getObjStyle(oDiv2,'left'))+parseInt(getObjStyle(oDiv2,'width'))+'px';
    oDiv2.div2T=getObjStyle(oDiv2,'top');
    oDiv2.div2B=parseInt(getObjStyle(oDiv2,'top'))+parseInt(getObjStyle(oDiv2,'height'))+'px';

    /*console.log('oDiv2.div2L:'+oDiv2.div2L+' oDiv2.div2R:'+oDiv2.div2R+' oDiv2.div2T:'+oDiv2.div2T+' oDiv2.div2B:'+oDiv2.div2B);*/

    //碰撞检测
    if(oDiv2.div2R<oDiv1.div1L || oDiv2.div2L>oDiv1.div1R || oDiv2.div2B<oDiv1.div1T || oDiv2.div2T>oDiv1.div1B){
     //未发送碰撞
    }else{
     //发生碰撞
     alert('发生碰撞');
    }

   }

   document.οnmοuseup=function (){
    document.οnmοuseup=document.οnmοusemοve=null;
    if(obj.setCapture)
     obj.releaseCapture();
   }
   return false;
  }
 }
 </script>
</head>
<body>
 <div id="div2">div2</div>
 <div id="div1">div1</div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
javascript(jquery)利用函数修改全局变量的代码
Nov 02 Javascript
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
用js实现trim()的解决办法
Apr 16 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
May 08 Javascript
详解JavaScript中localStorage使用要点
Jan 13 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
Apr 17 Javascript
基于jQuery倒计时插件实现团购秒杀效果
May 13 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
Apr 11 jQuery
package.json配置文件构成详解
Aug 27 Javascript
Node.js安装详细步骤教程(Windows版)详解
Sep 01 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 Javascript
JavaScript实现多个物体同时运动
Mar 12 #Javascript
基于javascript实现碰撞检测
Mar 12 #Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 #jQuery
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 #Javascript
javascript实现拖拽碰撞检测
Mar 12 #Javascript
原生js实现碰撞检测
Mar 12 #Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 #Javascript
You might like
谈谈PHP语法(4)
2006/10/09 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
jQuery 使用手册(一)
2009/09/23 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
jQuery实现的淡入淡出二级菜单效果代码
2015/09/15 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
Python读写Excel文件方法介绍
2014/11/22 Python
Python 迭代器与生成器实例详解
2017/05/18 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
详解python中*号的用法
2019/10/21 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
策划总监岗位职责
2014/02/16 职场文书
母校寄语大全
2014/04/10 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书