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表的模拟方法
Feb 05 Javascript
js实现div层缓慢收缩与展开的方法
May 11 Javascript
Jsonp post 跨域方案
Jul 06 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
用最少的JS代码写出贪吃蛇游戏
Jan 12 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
Jun 03 Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 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 at(@)符号的用法简介
2009/07/11 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
JavaScript中的this机制
2016/01/30 Javascript
js简单实现图片延迟加载的方法
2016/07/19 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
Python中SOAP项目的介绍及其在web开发中的应用
2015/04/14 Python
python requests 使用快速入门
2017/08/31 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
新闻专业个人求职信
2013/12/19 职场文书
建设工程授权委托书
2014/09/22 职场文书
卫生主题班会
2015/08/14 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技