JS碰撞运动实现方法详解


Posted in Javascript onDecember 15, 2016

本文实例分析了JS碰撞运动实现方法。分享给大家供大家参考,具体如下:

描述:撞到目标点弹回来(速度反转)

一、无重力的漂浮div

var div1=document.getElementById("div1");
var iSpeedX=6;
var iSpeedY=8;
setInterval(function(){
  var l=div1.offsetLeft+iSpeedX;
  var t=div1.offsetTop+iSpeedY;
  if(t>=document.documentElement.clientHeight-div1.offsetHeight){
    iSpeedY*=-1; //速度反向
    t=document.documentElement.clientHeight-div1.offsetHeight; //超出下边界时,把它拉回到下边界,不然右边滚动条会闪动出现一下
  }
  else if(t<=0){
    iSpeedY*=-1;
    t=0;
  }
  if(l>=document.documentElement.clientWidth-div1.offsetWidth){
    iSpeedX*=-1;
    l=document.documentElement.clientWidth-div1.offsetWidthl;
  }
  else if(l<=0){
    iSpeedX*=-1;
    l=0;
  }
  div1.style.left=l+'px';
  div1.style.top=t+'px';
},30);

二、碰撞+重力

所谓重力就是Y轴的速度不断增加

setInterval(function(){
  iSpeedY+=3;
  var l=div1.offsetLeft+iSpeedX;
  var t=div1.offsetTop+iSpeedY;
  if(t>=document.documentElement.clientHeight-div1.offsetHeight){
    iSpeedY*=-0.8;
    iSpeedX*=0.8; //横向速度也要变慢,否则碰到地面时会停不下来
    t=document.documentElement.clientHeight-div1.offsetHeight;
  }
  else if(t<=0){
    iSpeedY*=-1;
    iSpeedX*=0.8;
    t=0;
  }
  if(l>=document.documentElement.clientWidth-div1.offsetWidth){
    iSpeedX*=-0.8;
    l=document.documentElement.clientWidth-div1.offsetWidthl;
  }
  else if(l<=0){
    iSpeedX*=-0.8;
    l=0;
  }
  if(Math.abs(iSpeedX)<1){ //解决小数的问题,因为假如速度是小数,正的没问题,100(iSpeed=0.5)-->100.5-->100,负的100(iSpeed=-0.5)--->99.5-->99,可能会出现x轴反向时滑行
    iSpeedX=0;
  }
  if(Math.abs(iSpeedY)<1){
    iSpeedY=0;
  }
  div1.style.left=l+'px';
  div1.style.top=t+'px';
},30);

三、碰撞+重力+拖拽

window.onload=function ()
{
  var oDiv=document.getElementById('div1');
  var lastX=0;
  var lastY=0;
  oDiv.onmousedown=function (ev)
  {
    var oEvent=ev||event;
    var disX=oEvent.clientX-oDiv.offsetLeft;
    var disY=oEvent.clientY-oDiv.offsetTop;
    document.onmousemove=function (ev)
    {
      var oEvent=ev||event;
      var l=oEvent.clientX-disX;
      var t=oEvent.clientY-disY;
      oDiv.style.left=l+'px';
      oDiv.style.top=t+'px';
      iSpeedX=l-lastX; //拖拽结束时的速度
      iSpeedY=t-lastY;
      lastX=l; //更新上一个点的位置
      lastY=t;
    };
    document.onmouseup=function ()
    {
      document.onmousemove=null;
      document.onmouseup=null;
      startMove(); //拖拽结束时执行
    };
    clearInterval(timer);
  };
};
var timer=null;
var iSpeedX=0;
var iSpeedY=0;
function startMove()
{
  clearInterval(timer);
  timer=setInterval(function (){
    var oDiv=document.getElementById('div1');
    iSpeedY+=3;
    var l=oDiv.offsetLeft+iSpeedX;
    var t=oDiv.offsetTop+iSpeedY;
    if(t>=document.documentElement.clientHeight-oDiv.offsetHeight)
    {
      iSpeedY*=-0.8;
      iSpeedX*=0.8;
      t=document.documentElement.clientHeight-oDiv.offsetHeight;
    }
    else if(t<=0)
    {
      iSpeedY*=-1;
      iSpeedX*=0.8;
      t=0;
    }
    if(l>=document.documentElement.clientWidth-oDiv.offsetWidth)
    {
      iSpeedX*=-0.8;
      l=document.documentElement.clientWidth-oDiv.offsetWidth;
    }
    else if(l<=0)
    {
      iSpeedX*=-0.8;
      l=0;
    }
    if(Math.abs(iSpeedX)<1)
    {
      iSpeedX=0;
    }
    if(Math.abs(iSpeedY)<1)
    {
      iSpeedY=0;
    }
    if(iSpeedX==0 && iSpeedY==0 && t==document.documentElement.clientHeight-oDiv.offsetHeight)
    {
      clearInterval(timer);
    }
    else
    {
      oDiv.style.left=l+'px';
      oDiv.style.top=t+'px';
    }
    document.title=iSpeedX;
  }, 30);
}

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用js判断用户浏览器是否是XP SP2的IE6
Mar 08 Javascript
Javascript 继承机制的实现
Aug 12 Javascript
js返回前一页刷新本页重载页面
Jul 29 Javascript
Egret引擎开发指南之发布项目
Sep 03 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
基于Bootstrap重置输入框内容按钮插件
May 12 Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 Javascript
JavaScript中this的全面解析及常见实例
May 14 Javascript
Vue中的transition封装组件的实现方法
Aug 13 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 Javascript
react antd表格中渲染一张或多张图片的实例
Oct 28 Javascript
介绍一下28个JS常用数组方法
May 06 Javascript
浅述节点的创建及常见功能的实现
Dec 15 #Javascript
Bootstrap整体框架之JavaScript插件架构
Dec 15 #Javascript
如何解决hover在ie6中的兼容性问题
Dec 15 #Javascript
Bootstrap整体框架之CSS12栅格系统
Dec 15 #Javascript
Bootstrap CSS布局之列表
Dec 15 #Javascript
BootStrap整体框架之基础布局组件
Dec 15 #Javascript
JS弹性运动实现方法分析
Dec 15 #Javascript
You might like
php读取msn上的用户信息类
2008/12/05 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
PHP7变量处理机制修改
2021/03/09 PHP
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
在AngularJS中使用jQuery的zTree插件的方法
2016/04/21 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
JS如何实现封装列表右滑动删除收藏按钮
2020/07/23 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[01:08:44]NB vs VP 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python selenium循环登陆网站的实现
2019/11/04 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
法制宣传标语集锦
2014/06/25 职场文书
黄河绝恋观后感
2015/06/08 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
JavaScript 反射学习技巧
2021/10/16 Javascript