原生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 常用操作整理 基础入门篇
Oct 14 Javascript
jQuery 1.8 Release版本发布了
Aug 14 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
Jun 24 Javascript
简单的jquery左侧导航栏和页面选中效果
Aug 21 Javascript
jQuery中:animated选择器用法实例
Dec 29 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
Sep 14 Javascript
网页从弹窗页面单选框传值至父页面代码分享
Sep 29 Javascript
Node.js编写CLI的实例详解
May 17 Javascript
vue中eslintrc.js配置最详细介绍
Dec 21 Javascript
JavaScript查看代码运行效率console.time()与console.timeEnd()用法
Jan 18 Javascript
vue项目添加多页面配置的步骤详解
May 22 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
vue数据双向绑定原理解析(get &amp; set)
2017/03/08 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
Vue 组件修改根实例的数据的方法
2019/04/02 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python自动化报告的输出用例详解
2018/05/30 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
毕业生求职信的经典写法
2014/01/31 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
期末个人总结范文
2015/02/13 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
《日月潭》教学反思
2016/02/20 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
Java 写一个简单的图书管理系统
2022/04/26 Java/Android
nginx设置资源请求目录的方式详解
2022/05/30 Servers