原生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 学习入门篇附实例代码
Mar 16 Javascript
js如何取消事件冒泡
Sep 23 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
js的[defer]和[async]属性
Nov 24 Javascript
js实现图片漂浮效果的方法
Mar 02 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
JavaScript微信定位功能实现方法
Nov 29 Javascript
使用webpack-dev-server处理跨域请求的方法
Apr 18 Javascript
解决vue-cli webpack打包后加载资源的路径问题
Sep 25 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
Jul 05 Javascript
node.js如何操作MySQL数据库
Oct 29 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
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
PHP HTML代码串 截取实现代码
2009/06/29 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
JS 实现Json查询的方法实例
2013/04/12 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python中的exec、eval使用实例
2014/09/23 Python
numpy中索引和切片详解
2017/12/15 Python
python+opencv实现动态物体识别
2018/01/09 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
python 实现图片裁剪小工具
2021/02/02 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
如何提高MySql的安全性
2014/06/19 面试题
公司董事长职责
2013/12/12 职场文书
大学生毕业的自我评价分享
2014/01/02 职场文书
医院节能减排方案
2014/06/13 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
药品开票员岗位职责
2015/04/15 职场文书
婚宴父亲致辞
2015/07/27 职场文书
消防宣传标语大全
2015/08/03 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
Java版 单机五子棋
2022/05/04 Java/Android