js 实现碰撞检测的示例


Posted in Javascript onOctober 28, 2020

碰撞检测

目录

  • 代码实例
  • 与简易拖拽的差异
  • 下载源码链接 

代码实例

<div id="box" style="background: #334;width: 100px;height: 100px;position: absolute;cursor: move;z-index: 999;"></div>
<div id="box2" style="background: green;width: 100px;height: 100px;position: absolute;top: 200px;left: 500px;"></div>

(function () {
	var dragging = false
	var boxX, boxY, mouseX, mouseY, offsetX, offsetY
	var box = document.getElementById('box')
	var box2 = document.getElementById('box2')
	var box2X, box2Y

	// 鼠标按下的动作
	box.onmousedown = down
	// 鼠标的移动动作
	document.onmousemove = move
	// 释放鼠标的动作
	document.onmouseup = up

	// 鼠标按下后的函数,e为事件对象
	function down(e) {
		dragging = true
		
		// 获取元素所在的坐标
		boxX = box.offsetLeft
		boxY = box.offsetTop

		// 获取元素box2所在的坐标
		box2X = box2.offsetLeft
		box2Y = box2.offsetTop

		// 获取鼠标所在的坐标
		mouseX = parseInt(getMouseXY(e).x)
		mouseY = parseInt(getMouseXY(e).y)

		// 鼠标相对元素左和上边缘的坐标
		offsetX = mouseX - boxX
		offsetY = mouseY - boxY
	}

	// 鼠标移动调用的函数
	function move(e){
		if (dragging) {
			// 获取移动后的元素的坐标
			var x = getMouseXY(e).x - offsetX
			var y = getMouseXY(e).y - offsetY

			// 计算可移动位置的大小, 保证元素不会超过可移动范围
			var width = document.documentElement.clientWidth - box.offsetWidth
			var height = document.documentElement.clientHeight - box.offsetHeight

			// min方法保证不会超过右边界,max保证不会超过左边界
			x = Math.min(Math.max(0, x), width)
			y = Math.min(Math.max(0, y), height)

			// 给元素及时定位
			box.style.left = x + 'px'
			box.style.top = y + 'px'

			// 碰撞检测
			// x坐标值的范围判断,y坐标值的范围判断
			var judge_x = (x >= box2X - box2.offsetWidth) && (x <= box2X + box2.offsetWidth)
			var judge_y = (y >= box2Y - box2.offsetHeight) && (y <= box2Y + box2.offsetHeight)
			if (judge_x && judge_y) {
				console.log("碰撞到")
			}
		}
	}

	// 释放鼠标的函数
	function up(e){
		dragging = false
	}

	// 函数用于获取鼠标的位置
	function getMouseXY(e){
		var x = 0, y = 0
		e = e || window.event
		
		if (e.pageX) {
			x = e.pageX
			y = e.pageY
		} else {
			x = e.clientX + document.body.scrollLeft - document.body.clientLeft
			y = e.clientY + document.body.scrollTop - document.body.clientTop
		}
		return {
			x: x,
			y: y
		}
	}
})()

与简易拖拽的差异

碰撞检测

// 碰撞检测
// x坐标值的范围判断,y坐标值的范围判断
var judge_x = (x >= box2X - box2.offsetWidth) && (x <= box2X + box2.offsetWidth)
var judge_y = (y >= box2Y - box2.offsetHeight) && (y <= box2Y + box2.offsetHeight)
if (judge_x && judge_y) {
	console.log("碰撞到")
}

下载源码链接

星辉的Github

以上就是js 实现碰撞检测的示例的详细内容,更多关于js 碰撞检测的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
用javascript实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
Mar 02 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
简单了解vue 插值表达式Mustache
Jul 22 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 #Javascript
vue用ant design中table表格,点击某行时触发的事件操作
Oct 28 #Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 #Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 #Javascript
js实现详情页放大镜效果
Oct 28 #Javascript
用js实现放大镜效果
Oct 28 #Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 #Javascript
You might like
一步一步学习PHP(3) php 函数
2010/02/15 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
Python try except else使用详解
2021/01/12 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
北大青鸟学生求职信
2013/09/24 职场文书
市场部专员岗位职责
2013/11/30 职场文书
个人委托书怎么写
2014/04/04 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
工作感言一句话
2015/08/01 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
56句经典英文座右铭
2019/08/09 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
uniapp 微信小程序 自定义tabBar 导航
2022/04/22 Javascript