home *** CD-ROM | disk | FTP | other *** search
Wrap
// DynLayer Glide Methods // alternative DynLayer animation methods with an acceleration effect // 19990531 // Copyright (C) 1999 Dan Steinman // Distributed under the terms of the GNU Library General Public License // Available at http://www.dansteinman.com/dynapi/ function DynLayerGlideTo(startSpeed,endSpeed,endx,endy,angleinc,speed,fn) { if (endx==null) endx = this.x if (endy==null) endy = this.y var distx = endx-this.x var disty = endy-this.y this.glideStart(startSpeed,endSpeed,endx,endy,distx,disty,angleinc,speed,fn) } function DynLayerGlideBy(startSpeed,endSpeed,distx,disty,angleinc,speed,fn) { var endx = this.x + distx var endy = this.y + disty this.glideStart(startSpeed,endSpeed,endx,endy,distx,disty,angleinc,speed,fn) } function DynLayerGlideStart(startSpeed,endSpeed,endx,endy,distx,disty,angleinc,speed,fn) { if (this.glideActive) return if (endx==this.x) var slantangle = 90 else if (endy==this.y) var slantangle = 0 else var slantangle = Math.abs(Math.atan(disty/distx)*180/Math.PI) if (endx>=this.x) { if (endy>this.y) slantangle = 360-slantangle } else { if (endy>this.y) slantangle = 180+slantangle else slantangle = 180-slantangle } slantangle *= Math.PI/180 var amplitude = Math.sqrt(Math.pow(distx,2) + Math.pow(disty,2)) if (!fn) fn = null this.glideActive = true if (startSpeed == "fast") { if (endSpeed=="fast") this.glide(1,amplitude/2,0,90,this.x,this.y,slantangle,endx,endy,distx,disty,angleinc,speed,fn) else this.glide(0,amplitude,0,90,this.x,this.y,slantangle,endx,endy,distx,disty,angleinc,speed,fn) } else { if (endSpeed=="fast") this.glide(0,amplitude,-90,0,this.x+distx,this.y+disty,slantangle,endx,endy,distx,disty,angleinc,speed,fn) else this.glide(0,amplitude/2,-90,90,this.x+distx/2,this.y+disty/2,slantangle,endx,endy,distx,disty,angleinc,speed,fn) } } function DynLayerGlide(type,amplitude,angle,endangle,centerX,centerY,slantangle,endx,endy,distx,disty,angleinc,speed,fn) { if (angle < endangle && this.glideActive) { angle += angleinc var u = amplitude*Math.sin(angle*Math.PI/180) var x = centerX + u*Math.cos(slantangle) var y = centerY - u*Math.sin(slantangle) this.moveTo(x,y) this.onGlide() if (this.glideActive) setTimeout(this.obj+'.glide('+type+','+amplitude+','+angle+','+endangle+','+centerX+','+centerY+','+slantangle+','+endx+','+endy+','+distx+','+disty+','+angleinc+','+speed+',\''+fn+'\')',speed) else this.onGlideEnd() } else { if (type==1) this.glide(0,amplitude,-90,0,this.x+distx/2,this.y+disty/2,slantangle,endx,endy,distx,disty,angleinc,speed,fn) else { this.glideActive = false this.moveTo(endx,endy) this.onGlide() this.onGlideEnd() eval(fn) } } } DynLayerGlideInit = new Function() DynLayer.prototype.glideInit = new Function() DynLayer.prototype.glideTo = DynLayerGlideTo DynLayer.prototype.glideBy = DynLayerGlideBy DynLayer.prototype.glideStart = DynLayerGlideStart DynLayer.prototype.glide = DynLayerGlide DynLayer.prototype.onGlide = new Function() DynLayer.prototype.onGlideEnd = new Function()