原生JS实现的碰撞检测功能示例


Posted in Javascript onMay 18, 2018

本文实例讲述了原生JS实现的碰撞检测功能。分享给大家供大家参考,具体如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>3water.com JS碰撞检测</title>
<style>
div{width:100px;
  height:100px;
}
#box{background:red; position:absolute; }
#box1{background:green;position:absolute;top:300px; left:300px;}
</style>
<script>
//两个碰撞的盒子。是建立在一个不动的基础上。所以可以根据不动的盒子求出四个方向的left和top值。然后再判断其是否碰撞,且碰撞的过程随时改变其层级,(原需 var 8个变量,现在只需4个变量)
function collText(obj,left,top,obj1){
      var l1=obj.offsetLeft-obj.offsetWidth;
      var t1=obj.offsetTop-obj.offsetHeight;
      var r1=obj.offsetLeft+obj.offsetWidth;
      var b1=obj.offsetTop+obj.offsetHeight;
      if(left<l1||top<t1||left>r1||top>b1){
        obj.style.zIndex=3;
        obj1.style.zIndex=1;
        return true;
      }else{
        obj.style.zIndex=1;
        obj1.style.zIndex=3;
        return false;
      }
};
window.onload=function(){
  var oBox=document.getElementById('box');
  var oBox1=document.getElementById('box1');
  oBox.onmousedown=function(ev){
    var oEvent= ev  ||  event;
    var disX=oEvent.clientX-oBox.offsetLeft;
    var disY=oEvent.clientY-oBox.offsetTop;
    document.onmousemove=function(ev){
      var oEvent= ev ||  event;
      var l=oEvent.clientX-disX;
      var t=oEvent.clientY-disY;
      oBox.style.left=l+'px'  ;
      oBox.style.top=t+'px'  ;
      if(collText(oBox1,l,t,oBox)){
        oBox1.style.background='green';
      }else{
        oBox1.style.background='yellow';
      }
    };
    document.onmouseup=function(){
      document.onmousemove=null;
      document.onmouseup=null;
      oBox.reseaseCapture&&oBox.reseaseCapture();
    };
    oBox.setCapture&&oBox.setCapture();
    return false;
  }
  oBox1.onmousedown=function(ev){
    var oEvent= ev ||  event;
    var disX1=oEvent.clientX-oBox1.offsetLeft;
    var disY1=oEvent.clientY-oBox1.offsetTop;
    document.onmousemove=function(ev){
      var oEvent= ev ||  event;
      var le=oEvent.clientX-disX1;
      var to=oEvent.clientY-disY1;
      oBox1.style.left=le+'px'  ;
      oBox1.style.top=to+'px'  ;
      if(collText(oBox,le,to,oBox1)){
        oBox.style.background='red';
      }else{
        oBox.style.background='#000';
      }
    };
    document.onmouseup=function(){
      document.onmousemove=null;
      document.onmouseup=null;
      oBox1.reseaseCapture&&oBox1.reseaseCapture();
    }
    oBox1.setCapture&&oBox1.setCapture();
    return false;
  }
}
</script>
</head>
<body>
<div id="box"></div>
<div id="box1"></div>
</body>
</html>

这里使用在线HTML/CSS/JavaScript运行工具http://tools.3water.com/code/HtmlJsRun测试运行效果如下(碰撞判定时颜色改变):

 原生JS实现的碰撞检测功能示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Jquery中显示隐藏的实现代码分析
Jul 26 Javascript
JS弹出窗口代码大全(详细整理)
Dec 21 Javascript
用jquery写的一个万年历(自写)
Jan 20 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
浅谈JS函数节流防抖
Oct 18 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 Javascript
react-native动态切换tab组件的方法
Jul 07 Javascript
JavaScript创建对象的常用方式总结
Aug 10 Javascript
JavaScript常用进制转换及位运算实例解析
Oct 14 Javascript
超详细小程序定位地图模块全系列开发教学
Nov 24 Javascript
JS实现json对象数组按对象属性排序操作示例
May 18 #Javascript
vue.js使用3DES加密的方法示例
May 18 #Javascript
JS实现的3des+base64加密解密算法完整示例
May 18 #Javascript
JS实现调用本地摄像头功能示例
May 18 #Javascript
React全家桶环境搭建过程详解
May 18 #Javascript
vue单页开发父子组件传值思路详解
May 18 #Javascript
Node.js Buffer用法解读
May 18 #Javascript
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python isinstance判断对象类型
2008/09/06 Python
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
使用python实现对元素的长截图功能
2019/11/14 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
用python进行视频剪辑
2020/11/02 Python
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
村委会换届选举方案
2014/05/03 职场文书
师德师风事迹材料
2014/12/20 职场文书
房屋质量投诉书
2015/07/02 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS
JS如何使用剪贴板操作Clipboard API
2021/05/17 Javascript
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫