js实现圆形的碰撞检测

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

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

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

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

box是用来检测的元素

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

css:

 body {
            margin: 0;
            padding: 0;
        }

        .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: 0;
            left: 0;
        }

        .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

原文地址:https://www.cnblogs.com/sandraryan/p/11719475.html

时间: 2024-08-28 21:42:15

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

js绘制圆形时钟

纯js制作圆形时钟 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin:0; padding:0; } body{ background: grey; } .box{ width:320px; height: 320px; borde

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

逻辑 1.首先有一个圆:蓝色的纯净的圆,效果: 2.再来两个半圆,左边一个,右边一个将此蓝色的圆盖住,效果: 此时将右半圆旋转60°,就会漏出底圆,效果: 然后我们再用一个比底圆小的圆去覆盖这个大圆就可以出进度条效果了 代码: <style>     /*支持IE9及以上*/    .circle-bar {margin: 20px; font-size:200px; width: 1em; height: 1em; position: relative;  background-color:

简单圆形碰撞检测

整理以前的文件时看到之前写过的圆形的碰撞检测,简单记录下. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <canvas id="cav" width="500" height=&quo

cocos2d滑动碰撞检测的实现

最近在做一个类似切水果的小游戏,需要检测手在屏幕上是否划到了园形的精灵. 对于圆形的碰撞检测还是很容易的:当触点到圆心的距离小于等于圆的半径时,结果为真. void MGame::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { CCPoint p1 = spr_ball_->convertTouchToNodeSpaceAR(pTouch);//将pTouch转换为以spr_ball为原点的坐标 if (ccpDistance(p1, ccp(0

零基础HTML5游戏制作教程 第5章 碰撞检测

第5章 碰撞检测 几乎所有的游戏都需要碰撞检测.比如<贪吃蛇>,你需要检测蛇的前端是不是已经碰到了它的尾巴:比如<俄罗斯方块>,你需要检查方块是不是已经碰到了底部:比如<英雄联盟>,你需要判断adc的子弹或魔法是不是已经碰到了对方. 其实要做好碰撞检测是很难的,尤其是对于3d游戏或者图形复杂的2d游戏来说. 当然,对于简单图形来说,碰撞检测还是比较容易的,本章将分别介绍圆形的碰撞检测,矩形的碰撞检测,以及逻辑碰撞检测. 一,圆形碰撞检测 圆形间碰撞检测的原理是最简单的,

java 实现精确碰撞检测。

cnmm22 原创. [http://blog.csdn.net/cnmm22/article/details/45220551] 用我的方法,你可以在java 里实现精确的斜角矩形,平行四边形,不规则矩形,不规则多边形与圆形的碰撞检测. 我们知道,在java 里有一个类,x.getRect().intersects(x1.getRect() 可以实现规则矩形的碰撞检测: 这是无法容忍的"碰撞检测".这不是我要的游戏效果. 在使我的方法后: cnmm22 原创,转载请随便. 实现方法:

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

1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如反思考虑两个矩形之间不发生碰撞的几种情况.其实两个矩形不发生碰撞的情况就上下左右这四种. 下面通过实例项目来完成对应的四种判定. 先看实例效果图: 新建项目,游戏框架为 SurfaceView 游戏框架,修改 MySurfaceView 类如下: package com.example.ex4_15

用javascript 面向对象制作坦克大战(三)

之前,我们完成了坦克的移动和地图的绘制,这次我们来完成碰撞检测和炮弹的发射. 上代码前来张最新的类图: 3. 碰撞检测 前面我们已经完成了坦克的移动和地图的绘制,下面我们开始写碰撞检测. 3.1    创建碰撞检测对象 我们创建一个对象来做碰撞检测,由于碰撞检测都是在对象移动的时候进行的所以我们让Mover继承我们的碰撞对象. HitTestObject.js:   这里我们把之前写的地图二维数组对象充分利用上了.通过对象x,y坐标取对应的地图对象,再根据属性判断是否可被穿过,是否已被占用. 3

2D物理引擎--开坑篇

你们还记力学和向量吗?有了这两宝就可以写物理引擎了诶~给读书无用论一个漂亮的耳光. 最近闲来无事,一拍脑门,不如写一个 2D 的物理引擎吧.自己刚好会一门图形编程的框架– QtQuick ,于是决定使用 QtQuick+JavaScript 写一个简单的 2D 物理引擎,支持圆形的碰撞检测与碰撞反应. 虽然网络上有提供一些文章介绍怎么做一个简单的 2D 物理引擎, 例如: 为 JavaScript 游戏构建一个简单的 2D 物理引擎 但是为了构造一个简单的 2D 物理引擎,至少需要具备如下知识: