这篇文章主要介绍了原生JS实现多个小球碰撞反弹效果,结合完整实例形式分析了javascript实现小球碰撞的相关数值计算、随机数生成、事件响应等操作技巧,需要的朋友可以参考下

本文实例讲述了原生JS实现多个小球碰撞反弹效果。分享给大家供大家参考,具体如下:

实现思路:小球的移动,是通过改变小球的left和top值来改变,坐标分别为(x,y)当x/y值加到最大,即加到父级的宽度或者高度时,使x值或者y值减小,同理当x值或者y值减到最小时,同样的使x值或者y值增加,以上的思路可以实现小球的碰壁反弹

小球与小球之间的碰撞,要判断小球在被撞小球的哪个方向,从而判断小球该向哪个方向移动,同样的改变小球的坐标值,来实现小球的反弹

实现代码:

小球碰撞

* {

margin: 0;

padding: 0;

}

#wrap {

height: 800px;

width: 1300px;

border: 1px solid red;

/*小球设置相对定位*/

position: relative;

margin: 0 auto;

overflow: hidden;

}

p {

width: 40px;

height: 40px;

border-radius: 50%;

background-color: red;

position: absolute;

top: 0;

left: 0;

color: white;

font-size: 25px;

text-align: center;

line-height: 40px;

}

/**

* 生成并返回一个从m到n全区间的随机数

* @param {Object} m

* @param {Object} n

*/

function randomNum(m, n) {

return Math.floor(Math.random() * (n - m + 1) + m);

}

/**

* 生成一个随机颜色,并返回rgb字符串值

*/

function randomColor() {

var r = randomNum(0, 255);

var g = randomNum(0, 255);

var b = randomNum(0, 255);

return "rgb(" + r + "," + g + "," + b + ")";

}

//获得wrapp

var wrapp = document.getElementById("wrap");

//定义数组存储所有的小球

var balls = [];

//生成小球函数

function createBalls() {

for (var i = 0; i < 20; i++) {

var ball = document.createElement("p");

//随机小球起始的X坐标和小球的Y坐标

ball.x = randomNum(0, 1200);

ball.y = randomNum(0, 700);

//随机小球的移动速度

ball.speed = randomNum(2, 5);

//随机小球移动的方向

if (Math.random() - 0.5 > 0) {

ball.xflag = true;

} else {

ball.xflag = false;

}

if (Math.random() - 0.5 > 0) {

ball.yflag = true;

} else {

ball.yflag = false;

}

//随机小球的背景颜色

ball.style.backgroundColor = randomColor();

ball.innerHTML = i + 1;

//将小球插入当wrapp中

wrapp.appendChild(ball);

//将所有的小球存储到数组中

balls.push(ball);

}

}

createBalls();

//小球移动函数,判断小球的位置

function moveBalls(ballObj) {

setInterval(function() {

ballObj.style.top = ballObj.y + "px";

ballObj.style.left = ballObj.x + "px";

//判断小球的标志量,对小球作出相应操作

if (ballObj.yflag) {

//小球向下移动

ballObj.y += ballObj.speed;

if (ballObj.y >= 800 - ballObj.offsetWidth) {

ballObj.y = 800 - ballObj.offsetWidth;

ballObj.yflag = false;

}

} else {

//小球向上移动

ballObj.y -= ballObj.speed;

if (ballObj.y <= 0) {

ballObj.y = 0;

ballObj.yflag = true;

}

}

if (ballObj.xflag) {

//小球向右移动

ballObj.x += ballObj.speed;

if (ballObj.x >= 1300 - ballObj.offsetHeight) {

ballObj.x = 1300 - ballObj.offsetHeight;

ballObj.xflag = false;

}

} else {

//小球向左移动

ballObj.x -= ballObj.speed;

if (ballObj.x <= 0) {

ballObj.x = 0;

ballObj.xflag = true;

}

}

crash(ballObj);

}, 10);

}

var x1, y1, x2, y2;

//碰撞函数

function crash(ballObj) {

//通过传过来的小球对象来获取小球的X坐标和Y坐标

x1 = ballObj.x;

y1 = ballObj.y;

for (var i = 0; i < balls.length; i++) {

//确保不和自己对比

if (ballObj != balls[i]) {

x2 = balls[i].x;

y2 = balls[i].y;

//判断位置的平方和小球的圆心坐标的关系

if (Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) + 800 <= Math.pow(ballObj.offsetWidth + balls[i].offsetWidth, 2)) {

//判断传过来的小球对象,相对于碰撞小球的哪个方位

if (ballObj.x < balls[i].x) {

if (ballObj.y < balls[i].y) {

//小球对象在被碰小球的左上角

ballObj.yflag = false;

ballObj.xflag = false;

} else if (ballObj.y > balls[i].y) {

//小球对象在被碰小球的左下角

ballObj.xflag = false;

ballObj.yflag = true;

} else {

//小球对象在被撞小球的正左方

ballObj.xflag = false;

}

} else if (ballObj.x > balls[i].x) {

if (ballObj.y < balls[i].y) {

//小球对象在被碰撞小球的右上方

ballObj.yflag = false;

ballObj.xflag = true;

} else if (ballObj.y > balls[i].y) {

//小球对象在被碰撞小球的右下方

ballObj.xflag = true;

ballObj.yflag = true;

} else {

//小球对象在被撞小球的正右方

ballObj.xflag = true;

}

} else if (ballObj.y > balls[i].y) {

//小球对象在被撞小球的正下方

ballObj.yflag = true;

} else if (ballObj.y < balls[i].y) {

//小球对象在被撞小球的正上方

ballObj.yflag = false;

}

}

}

}

}

for (var i = 0; i < balls.length; i++) {

//将所有的小球传到函数中,来实现对小球的移动

moveBalls(balls[i]);

}

运行效果:

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

html小球与边框碰撞反弹,通过JS如何实现多个小球碰撞反弹相关推荐

  1. js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效

    js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效 (代码可以直接复制使用,只需要把body中的div的id换成对应的就行,css中可以设置小球的大小和初始位置,修改小球大小之后需 ...

  2. 华为机试 HJ38 求小球落地5次后所经历的路程和第5次反弹的高度【Java实现】

    HJ38 求小球落地5次后所经历的路程和第5次反弹的高度 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? package c ...

  3. 小球落地java_JAVA------------------华为机试----------------求小球落地5次后所经历的路程和第5次反弹的高度...

    求小球落地5次后所经历的路程和第5次反弹的高度 题目描述 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? /** * 统计出 ...

  4. ac2100 反弹shell无法粘贴_记一次突破反弹shell

    背景 某天闲着无聊,小伙伴发来一个某网站,说只能执行命令,不能反弹shell. 测试 对着目标站点一顿测试. 发现确实存在shiro反序列化,并且存在可以利用的gadget.利用 发现确实可以执行命令 ...

  5. ae制作小球轨迹运动_利用Ae制作出自由落地运动小球的详细步骤

    各位知道在Ae中如何制作出自由落地运动小球呢?不太会操作的用户可以去下文学习下利用Ae制作出自由落地运动小球的详细步骤. 我们先准备好小球图片素材,背景颜色为黑色.导入素材,新建合成.将素材拖拽的合成 ...

  6. js小球与边框碰撞反弹_四叉树在碰撞检测中的应用

    缘起 <你被追尾了>中预告了加速碰撞检测的算法--四叉树(for 2D),所以本文就来学习一下. 分析 首先是为什么要使用四叉树进行优化,其实<你被追尾了>中已经说了,这里简单 ...

  7. html背景边框特效代码,纯JS实现动态边框特效

    HtmlCssJs ^-^正常的边框 ^-^更慢的边框 ^-^更快的边框 ^-^图片边框 ^-^更细的边框 附赠的圆形 body { flex-wrap:wrap; flex:1 } .flex { ...

  8. 【华为OD机试Python实现】HJ38 求小球落地5次后所经历的路程和第5次反弹的高度(中等)

    文章目录 题目描述 输入描述: 输出描述: 示例1 参考代码 题目描述 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? 数据 ...

  9. p5.js实现动态旋转的小球

    实验要求: 从给出的参考资料中的"动态图形艺术"中选取不少于1幅作品,用编程方式临摹并进行拓展.编程语言推荐p5,processing.写一篇文章发表为博文.推文等形式,描述从原作 ...

  10. html,css,js,反弹的js效果

    实现效果: 实现代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

最新文章

  1. js调用数科阅读器_阅读大型 JavaScript 源码时有什么好用的工具?
  2. 你不就是加了 2 行代码,为什么要用 2 天?
  3. SAP Spartacus build error之后的retrigger方式
  4. 微信小程序php实现登陆的代码,微信小程序实现微信登录
  5. SpringCloud(九):sidecar异构微服务
  6. C# DataGridView 动态添加列和调整列顺序
  7. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何修改某个轴的数值单位
  8. NET在后置代码中输入JS提示语句(背景不会变白)
  9. 信用卡号校验java_ES reduce 一行代码解决信用卡号验证问题
  10. HFSS天线设计过程学习笔记
  11. 流程工业MES管理系统有什么特点
  12. JVM高级特性与实践(九):类加载器 与 双亲委派模式(自定义类加载器源码探究ClassLoader)
  13. Gtest:死亡测试
  14. 计算机女学霸,邹楚杭:计算机学院走出来的才女学霸
  15. html个个代码的意思,网页HTML中各个代码意思大全
  16. C#使用德卡T10读取社报告卡基本信息
  17. 夜来风雨声,MapReduce知多少?
  18. 2019高校微信小程序开发大赛获奖作品——《brain头脑智序》
  19. 国产化适配之人大金仓数据库(二)数据迁移
  20. 彩信下载不了怎么回事?

热门文章

  1. 北斗芯片是如何决定着北斗产业的未来?
  2. M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network AAAI2019
  3. SPEOS | SPEOS HUD 设计功能
  4. LCD12864 液晶显示-汉字及自定义显示(并口)
  5. 简述多媒体计算机的特点,多媒体技术的主要特点
  6. 根据年、月、周、日设置时间节点的日期工具类
  7. 4款FTP搜索引擎比专业
  8. 离散数学-第八章图论及其应用
  9. 宿舍管理系统c语言程序代码,宿舍管理系统(c语言版)
  10. Flash倒计时+写在自定义类+写在关键帧