Javascript摸拟自由落体与上抛运动原理与实现方法

//**************************************** //名称:Javascript摸拟自由落体与上抛运动! //作者:Gloot //邮箱:glootz@gmail.com // QQ:345268267 //网站: //操作:在页面不同地方点几下 //*************************************** var $ = function(el) { return document.getElementById(el); }; function LuoRun() { this.h = 0; this.s = 0; this.g = 9.8; this.isup = false; this.rh = 0; this.t = 0; this.timer = null; this.mt = 0; this.top = 0; this.left = 0; this.id = null; } LuoRun.prototype.Po = function(obj) { this.left += 0.3; obj.style.left = (this.left)+'px'; if (!this.isup) { if (this.t == 0) { this.top = obj.offsetTop; this.h = 570 - 22 - this.top; this.mt = Math.sqrt(2*this.h/(this.g*100)); //alert(mt+' '+isup+' '+t) } this.t+=0.01; if (this.t >= this.mt) { this.t = this.mt; this.rh = (1/2)*this.g*this.t*this.t*100; this.s = this.g*this.t*100; obj.style.top = (this.rh+this.top)+'px'; //t = 0; this.s = this.s-50>0 ? this.s-50 : 0; this.isup = true; this.t = 0; } else { this.rh = (1/2)*this.g*this.t*this.t*100; this.s = this.g*this.t*100; obj.style.top = (this.rh+this.top)+'px'; } } else { //up //return; if (this.s == 0) { clearInterval(this.timer); this.id.parentNode.removeChild(this.id); return; } if (this.t == 0) { this.h = this.s*this.s/(2*this.g*100); this.mt = this.s/(this.g*100); this.top = obj.offsetTop; //alert(mt+' '+isup+' '+t) } this.t+=0.01; if (this.t>=this.mt) { this.t = this.mt; this.rh = this.s*this.t - (1/2)*this.g*this.t*this.t*100; obj.style.top = (this.top - this.rh)+'px'; this.s = 0; this.isup = false; this.t = 0; }else { this.rh = this.s*this.t - (1/2)*this.g*this.t*this.t*100; obj.style.top = (this.top - this.rh)+'px'; } } } LuoRun.prototype.Go = function(obj) { var self = this; if (obj == null) obj = $('box'); self.timer = setInterval(function() { self.Po(obj); if (self.h<=0) { clearInterval(self.timer); self.id.parentNode.removeChild(self.id); } },10); } document.onmousedown = function(e) { e = e?e:window.event; var crtDiv = document.createElement('div'); crtDiv.style.position = 'absolute'; crtDiv.style.left = e.clientX + 'px'; crtDiv.style.top = e.clientY + 'px'; crtDiv.style.background = '#333'; crtDiv.style.width = '22px'; crtDiv.style.height = '22px'; document.body.appendChild(crtDiv); crtDiv.innerHTML = '&nbsp;'; var C = new LuoRun(); C.left = e.clientX; C.id = crtDiv; document.onmouseup = function() { document.onmousemove = null; window.setTimeout(function() { C.Go(crtDiv); },1000); } }

Css 样式

<style type="text/css"> td,body {font-size:12px;} .css1 {width:240px;display:table;position:absolute;left:20px;top:20px;border:1px solid green;background:#CAF4BD;line-height:18px;padding:3px;} .css2 {width:900px;height:22px;border-top:1px solid #333;position:absolute;top:570px;left:60px;} </style>

Body Html代码

<body> <form> <div> 名称:Javascript摸拟自由落体与上抛运动!<br /> 作者:Gloot<br /> 邮箱:glootz@gmail.com <br /> QQ:345268267 <br /> 网站: <br /> 操作:在页面不同地方点几下 </div> <div>&nbsp;</div> </form> </body>

代码说明

function JsFunc() { this.a = ""; this.b = ""; } JsFunc.prototype.method = function() { var me = this; me.a = "method"; } function init() { var func = new JsFunc(); func.method(); }

JsFunc 类当于一个(C#中的)类;

var func = new JsFunc();

相当于初始化了一个类,创建了一个对象;

this.a, this.b 相当于 类中的成员;

JsFunc.prototype.method 相当于创建这个类下的一个方法函数;

如果这个JsFunc 多次 new 操作的话,其下 this成员,将各自的运行操作,互不影响;

所以当 对 JsFunc new 后创建一个新对象时,对这对象的成员或方法进行 setTimeout, setInterval 操作话,就会产生类似于并行操作的效果;

function LuoRun() { this.h = 0; this.s = 0; this.g = 9.8; this.isup = false; this.rh = 0; this.t = 0; this.timer = null; this.mt = 0; this.top = 0; this.left = 0; this.id = null; }

this.s 表示速度;

this.h 表示设定的高度, 或物体上抛的最高高度;

this.isup 表示正处于上升还是下降状态;

this.rn 表示下降距当前顶的位移,或上抛距离初始速度位置的位移;

this.t  下降或上抛的时间;

this.mt 表示从某一高度落体至某一低点所用的时间,或以某一初始速度上抛至零速度所用的时间;

this.timer 表示定时器

this.top, this.left 表示物体相对于容器顶部及左边的当前偏移;

this.id 表示当前创建方块的对象id值;

LuoRun.prototype.Po = function(obj) { }

表示物休自由落体及上抛运动的方法;

this.left += 0.3; 表示物体每落体或上抛向左跳动的偏移量(像素);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/229513aa9d1f5c514c631566f652e380.html