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表格分页实现代码
Sep 18 Javascript
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
json中换行符的处理方法示例介绍
Jun 10 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
Vue.js父与子组件之间传参示例
Feb 28 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
Aug 16 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 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
JavaScript prototype属性深入介绍
2012/11/27 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
js实现微信聊天界面
2020/08/09 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Django时区详解
2019/07/24 Python
python @propert装饰器使用方法原理解析
2019/12/25 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
使用python实现名片管理系统
2020/06/18 Python
python list的index()和find()的实现
2020/11/16 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
新护士岗前培训制度
2014/02/02 职场文书
班干部演讲稿
2014/04/24 职场文书
解除财产保全担保书
2014/05/20 职场文书
质量安全标语
2014/06/07 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
师德师风自查总结
2014/10/14 职场文书
学期个人工作总结
2015/02/13 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫