用JS实现方块碰撞
首先我们应用上次的内容——方块拖拽,利用方块拖拽来让两个方块进行碰撞。
我们可以先定义两个正方形方块,红色的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实现方块碰撞的更多相关文章
- 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 ...
- js实现方块的碰撞检测
文章地址:https://www.cnblogs.com/sandraryan/ 个人感觉.方块的碰撞检测比圆形麻烦~~ <!DOCTYPE html> <html lang=&qu ...
- js实现小球碰撞游戏
效果图: 效果图消失只是截的gif图的问题 源码: <!DOCTYPE html> <html lang="en"> <head> <m ...
- (原)用pixi.js 实现 方块阵点击后原地自转效果
源码 各位,请教一个问题,我这个还有BUG,我是想实现,点击一下可以 停止转动,然后再点一下重新转动.而不是一直加速,有没有什么好办法? PS:问题已经解决,谢谢评论的大神@Antineutrino ...
- js 拖拽 碰撞 + 重力 运动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- three.js raycaster射线碰撞的坑 (当canvas大小 不是屏幕大小是解决拾取物体的办法)
这里只是记录一下坑,方便查阅,内容主要援引自:three.js Raycaster 射线拾取 canvas不占满整屏时射线拾取存在偏差 1. 世界坐标系: 世界坐标系位于屏幕的中心(0,0,0),往右 ...
- Canvas+Js制作动量守恒的小球碰撞
目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,c ...
- 前端学习:JS面向对象知识学习(图解)
前端学习:JS面向对象知识学习(图解) 前端学习:JS(面向对象)代码笔记 JS面向对象图解知识全览 创建类和对象 方式1:使用Object()函数 方式2:使用自变量 方式3:使用工厂函数 创建多个 ...
- VGA详解及色块碰撞示例
引言 VGA:video Graphics array,视频图形阵列,阴极射线显像管(CRT)显示器时代产物,很多老显卡.笔记本电脑.投影仪所用接口,已经比较过时. CRT是模拟设备,所以VGA也采用 ...
随机推荐
- Linux入门需要搞清楚的思路问题
很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...
- Nginx(二):Nginx的四层(L4)和七层(L7)负载均衡
OSI七层模型 和 TCP/IP四层模型 四层负载均衡( L4 Load Balancing ) 四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内 ...
- (转)linux下execl和system函数
linux下,system函数和execl函数都是用于执行一条系统命令.今天仔细看了system函数的实现,想找出和execl函数的差别. 这里先进行一些背景知识补充: fork(创建一个新的进程): ...
- Luogu P2822 [NOIp2016提高组]组合数问题 | 数学、二维前缀和
题目链接 思路:组合数就是杨辉三角,那么我们只要构造一个杨辉三角就行了.记得要取模,不然会爆.然后,再用二维前缀和统计各种情况下组合数是k的倍数的方案数.询问时直接O(1)输出即可. #include ...
- UVA 10004 Bicoloring(DFS染色)
题意: 给N个点构成的无环无向图,并且保证所有点对都是连通的. 给每个点染色,要么染成黑要么染成白.问是否存在染色方案使得所有有边相连的点对颜色一定不一样. 是输出 BICOLORABLE 否则输出 ...
- sqlldr导入报错:field in data file exceeds maximum length
检查报错日志提示:field in data file exceeds maximum length REMARK字段设置:varchar2(2000),报错的内容也没有超1000个字符 表中定义的字 ...
- Mac sourceTree每次都输入密码
打开终端 依次输入以下三条命令 curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain - ...
- 2020 ICPC 沈阳站 I - Rise of Shadows 题解
题面看这里 \(PS\):符号 \([\ \rm P\ ]\) 的意义是:当表达式 \(\rm P\) 为真则取值为 \(1\),为假则取值为 \(0\). 题目大意 给你一个一天有 \(H\) ...
- java中使用Process执行linux命令
代码如下 BufferedReader reader = null; String cmd = "netstat -anp|grep :8080";//命令中有管道符 | 需要如下 ...
- ubuntu更換清華軟件源
打开软件源的编辑sudo gedit /etc/apt/sources.list 软件源: Ubuntu--更改国内镜像源(阿里.网易.清华.中科大) 打開軟件源文件進行修改: 使用 sudo vim ...