Subversion Repositories wimsdev

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.         DynAPI Distribution
  3.         Glide Animation Extension
  4.  
  5.         The DynAPI Distribution is distributed under the terms of the GNU LGPL license.
  6.  
  7.         requires: dynapi.fx.Thread
  8. */
  9.  
  10. function GlideAnimation(x1,y1,x2,y2,angleinc,startSpeed,endSpeed) {
  11.         if (x2==null) x2 = x1;
  12.         if (y2==null) y2 = y1;
  13.                
  14.         var normAngle = dynapi.functions.getNormalizedAngle(x1,y1,x2,y2);
  15.         var distx = x2-x1;
  16.         var disty = y2-y1;
  17.         var distance = Math.sqrt(Math.pow(distx,2) + Math.pow(disty,2));
  18.         angleinc = (angleinc==null)? 7 : Math.abs(angleinc);
  19.        
  20.         // a terrible mess but it works
  21.         var r = 1;
  22.         if (startSpeed == "fast") {
  23.                 var centerX = x1;
  24.                 var centerY = y1;
  25.                 var centerX2 = x2;
  26.                 var centerY2 = y2;
  27.                 startAngle = 0;
  28.                 endAngle = 90;
  29.                 if (endSpeed=="fast") distance = distance/2;
  30.         }
  31.         else {
  32.                 startAngle = -90;
  33.                 endAngle = 0;
  34.                 if (endSpeed == "fast") {
  35.                         var centerX = x1+distx;
  36.                         var centerY = y1+disty;
  37.                 }
  38.                 else {  // default slow,slow
  39.                         var centerX2 = x2-distx/2;
  40.                         var centerY2 = y2-disty/2;
  41.                         distance = distance/2;
  42.                         var centerX = x1+distx/2;
  43.                         var centerY = y1+disty/2;
  44.                         r = -1;
  45.                 }
  46.         }
  47.  
  48.         var i,d,x,y,dx,dy,path=[];
  49.         for (var a=startAngle; a<endAngle; a+=angleinc) {
  50.                 i = path.length;
  51.                 d = distance*Math.sin(a*Math.PI/180);
  52.                 path[i] = Math.round(centerX + d*Math.cos(normAngle));
  53.                 path[i+1] = Math.round(centerY - d*Math.sin(normAngle));
  54.         }
  55.         if (startSpeed==endSpeed) {
  56.                 for (var a=endAngle; a<endAngle+90; a+=angleinc) {
  57.                         i = path.length;
  58.                         d = distance*Math.sin(a*Math.PI/180);
  59.                         path[i] = Math.round(centerX2 - r*d*Math.cos(normAngle));
  60.                         path[i+1] = Math.round(centerY2 + r*d*Math.sin(normAngle));
  61.                 }
  62.         }
  63.        
  64.         var l = path.length;
  65.         if (path[l-2] != x2 && path[l-1]!=y2) {
  66.                 path[l] = x2;
  67.                 path[l+1] = y2;
  68.         }
  69.         return path;
  70. };
  71.  
  72. DynLayer.prototype.glideStop = function () {
  73.         if (this._thread) this._thread.stop();
  74. };
  75. DynLayer.prototype.glideTo = function(x2,y2,angleinc,ms,startSpeed,endSpeed) {
  76.         if (this.x!=x2 || this.y!=y2) {
  77.                 if (!this._thread) this._thread = new Thread(this);
  78.                 if (ms) this._thread.interval = ms;
  79.                 this._thread.play(GlideAnimation(this.x,this.y,x2,y2,angleinc,startSpeed,endSpeed) );
  80.         }
  81. };