原生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 相关文章推荐
用js判断页面是否加载完成实现代码
Dec 11 Javascript
jcrop基本参数一览
Jul 16 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
JavaScript修改浏览器tab标题小技巧
Jan 06 Javascript
javascript实现框架高度随内容改变的方法
Jul 23 Javascript
实例详解angularjs和ajax的结合使用
Oct 22 Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
jQuery仿移动端支付宝键盘的实现代码
Aug 15 jQuery
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
小程序最新获取用户昵称和头像的方法总结
Sep 23 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 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
很让人受教的 提高php代码质量36计
2012/09/05 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
CI框架附属类用法分析
2018/12/26 PHP
js jquery数组介绍
2012/07/15 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
JS hashMap实例详解
2016/05/26 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
微信小程序实现工作时间段选择
2019/02/15 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
简化Python的Django框架代码的一些示例
2015/04/20 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
python清除指定目录内所有文件中script的方法
2015/06/30 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
Python数据类型之List列表实例详解
2019/05/08 Python
Pandas中resample方法详解
2019/07/02 Python
快速查找Python安装路径方法
2020/02/06 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
什么是.net的Remoting技术
2016/07/08 面试题
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
财务检查整改报告
2014/11/06 职场文书
城南旧事读书笔记
2015/06/29 职场文书
护士心得体会范文
2016/01/25 职场文书