首先我们应用上次的内容——方块拖拽,利用方块拖拽来让两个方块进行碰撞。

我们可以先定义两个正方形方块,红色的div1,绿色的div2,我们来实现当div1碰撞div2时div2的颜色变为黄色

HTML代码如下:定义方块

 1 <!DOCTYPE html>
2 <html lang="en">
3
4 <head>
5 <meta charset="UTF-8">
6 <meta http-equiv="X-UA-Compatible" content="IE=edge">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <title>Document</title>
9 <style>
10 body {
11 margin: 0;
12 }
13 #div1 {
14 width: 100px;
15 height: 100px;
16 background: red;
17 position: absolute;
18 left: 0;
19 top: 0;
20 }
21
22 #div2 {
23 width: 100px;
24 height: 100px;
25 background: green;
26 position: absolute;
27 left: 500px;
28 top: 200px;
29 }
30 </style>
31 </head>
32
33 <body>
34 <div id="div1"></div>
35 <div id="div2"></div>
36 </body>
37
38 </html>

利用上个文章的的拖拽内容:令div1可以拖拽

 1 <script>
2 var div1 = document.getElementById('div1')
3 var div2 = document.getElementById('div2')
4
5 div1.onmousedown = function (event) {
6 var chaX = event.clientX - div1.offsetLeft
7 var chaY = event.clientY - div1.offsetTop
8
9 document.onmousemove = function (event) {
10 div1.style.left = event.clientX - chaX + 'px'
11 div1.style.top = event.clientY - chaY + 'px'
12 }
13
14 document.onmouseup = function () {
15 document.onmousemove = null
16 }
17
18
19 }
20
21
22 </script>

因为我们每次拖拽都要判断是否碰撞,我们的碰撞代码应该放在移动的里面

添加后:

 1 <script>
2 var div1 = document.getElementById('div1')
3 var div2 = document.getElementById('div2')
4
5 div1.onmousedown = function (event) {
6 var chaX = event.clientX - div1.offsetLeft
7 var chaY = event.clientY - div1.offsetTop
8
9 document.onmousemove = function (event) {
10 div1.style.left = event.clientX - chaX + 'px'
11 div1.style.top = event.clientY - chaY + 'px'
12
13 if (div1.offsetLeft + div1.offsetWidth < div2.offsetLeft ||
14 div2.offsetLeft + div2.offsetWidth < div1.offsetLeft ||
15 div1.offsetTop + div1.offsetHeight < div2.offsetTop ||
16 div2.offsetTop + div2.offsetHeight < div1.offsetTop
17 ) {
18 div2.style.backgroundColor = ''
19 } else {
20 div2.style.backgroundColor = 'yellow'
21 }
22
23 }
24 document.onmouseup = function () {
25 document.onmousemove = null
26 }
27 }
28
29 </script>

可以看到我们在移动的代码里添加了判断条件

让div1的左边距加上div1的宽度小于div2的左边距,让div2的左边距加上div2的宽度小于div1的左边距,让div1的上边距加上div1的高度小于div2的上边距,让div2的上边距加上div2的高度小于div1的上边距,满足这些条件就是未碰上。

用JS实现方块碰撞的更多相关文章

  1. js实现方块弹珠游戏

    下载地址:https://files.cnblogs.com/files/liumaowu/%E5%BC%B9%E4%B8%80%E5%BC%B9%E6%89%93%E6%96%B9%E5%9D%97 ...

  2. js实现方块的碰撞检测

    文章地址:https://www.cnblogs.com/sandraryan/ 个人感觉.方块的碰撞检测比圆形麻烦~~ <!DOCTYPE html> <html lang=&qu ...

  3. js实现小球碰撞游戏

    效果图:  效果图消失只是截的gif图的问题 源码: <!DOCTYPE html> <html lang="en"> <head> <m ...

  4. (原)用pixi.js 实现 方块阵点击后原地自转效果

    源码 各位,请教一个问题,我这个还有BUG,我是想实现,点击一下可以 停止转动,然后再点一下重新转动.而不是一直加速,有没有什么好办法?  PS:问题已经解决,谢谢评论的大神@Antineutrino ...

  5. js 拖拽 碰撞 + 重力 运动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. three.js raycaster射线碰撞的坑 (当canvas大小 不是屏幕大小是解决拾取物体的办法)

    这里只是记录一下坑,方便查阅,内容主要援引自:three.js Raycaster 射线拾取 canvas不占满整屏时射线拾取存在偏差 1. 世界坐标系: 世界坐标系位于屏幕的中心(0,0,0),往右 ...

  7. Canvas+Js制作动量守恒的小球碰撞

    目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,c ...

  8. 前端学习:JS面向对象知识学习(图解)

    前端学习:JS面向对象知识学习(图解) 前端学习:JS(面向对象)代码笔记 JS面向对象图解知识全览 创建类和对象 方式1:使用Object()函数 方式2:使用自变量 方式3:使用工厂函数 创建多个 ...

  9. VGA详解及色块碰撞示例

    引言 VGA:video Graphics array,视频图形阵列,阴极射线显像管(CRT)显示器时代产物,很多老显卡.笔记本电脑.投影仪所用接口,已经比较过时. CRT是模拟设备,所以VGA也采用 ...

随机推荐

  1. Linux入门需要搞清楚的思路问题

    很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...

  2. Nginx(二):Nginx的四层(L4)和七层(L7)负载均衡

    OSI七层模型 和 TCP/IP四层模型 四层负载均衡( L4 Load Balancing ) 四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内 ...

  3. (转)linux下execl和system函数

    linux下,system函数和execl函数都是用于执行一条系统命令.今天仔细看了system函数的实现,想找出和execl函数的差别. 这里先进行一些背景知识补充: fork(创建一个新的进程): ...

  4. Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和

    题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...

  5. UVA 10004 Bicoloring(DFS染色)

    题意: 给N个点构成的无环无向图,并且保证所有点对都是连通的. 给每个点染色,要么染成黑要么染成白.问是否存在染色方案使得所有有边相连的点对颜色一定不一样. 是输出 BICOLORABLE 否则输出 ...

  6. sqlldr导入报错:field in data file exceeds maximum length

    检查报错日志提示:field in data file exceeds maximum length REMARK字段设置:varchar2(2000),报错的内容也没有超1000个字符 表中定义的字 ...

  7. Mac sourceTree每次都输入密码

    打开终端 依次输入以下三条命令 curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain - ...

  8. 2020 ICPC 沈阳站 I - Rise of Shadows 题解

    题面看这里 \(PS\):符号 \([\ \rm P\ ]\) 的意义是:当表达式 \(\rm P\) 为真则取值为 \(1\),为假则取值为 \(0\). 题目大意 给你一个一天有 \(H\)​​​ ...

  9. java中使用Process执行linux命令

    代码如下 BufferedReader reader = null; String cmd = "netstat -anp|grep :8080";//命令中有管道符 | 需要如下 ...

  10. ubuntu更換清華軟件源

    打开软件源的编辑sudo gedit /etc/apt/sources.list 软件源: Ubuntu--更改国内镜像源(阿里.网易.清华.中科大) 打開軟件源文件進行修改: 使用 sudo vim ...