文章地址:https://www.cnblogs.com/sandraryan/

碰撞检测这个东西写小游戏挺有用der~~~

注释写的还挺全,所以就不多说了,看注释

这是页面结构。wrap存放生成的小球

box是用来检测的元素

<div class="wrap">
<!-- 用于做碰撞检测的一个元素 -->
<div class="box"></div>
</div>

css:

 body {
margin:;
padding:;
} .wrap {
width: 100vw;
height: 100vh;
background-color: rgb(228, 243, 248);
} .box {
width: 70px;
height: 70px;
background-color: green;
border-radius: 50%;
position: fixed;
top:;
left:;
} .wrap .item {
position: fixed;
border-radius: 50%;
}

js

let wrap = document.querySelector('.wrap');
let box = document.querySelector('.box');
// 随机数函数
function rn(a, b) {
return Math.round(Math.random() * (a - b) + b);
}
// 创建其他小球的函数
function create() {
// 创建div
let el = document.createElement('div');
// 从20-100之间随机一个数作为小球的宽高(要是圆形,所以宽高相同)
let w = rn(20, 80);
el.style.width = w + 'px';
el.style.height = w + 'px';
// 设置top left值 该元素css有固定定位
//可以选择把最大值设置为当前屏幕/父级宽高,然后减去元素最大随即宽度(80)
el.style.top = rn(0, 500) + 'px';
el.style.left = rn(0, 1200) + 'px';
// 追加item作为类名
el.className = 'item';
// 获取0-1之间的随机数并取小数点后一位
let opa = Math.random().toFixed(1);
// 设置随机颜色
// 不能先给一个变量随机0-254,然后拼接变量,拼接出来red green blue颜色都一样
el.color = 'rgba(' + rn(0, 254) + ',' + rn(0, 254) + ',' + rn(0, 254) + ',' + opa + ')';
el.style.background = el.color;
// 元素追加给wrap
wrap.appendChild(el);
}
// 利用循环创建20个小球
function balls() {
for (let i = 0; i < 20; i++) {
create();
}
}
balls();
// box半径(理论上写一个就好,是个正方形画出来的圆嘛~)
let r1 = box.offsetWidth / 2;
// 获取创建的小球们
let item = document.querySelectorAll('.item');
// console.log(item);
// 文档注册鼠标移动事件
document.onmousemove = function (ev) {
let e = ev || event;
// 获取浏览器宽度/高度,减去要检测的盒子宽高一半
let x = e.clientX - r1;
let y = e.clientY - r1;
// 设为要拿去做检测的盒子左边,上边
// 鼠标移动的时候改变要拿去做碰撞检测的元素的top left值(改变位置,让他动起来,动的范围是整个可视页面-自己宽高,不会卡一半在外面)
box.style.left = x + 'px';
box.style.top = y + 'px';
for (let i = 0; i < item.length; i++) {
// item的半径
let r2 = item[i].offsetHeight / 2;
// 生成的小球的左边+半径,减用来检测的元素的左边+半径(两个球圆心距)
let leftC = item[i].offsetLeft + r2 - (box.offsetLeft + r1);
// 生成的小球上边加半径-检测小球的上边加半径
let topC = item[i].offsetTop + r2 - (box.offsetTop + r1);
// pow() 方法可返回 x 的 y 次幂的值。
// sqrt() 方法可返回一个数的平方根。
// 水平方向圆心距的2次幂 + 垂直方向的圆心距2次幂,的平方根(勾股定理?)
let dis = Math.sqrt(Math.pow(leftC, 2) + Math.pow(topC, 2));
// 求出来的值小于检测的两个球的半径的和,碰撞上了,生成的小球变色
if (dis < r1 + r2) {
item[i].style.background = 'red';
} else {
item[i].style.background = item[i].color;
}
}
};

over

js实现圆形的碰撞检测的更多相关文章

  1. js绘制圆形时钟

    纯js制作圆形时钟 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

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

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

  3. 写一些封装part1 (事件绑定移除,圆形矩形碰撞检测)

    var EventHandle = { addEvent:function(ele,type,handle){ if (ele.addEventListener) { ele.addEventList ...

  4. 28-THREE.JS 扇形圆形

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  5. 用HTML、CSS、JS制作圆形进度条(无动画效果)

    逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果:   然后我们再用一个比底圆小的圆去覆盖这个大 ...

  6. cocos2dx - JS - 碰撞检测

    碰撞检测是游戏的一个重要组成部分,我们这里使用一种最简单的方法,就是获取精灵的矩形碰撞框.当然圆形的碰撞检测也比较简单,其他形状就复杂多了.首先是如何获取矩形碰撞框:var hBox=this.her ...

  7. Canvas动画基础之碰撞检测

    在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS.Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术 ...

  8. Html5 Canvas动画基础碰撞检测的实现

    在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS.Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术 ...

  9. 【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)

    1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如 ...

随机推荐

  1. Django多业务模块的写法

    from django.shortcuts import render # Create your views here. from django.shortcuts import HttpRespo ...

  2. 7. 18 test 砍树题解

    (题面保密,内部人员可览) 首先观察题面,可得出如下公式 ∑(ceil(a[i] /d)*d−a[i])≤k 其中,ceil(a[i] /d)表示在需要被砍伐之前所经过的轮数,ceil函数是为了保证一 ...

  3. Android平台本地(离线)打包指南 - Android Studio

    预备环境 AndroidStudio开发环境,要求安装Android4.0或以上(API 14)SDK. 下载HBuilder离线打包Android版SDK(5+ SDK下载). 离线打包SDK目录说 ...

  4. 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度

    题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...

  5. 对象无法注册到Spring容器中,手动从spring容器中拿到我们需要的对象

    当前对象没有注册到spring容器中,此时无法new object()  的方式创建对象,否则所有@Autowired 注入的对象都为null; 处理方式: 手动创建一个类@Component注册到S ...

  6. Directx11教程(42) 纹理映射(12)-简单的bump mapping

    原文:Directx11教程(42) 纹理映射(12)-简单的bump mapping        有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候 ...

  7. Directx11教程40 纹理映射(10)

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

  8. oracle如何看审计的结果

    1)数据库初始化参数文件中AUDIT_TRAIL=OS时,审计记录存在操作系统的文件中. UNIX系统的话,默认存在“$oracle_home/rdbms/audit/” 目录下. If you ha ...

  9. 全球首个百万IOPS云盘即将商业化 阿里云推出超高性能云盘ESSD

    近日,在经过近半年的上线公测后,阿里云全球首个跨入IOPS百万时代的云盘——ESSD即将迎来商业化,单盘IOPS高达100万,这是阿里云迄今为止性能最强的企业级块存储服务. 搭配ECS云服务器使用, ...

  10. Laravel 登录后清空COOKIE 方法

    需求 在Laravel 登陆立即清空保存的COOKIE数组 实现 # Http/Controllers/Auth/LoginController.php public function redirec ...