原生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 基础知识 被自己遗忘的
Oct 15 Javascript
深入理解JavaScript系列(13) This? Yes,this!
Jan 18 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
Jul 02 Javascript
js 实现浏览历史记录示例
Apr 20 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
Dec 18 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
Jun 07 Javascript
手机端实现Bootstrap简单图片轮播效果
Oct 13 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
vue2.0 datepicker使用方法
Feb 04 Javascript
详解es6超好用的语法糖Decorator
Aug 01 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
Dec 02 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
2021年最新CPU天梯图
2021/03/04 数码科技
PHP读取xml方法介绍
2013/01/12 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
jQuery使用zTree插件实现树形菜单和异步加载
2016/02/25 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
javascript基础知识讲解
2017/01/11 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
聚美优品恶搞广告词
2014/03/14 职场文书
浅谈Python中的正则表达式
2021/06/28 Python
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS