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显示选择目录对话框的代码
Nov 10 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
jQuery简单实现遍历单选框的方法
Mar 06 Javascript
原生JS发送异步数据请求
Jun 08 Javascript
Vue 创建组件的两种方法小结(必看)
Feb 23 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
Apr 11 jQuery
vuex actions传递多参数的处理方法
Sep 18 Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 Javascript
js实现简易计算器小功能
Nov 18 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
javascript document.referrer 用法
2009/04/30 Javascript
js 小数取整的函数
2010/05/10 Javascript
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
python对数组进行反转的方法
2015/05/20 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
如何利用python发送邮件
2020/09/26 Python
泰国网上购物:Shopee泰国
2018/09/14 全球购物
25道Java面试题集合
2013/05/21 面试题
《乡愁》教学反思
2014/02/18 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
部队2015年终工作总结
2015/04/02 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技
Nginx 匹配方式
2022/05/15 Servers
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers