用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也采用 ...
随机推荐
- 数列极限计算中运用皮亚诺Taylor展开巧解
这是讲义里比较精华的几个题目,今晚翻看也是想到了,总结出来(处理k/n2形式). 推广式子如下: 例题如下:
- 架构师之路-redis集群解析
引子 上篇<架构师之路-https底层原理>里我提到了上面的整体视图,文章也介绍了想要真正能在工作中及时正确解决问题的基本功:原理理解透彻.今天以redis集群解析为例介绍一个及时敏锐的发 ...
- Linux上Qt旋转显示
对于嵌入式设备来说用于显示的LCD总是千奇百怪,比如说明明是一个竖屏,但是客户却要当横屏使用,也就是意味着我们需要将整个屏幕上显示的内容旋转90度或者270度. 这个操作对于Android系统来说相当 ...
- webRTC中语音降噪模块ANS细节详解(三)
上篇(webRTC中语音降噪模块ANS细节详解(二))讲了ANS的处理流程和语音在时域和频域的相互转换.本篇开始讲语音降噪的核心部分,首先讲噪声的初始估计以及基于估计出来的噪声算先验信噪比和后验信噪比 ...
- InnoDB存储引擎的锁
InnoDB存储引擎的锁 锁的类型 锁的类型包括: 1. 共享锁(S lock),允许事务读取一行数据 2. 排他锁(X lock),允许事务删除或更新一行数据 锁的兼容性a X S ...
- redis的一般使用和常规配置
https://www.cnblogs.com/HTLucky/p/12027889.html Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANS ...
- mysql数据库导入导出文件sql文件
window下 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u dbuser -p dbname > dbname.sql ...
- oracle 修改表空间名
1.登录使用sys用户登录 sqlplus sys/ as sysdba 2.修改表空间名字 SQL> alter tablespace 旧表空间名 rename to 新表空间名; 表空间已更 ...
- this.$set用法
this.$set()的主要功能是解决改变数据时未驱动视图的改变的问题,也就是实际数据被改变了,但我们看到的页面并没有变化,这里主要讲this.$set()的用法,如果你遇到类似问题可以尝试下,vue ...
- Java之JNDI注入
Java之JNDI注入 About JNDI 0x01 简介 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JND ...