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 相关文章推荐
基于JQuery框架的AJAX实例代码
Nov 03 Javascript
ajax java 实现自动完成功能
Dec 19 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
Dec 31 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
Jan 14 Javascript
javascript实现简单的进度条
Jul 02 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
Mar 31 Javascript
微信小程序 选项卡的简单实例
May 24 Javascript
vue实现登录后页面跳转到之前页面
Jan 07 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
Nov 14 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
2013/11/19 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python与pycharm有何区别
2020/07/01 Python
党校培训思想汇报
2013/12/30 职场文书
财政专业求职信范文
2014/02/19 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
详解Golang如何优雅的终止一个服务
2022/03/21 Golang
js前端图片加载异常兜底方案
2022/06/21 Javascript