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 相关文章推荐
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
Sep 26 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
提高jQuery性能优化的技巧
Aug 03 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
ES6新特性之变量和字符串用法示例
Apr 01 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
vue中子组件调用兄弟组件方法
Jul 06 Javascript
webpack自动打包和热更新的实现方法
Jun 24 Javascript
vue获取data数据改变前后的值方法
Nov 07 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
Dec 01 Javascript
Vue组件跨层级获取组件操作
Jul 27 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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
你应该知道的python列表去重方法
2017/01/17 Python
python样条插值的实现代码
2018/12/17 Python
Python如何调用外部系统命令
2019/08/07 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
基于Django实现日志记录报错信息
2019/12/17 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
参观监狱心得体会
2014/01/02 职场文书
销售演讲稿范文
2014/01/08 职场文书
户籍证明格式
2014/09/15 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android