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 相关文章推荐
本地对象Array的原型扩展实现代码
Dec 04 Javascript
自动设置iframe大小的jQuery代码
Sep 11 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
两种JS实现屏蔽鼠标右键的方法
Aug 20 Javascript
学习JavaScript鼠标响应事件
Dec 25 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
Javascript使用uploadify来实现多文件上传
Nov 16 Javascript
javascript input输入框模糊提示功能的实现
Sep 25 Javascript
vue动态设置img的src路径实例
Sep 18 Javascript
详解react native页面间传递数据的几种方式
Nov 07 Javascript
Vue CLI3中使用compass normalize的方法
May 30 Javascript
JS this关键字在ajax中使用出现问题解决方案
Jul 17 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程序设计中的MVC编程思想
2014/07/28 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
2014/08/06 PHP
php学习笔记之基础知识
2014/11/08 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
围观tangram js库
2010/12/28 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
详解python基础之while循环及if判断
2017/08/24 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Python实现随机漫步功能
2018/07/09 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
网络技术支持面试题
2013/04/22 面试题
2015年学生会个人工作总结
2015/04/09 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
Python中如何处理常见报错
2022/01/18 Python