原生js实现移动小球(碰撞检测)


Posted in Javascript onDecember 17, 2020

本文实例为大家分享了js实现移动小球的具体代码,供大家参考,具体内容如下

</head>
<style>
 *{margin: 0;
  padding:0;}
 #main{margin: 0px auto;position: relative;}
 #main div{overflow: hidden;position: absolute;width: 50px;height: 50px;opacity: 0.5;
  -moz-border-radius: 50%;-webkit-border-radius: 50%;border-radius: 50%;}
</style>
<body>
 <div id="main">
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
 <div></div>
</div>

 <script>
 var main = document.getElementById('main');
 var circles = main.getElementsByTagName('div');
 var st = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f'];
 var json = [],arr=[],color = [];
 var maxW = 0;
 var maxH = 0;
 var cwidth = circles[0].offsetWidth;
 var cheight = circles[0].offsetHeight;

 //根据浏览器窗口的大小自动调节小球的运动空间
 window.onresize=function(){
  var main = document.getElementById('main');
  maxW=window.innerWidth-circles[0].clientWidth;
  maxH=window.innerHeight-circles[0].clientHeight;
  main.style.width = window.innerWidth+'px';
  main.style.height = window.innerHeight+'px';

 }
 onresize();
 //数组对象的初始化
 for(var i=0;i<circles.length;i++){
  arr=[];
  for(var j=0;j<6;j++){
   color[j] = st[Math.floor(Math.random()*16)];
  }
  arr.x = Math.floor(Math.random()*(maxW+1));//初始x坐标
  arr.y = Math.floor(Math.random()*(maxH+1));//初始y坐标
  arr.cx = arr.x + circles[0].offsetWidth/2; //圆心x坐标
  arr.cy = arr.y + circles[0].offsetHeight/2;//圆心y坐标
  arr.movex = Math.floor(Math.random()*2);//x轴移动方向
  arr.movey = Math.floor(Math.random()*2);//y轴移动方向
  arr.bgolor = '#'+ color.join('');//随机生成一个6位字符串
  arr.speed = 2+Math.floor(Math.random()*5);
  //随机生成一个2~6之间的移动速度(如果设置的改变速度太大,容易造成小球碰撞时两个小球之间有重合,也有可能小球会出界)
  arr.timer = null;//计时器
  arr.index = i;//索引值
  json.push(arr);
  circles[i].style.left = arr.x + 'px';//小球位置初始化
  circles[i].style.top = arr.y + 'px';//小球位置初始化
  circles[i].style.backgroundColor = arr.bgolor;//小球背景颜色初始化
 }
 //碰撞函数
 function crash(a){
  var ball1x = json[a].cx;
  var ball1y = json[a].cy;
  for(var i= 0;i<json.length;i++){
   if(i!=a){
    var ball2x = json[i].cx;
    var ball2y = json[i].cy;
    //圆心距离的平方
    var len = (ball1x-ball2x)*(ball1x-ball2x)+(ball1y-ball2y)*(ball1y-ball2y);
    if(len <= cwidth*cwidth){
    //小球位置的判断,发生碰撞反应
     if(ball1x >ball2x){
      if(ball1y > ball2y){
       json[a].movex=1;
       json[a].movey=1;
      }else if(ball1y < ball2y){
       json[a].movex=1;
       json[a].movey=0;
      }else{
       json[a].movex=1;
      }
     }else if(ball1x < ball2x){
      if(ball1y > ball2y){
       json[a].movex=0;
       json[a].movey=0;
      }else if(ball1y < ball2y){
       json[a].movex=0;
       json[a].movey=1;
      }else{
       json[a].movex=0;
      }
     }else{
      if(ball1y > ball2y){
       json[a].movey=1;
      }else if(ball1y < ball2y){
       json[a].movey=0;
      }
     }
    }
   }

  }
 }
 //移动函数
 function move(circle){
  circle.timer = setInterval(function () {
   if(circle.movex == 1){
    circle.x+=circle.speed;
    if(circle.x+circle.speed >= maxW){//防止小球出界
     circle.x = maxW;
     circle.movex=0;//小球运动方向发生改变
    }
   }else{
    circle.x-=circle.speed;
    if(circle.x-circle.speed <= 0){
     circle.x = 0;
     circle.movex=1;
    }
   }
   if(circle.movey == 1){
    circle.y += circle.speed;
    if(circle.y+circle.speed >= maxH){
     circle.y = maxH;
     circle.movey=0;
    }
   }else{
    circle.y-=circle.speed;
    if(circle.y-circle.speed <= 0){
     circle.y = 0;
     circle.movey=1;
    }
   }
   circle.cx = circle.x + circles[0].offsetWidth/2;//小球每一次运动圆心都会发生改变
   circle.cy = circle.y + circles[0].offsetHeight/2;
   circles[circle.index].style.left = circle.x + 'px';//小球位置重定位
   circles[circle.index].style.top = circle.y + 'px';
   /*console.log('x'+circle.cx+'y'+circle.cy);*/
   crash(circle.index);
  },16);
 }
 //对每一个小球绑定计时器,让小球动起来
 for(var i=0;i<circles.length;i++){
  move(json[i]);
 }
</script>
</body>

效果图:

原生js实现移动小球(碰撞检测)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery移除button的inline onclick事件(已测试及兼容浏览器)
Jan 25 Javascript
jQuery动态地获取系统时间实现代码
May 24 Javascript
JavaScript实现同步于本地时间的动态时间显示方法
Feb 02 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
简单理解Vue条件渲染
Dec 03 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
May 02 Javascript
js编写简单的聊天室功能
Aug 17 Javascript
vue2 设置router-view默认路径的实例
Sep 20 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
js变量声明var使用与不使用的区别详解
Jan 21 Javascript
微信小程序日历插件代码实例
Dec 04 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 #Vue.js
Taro小程序自定义顶部导航栏功能的实现
Dec 17 #Javascript
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
js回到页面指定位置的三种方式
Dec 17 #Javascript
javascript 数组(list)添加/删除的实现
Dec 17 #Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 #Javascript
You might like
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python统计中文字符数量的两种方法
2019/01/31 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python整数对象实现原理详解
2019/07/01 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python for循环及基础用法详解
2019/11/08 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
.NET remoting的两种通道是什么
2016/05/31 面试题
自荐信需注意事项
2014/01/25 职场文书