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 相关文章推荐
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
使用JavaScript实现旋转的彩圈特效
Jun 23 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
JS代码实现百度地图 画圆 删除标注
Oct 12 Javascript
Bootstrap select下拉联动(jQuery cxselect)
Jan 04 Javascript
html5+canvas实现支持触屏的签名插件教程
May 08 Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
js抽奖转盘实现方法分析
May 16 Javascript
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
浅述节点的创建及常见功能的实现
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高手需要要掌握的知识点
2014/08/21 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
Python文件操作,open读写文件,追加文本内容实例
2016/12/14 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
关于css中margin的值和垂直外边距重叠问题
2020/10/27 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
汽车工程专业应届生求职信
2013/10/19 职场文书
行政主管岗位职责
2013/11/18 职场文书
前处理班长职位说明书
2014/03/01 职场文书
行政撤诉申请书
2015/05/18 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
vue实现登陆页面开发实践
2022/05/30 Vue.js