html小球与边框碰撞反弹,通过JS如何实现多个小球碰撞反弹
这篇文章主要介绍了原生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如何实现多个小球碰撞反弹相关推荐
- js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效
js实现简单的小球与边框碰撞反弹改变运动方向及颜色,并且继续运动的特效 (代码可以直接复制使用,只需要把body中的div的id换成对应的就行,css中可以设置小球的大小和初始位置,修改小球大小之后需 ...
- 华为机试 HJ38 求小球落地5次后所经历的路程和第5次反弹的高度【Java实现】
HJ38 求小球落地5次后所经历的路程和第5次反弹的高度 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? package c ...
- 小球落地java_JAVA------------------华为机试----------------求小球落地5次后所经历的路程和第5次反弹的高度...
求小球落地5次后所经历的路程和第5次反弹的高度 题目描述 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? /** * 统计出 ...
- ac2100 反弹shell无法粘贴_记一次突破反弹shell
背景 某天闲着无聊,小伙伴发来一个某网站,说只能执行命令,不能反弹shell. 测试 对着目标站点一顿测试. 发现确实存在shiro反序列化,并且存在可以利用的gadget.利用 发现确实可以执行命令 ...
- ae制作小球轨迹运动_利用Ae制作出自由落地运动小球的详细步骤
各位知道在Ae中如何制作出自由落地运动小球呢?不太会操作的用户可以去下文学习下利用Ae制作出自由落地运动小球的详细步骤. 我们先准备好小球图片素材,背景颜色为黑色.导入素材,新建合成.将素材拖拽的合成 ...
- js小球与边框碰撞反弹_四叉树在碰撞检测中的应用
缘起 <你被追尾了>中预告了加速碰撞检测的算法--四叉树(for 2D),所以本文就来学习一下. 分析 首先是为什么要使用四叉树进行优化,其实<你被追尾了>中已经说了,这里简单 ...
- html背景边框特效代码,纯JS实现动态边框特效
HtmlCssJs ^-^正常的边框 ^-^更慢的边框 ^-^更快的边框 ^-^图片边框 ^-^更细的边框 附赠的圆形 body { flex-wrap:wrap; flex:1 } .flex { ...
- 【华为OD机试Python实现】HJ38 求小球落地5次后所经历的路程和第5次反弹的高度(中等)
文章目录 题目描述 输入描述: 输出描述: 示例1 参考代码 题目描述 假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? 数据 ...
- p5.js实现动态旋转的小球
实验要求: 从给出的参考资料中的"动态图形艺术"中选取不少于1幅作品,用编程方式临摹并进行拓展.编程语言推荐p5,processing.写一篇文章发表为博文.推文等形式,描述从原作 ...
- html,css,js,反弹的js效果
实现效果: 实现代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
最新文章
- js调用数科阅读器_阅读大型 JavaScript 源码时有什么好用的工具?
- 你不就是加了 2 行代码,为什么要用 2 天?
- SAP Spartacus build error之后的retrigger方式
- 微信小程序php实现登陆的代码,微信小程序实现微信登录
- SpringCloud(九):sidecar异构微服务
- C# DataGridView 动态添加列和调整列顺序
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何修改某个轴的数值单位
- NET在后置代码中输入JS提示语句(背景不会变白)
- 信用卡号校验java_ES reduce 一行代码解决信用卡号验证问题
- HFSS天线设计过程学习笔记
- 流程工业MES管理系统有什么特点
- JVM高级特性与实践(九):类加载器 与 双亲委派模式(自定义类加载器源码探究ClassLoader)
- Gtest:死亡测试
- 计算机女学霸,邹楚杭:计算机学院走出来的才女学霸
- html个个代码的意思,网页HTML中各个代码意思大全
- C#使用德卡T10读取社报告卡基本信息
- 夜来风雨声,MapReduce知多少?
- 2019高校微信小程序开发大赛获奖作品——《brain头脑智序》
- 国产化适配之人大金仓数据库(二)数据迁移
- 彩信下载不了怎么回事?
热门文章
- 北斗芯片是如何决定着北斗产业的未来?
- M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network AAAI2019
- SPEOS | SPEOS HUD 设计功能
- LCD12864 液晶显示-汉字及自定义显示(并口)
- 简述多媒体计算机的特点,多媒体技术的主要特点
- 根据年、月、周、日设置时间节点的日期工具类
- 4款FTP搜索引擎比专业
- 离散数学-第八章图论及其应用
- 宿舍管理系统c语言程序代码,宿舍管理系统(c语言版)
- Flash倒计时+写在自定义类+写在关键帧