原生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 相关文章推荐
JavaScript面向对象之静态与非静态类
Feb 03 Javascript
jquery 打开窗口返回值实现代码
Mar 04 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 Javascript
Javascript中的call()方法介绍
Mar 15 Javascript
Zabbix添加Node.js监控的方法
Oct 20 Javascript
js实现仿购物车加减效果
Mar 01 Javascript
浅谈Vue SPA 首屏加载优化实践
Dec 15 Javascript
基于vue开发的在线付费课程应用过程
Jan 25 Javascript
vue封装swiper代码实例解析
Oct 08 Javascript
vue 手机物理监听键+退出提示代码
Sep 09 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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编程语言开发动态WAP页面
2006/10/09 PHP
mysql时区问题
2008/03/26 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
vue-router实现组件间的跳转(参数传递)
2017/11/07 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
python多进程控制学习小结
2018/10/31 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
pytorch中图像的数据格式实例
2020/02/11 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
c++工程师面试问题
2013/08/04 面试题
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
计算机网络毕业生自荐信
2013/10/01 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
小学生毕业评语
2014/12/26 职场文书
2015年大学迎新晚会总结
2015/07/16 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
学校学期工作总结
2015/08/13 职场文书
董事长秘书工作总结
2015/08/14 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL