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 相关文章推荐
Add a Formatted Table to a Word Document
Jun 15 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
js显示时间 js显示最后修改时间
Jan 02 Javascript
Javascript合并表格中具有相同内容单元格示例
Aug 11 Javascript
jquery序列化form表单使用ajax提交后处理返回的json数据
Mar 03 Javascript
一个不错的字符串转码解码函数(自写)
Jul 31 Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 Javascript
jQuery构造函数init参数分析
May 13 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
Feb 25 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
AngularJS中table表格基本操作示例
Oct 10 Javascript
JavaScript 跨域之POST实现方法
May 07 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时区转换转换函数
2014/01/07 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
PHP内置加密函数详解
2016/11/20 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
jquery UI 1.72 之datepicker
2009/12/29 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
python语言使用技巧分享
2016/05/31 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python内存管理实例分析
2019/07/10 Python
python写程序统计词频的方法
2019/07/29 Python
python程序文件扩展名知识点详解
2020/02/27 Python
win10安装python3.6的常见问题
2020/07/01 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
小学运动会口号
2014/06/07 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
2014年督导工作总结
2014/11/19 职场文书